2010-11-29 45 views
5

我被困在一个奇怪的问题。我在VC++ 2008中创建了一个Win32应用程序,当调用MessageBox时,使得一个类可以封装大部分工作,以便于重复。消息框`创建(我认为),但不显示,除非我按Alt键!Win32 MessageBox没有出现

发生什么事究竟是:

  1. 我运行程序

  2. 按Enter键

  3. 主窗口失去焦点

  4. 给蜂鸣声时,我就点击主窗口就好像模态消息框一样

  5. 或者按下Escape ...获得焦点或者按Alt,然后按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终于让我找到这个问题的解决方案......并为大家造福问题在WM_PAINT消息是的WndProc(......)我在里面写了一些代码,并删除所有的代码以及BeginPaint和EndPaint函数,所以当程序包括那个MessageBox时,程序进入一个冻结期,但它只显示当我按下Alt时,我认为控制权转移到系统中,显示系统菜单(我认为)

该解决方案要么删除WM_PAINT消息处理程序或添加正常的BeginPaint和EndPaint函数

感谢大家谁对我的问题通过

2

当您创建的MessageBox,你应该在CreateWindowEx通过WS_CHILD
编辑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);解决了它。