2010-11-29 2 views
5

У меня возникла странная проблема. Я делаю приложение Win32 в VC++ 2008, создавая класс для инкапсуляции большей части работы для легкого повторения при вызове MessageBox. Ящик сообщения создается (я думаю), но не появляется, если не нажимать клавишу Alt!Win32 MessageBox не отображается

Что произойдет именно:

  1. Я запустить программу

  2. нажмите Enter

  3. главное окно теряет фокус

  4. дать звуковой сигнал, когда я нажимаю на главное окно, как будто имеется модальный MessageBox

  5. либо нажмите Escape ... фокус получен ИЛИ нажмите Alt, тогда появляется MessageBox с нажатой клавишей alt (т. меню упадет) !!!!!!

P.S. Он работал нормально, но это случилось внезапно. Я не нашел никакой разницы - я даже сделал новый проект!

Предполагается, что это основная программа:

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int  nCmdShow) 
{ 
    MSG msg; 
    CWnd cMainWindow(TEXT("DentoMan"), TEXT("Bejkoman")); // pass The class name and window name to the constructor 

    cMainWindow.CreateDef(); //Create the Window 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return (int)msg.wParam; 
} 

Хотя это файл класса

CWnd::CWnd() { 
}; 

CWnd::CWnd(LPTSTR lpszClassName, LPTSTR lpszWindowName) { 
    CWnd::lpszClassName  = lpszClassName; 
    CWnd::lpszWindowName = lpszWindowName; 
}; 

CWnd::~CWnd() { 
}; 

// Create the window with default parameters 
HWND CWnd::CreateDef(void) { 
    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX); 

    wcex.style   = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = StaticWndProc; 
    wcex.cbClsExtra  = 0; 
    wcex.cbWndExtra  = 0; 
    wcex.hInstance  = (HINSTANCE)GetModuleHandle(NULL); 
    wcex.hIcon   = 0; 
    wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 4); 
    wcex.lpszMenuName = 0; 
    wcex.lpszClassName = lpszClassName; 
    wcex.hIconSm  = 0; 

    RegisterClassEx(&wcex); 
    g_hWnd = CreateWindowEx(0,lpszClassName, lpszWindowName, WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, wcex.hInstance, this); 
    hInst = wcex.hInstance; //Store hInstance in the class hInst variable 

    if (!g_hWnd) return false; 
    ShowWindow(g_hWnd, SW_SHOW); 
    UpdateWindow(g_hWnd); 

    return g_hWnd; 
} 

LRESULT CALLBACK CWnd::StaticWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
    /* The Only Message we take here so we store the 'this' pointer within the window to identify messages 
    comming from it by the 'this' pointer*/ 
    if (Message == WM_CREATE) { 
     SetWindowLong(hWnd, GWL_USERDATA, (LONG)((CREATESTRUCT FAR *)lParam)->lpCreateParams); 
    } 

    /* Store the window pointer in the class pointer we just created in order to run the right public WndPRoc */ 
    CWnd *Destination = (CWnd*)GetWindowLong(hWnd, GWL_USERDATA); 

    // If the hWnd has a related class, pass it through 
    if (Destination) { 
     return Destination->WndProc(hWnd, Message, wParam, lParam); 
    } 

    // No destination found, defer to system... 
    return DefWindowProc(hWnd, Message, wParam, lParam); 
}; 

LRESULT CWnd::WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
    // Determine message type 
    switch (Message) { 
     case WM_LBUTTONDOWN: 
      { 
       /* this is a common trick for easy dragging of the window.this message fools windows telling that the user is 
       actually dragging the application caption bar.*/ 
       SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION,NULL); 
       break; 
      } 

     /*case WM_CREATE: 
      break; 
    */ 

     case WM_CLOSE: 
      PostQuitMessage(0); 
      break; 

     case WM_DESTROY: 
      UnregisterClass(lpszClassName, hInst); 
      PostQuitMessage(0); 
      break; 

     case WM_KEYDOWN: //KeyBoard keys 
      // Which key was pressed? 
      switch (wParam) { 
       case VK_ESCAPE: //close through escape key 
        PostQuitMessage(0); 
        return 0; 
       case VK_RETURN: 
        MessageBox(hWnd, TEXT("DFGDGD"), TEXT("DFGDFG"), NULL); 
        return 0; 
      } // End Switch 

      break; 

     case WM_COMMAND: 
      /*switch(LOWORD(wParam)) 
     { 
     }*/ 
     break; 

     case WM_PAINT: 
      break; 

     default: 
      return DefWindowProc(hWnd, Message, wParam, lParam); 

    } // End Message Switch 

return 0; 
}; 

Класс Заголовок:

class CWnd { 
    public: 
     CWnd(); 
     CWnd(LPTSTR lpszClassName, LPTSTR lpszWindowName); 
     virtual ~CWnd(); 
     virtual HWND CreateDef(void);   // Create the window with default parameters 
     virtual LRESULT  WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); 

    private: 
     static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); 
     HWND  g_hWnd;  //Global window handle for this window 
     HINSTANCE hInst;  //Global instance for this window 

     LPTSTR   lpszClassName; 
     LPTSTR   lpszWindowName; 
}; 

P.S. Я включил все необходимые файлы заголовков, все идет хорошо, за исключением MessageBox

Это также ссылку на код на here

+2

Отправьте соответствующий код здесь. Кроме того, снимок в темноте: укажите родительское окно при отображении окна сообщения. – 2010-11-29 00:12:05

+4

Отредактировано, ссылка удалена. Не размещайте небезопасные файлы .exe .. Просто вставьте соответствующий код. – Ruel 2010-11-29 00:13:46

ответ

8

Ohhhhhhh наконец я нашел решение этой проблемы ... и для всех, чтобы принести пользу проблема была в WndProc (.......) на WM_PAINT сообщении я написал код в нем и удален весь код вместе с функциями BeginPaint и EndPaint, поэтому программа вводит период замораживания, когда что-то нарисовано над ним, включая этот MessageBox, но он отображается только тогда, когда я нажимаю Alt, я думаю, что управление передается в систему на этом шаге, чтобы показать система меню (я думаю)

решения либо удалить обработчик WM_PAINT сообщения или добавить нормальный BeginPaint и EndPaint ФУНКЦИИ

Спасибо всем, кто прошли на мой вопрос

2

При создании MessageBox вы должны пройти WS_CHILD в CreateWindowEx.
EDIT 2:
Хорошо попробуйте это.

MessageBox(hWnd, TEXT("DFGDGD"), TEXT("DFGDFG"), MB_OK); 
3

Если кто-то еще интересно, этот метод работает:

MessageBox(NULL,L"error",L"Error",MB_ICONERROR|MB_DEFAULT_DESKTOP_ONLY); 
2

У меня была аналогичная проблема, которая была причиной по WM_PAINT как упоминалось выше, кто-то.Выбрал его, добавив return DefWindowProc(hWnd, Message, wParam, lParam);.

Смежные вопросы