Бесконечный цикл внутри getmessage (DispatchMessage(& msg); не работает)
Я создаю приложение кнопки, используя редактор ресурсов. После создания кнопки я пытаюсь сделать так:
m_hwndPreview = CreateDialogParam( g_hInst,MAKEINTRESOURCE(IDD_MAINDIALOG), m_hwndParent,(DLGPROC)DialogProc, (LPARAM)this);
if (m_hwndPreview == NULL)
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
MSG msg;
BOOL bRet;
while ( (bRet=GetMessage (& msg,0, 0,0)) != 0)
{// this msg always contains the data like -msg = {msg=0x0000c03e wp=0x0000000000000012//always 12 I don't know why ?? lp=0x0000000000000000}
if (bRet == -1)
{
bRet = HRESULT_FROM_WIN32(GetLastError());
MessageBox(NULL, L"Hurr i am the error",L"Error",MB_ICONERROR | MB_OK);
}
else if (!IsDialogMessage (m_hwndPreview, & msg))
{
TranslateMessage (&msg); //on debugging TranslateMessage = 0x000007feee615480 TranslateMessage
DispatchMessage(& msg ); //but show nothing when I put cursor on this method to know the value that means it's not called
MessageBox(NULL, L"there is no error in receiving before dispatch the message",L"Error",
MB_ICONERROR | MB_OK);//this messagebox repeats again and again after the call to DialogProc function and I am not able to come out of the loop and here I need to restart my PC
в другом месте я определяю функцию createialog следующим образом: // эта функция вызывается только для функции createDialogParam() . после этого элементы управления отправляются в getmessage, где все циклически повторяется.
BOOL CALLBACK AMEPreviewHandler::DialogProc(HWND m_hwndPreview, UINT Umsg, WPARAM wParam, LPARAM lParam)
{ //this dialogProc function is declares Static some where in the code otherwise the createdialogparam will give error DLGPROC is invalid conversion
//this Umsg alays creates strange value like 48 and 32 etc.. and Wparam contains a very big value like 12335423526 (I mean big and strange) and lparam contains 0.
switch(Umsg)
{
case WM_INITDIALOG:
{
MessageBox(NULL, L"Inside the WM_INITDIALOG function",L"Error",
MB_ICONERROR | MB_OK);
return TRUE;
}
break;
case WM_CREATE:
{
/////////////////
MessageBox(NULL, L"Inside the WM_CREATE",L"Error",
MB_ICONERROR | MB_OK);
/////////////////////////////////
}
break;
case WM_COMMAND:
{ //here are my two buttons created by me which should show messagebox on click
int ctl = LOWORD(wParam);
int event = HIWORD(wParam);//I don't know why this event is in blue colour .. but its not the pqrt of problem right now.
if (ctl == IDC_PREVIOUS && event == BN_CLICKED )
{
MessageBox(m_hwndPreview,L"Button Clicked is next inside WM_COMMAND ",L"BTN WND",MB_ICONINFORMATION);
return 0;
}
if (ctl == IDC_NEXT && event == BN_CLICKED )
{
MessageBox(m_hwndPreview,L"Button Clicked is previous inside WM_COMMAND",L"BTN WND",MB_ICONINFORMATION);
return 0;
}
return FALSE;
}break;
case WM_DESTROY:
{
////////////////::
MessageBox(NULL, L"Inside the WM_DESTROY",L"Error",
MB_ICONERROR | MB_OK);
//////////////////
PostQuitMessage(0);
return 0;
}
break;
case WM_CLOSE:
{
MessageBox(NULL, L"Inside the WM_CLOSE",L"Error",
MB_ICONERROR | MB_OK);
DestroyWindow (m_hwndPreview);
return TRUE;
}
break;
}
MessageBox(NULL, L"outside the DefWindowProc function",L"Error",
MB_ICONERROR | MB_OK);
return 0;
}
Возникающая проблема заключается в том, что когда я дебютирую, элемент управления сначала переходит к CreateDialogParam, а затем он переходит к getmessage, где элемент управления не выходит из цикла, вызывая проблему перезапуска. И у меня нет отображения кнопки и изображения на панели предварительного просмотра. То, что я ожидаю, если все пойдет хорошо, после отладки должно показывать изображение на панели предварительного просмотра, и у меня есть 2 кнопки "Далее" и "Предыдущий", но это показывает только пустое окно (кнопки и фотография, которые я уже создал с помощью редактора ресурсов.. Это верно, я уверен в этом) .. но я не знаю, почему я не выхожу из функции getmessage и dispatchmessage не вызывается (потому что я видел при отладке) .
2 ответа
Так что теперь вы можете попытаться прокомментировать код части getmessage, который, вероятно, исчезнет, если возникнет проблема, потому что вы создаете кнопку, используя IDD_MAINDIALOG, и ваш creatialogparam напрямую вызывает вашу функцию dailogproc, где вы получаете WM_COMMAND и которую вы обрабатываете своим кодом.
Ты должен написать
return true;
сразу после DispatchMessage(msg);
и затем отладить его и сообщить мне о результате отладки.