бесконечный цикл внутри 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

в каком-то другом месте я определяю функцию createdialog следующим образом: // эта функция вызывается только в функции 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 (потому что видел на отладке).


person Sss    schedule 17.07.2013    source источник
comment
Наконец-то сделал это... Только что прокомментировал часть функции GetMessage, и она работала нормально... Я до сих пор не мог правильно понять, для чего здесь используется функция GetMessage.   -  person Sss    schedule 17.07.2013


Ответы (2)


так что теперь вы можете попытаться прокомментировать код части getmessage, который, вероятно, возникнет, если возникнет проблема, потому что вы создаете кнопку с помощью IDD_MAINDIALOG, а ваш createdialogparam напрямую вызывает вашу функцию dailogproc, где вы получаете WM_COMMAND и который вы обрабатываете своим кодом позади.

person Community    schedule 18.07.2013

ты должен написать

return true;

сразу после DispatchMessage(msg);

и отладьте его и сообщите мне о результате отладки.

person Community    schedule 18.07.2013
comment
да, это действительно сработало. Теперь я вышел из цикла, но результат все еще не такой, как хотелось бы... - person Sss; 18.07.2013