Win32 / C无法在CreateWindow之后立即显示msg框

时间:2010-11-11 19:26:36

标签: winapi window modal-dialog messagebox

我正在使用代码创建我的应用程序窗口,并且一旦窗口存在,我就会尝试显示一个消息框。但我不能。我只看到新创建的窗口,没有msg框。如果我通过关闭其窗口退出应用程序,msg框突然出现,好像它在某个队列中等待,只有在应用程序窗口关闭时才会显示。我创建窗口的方式是否会以某种方式阻止模态消息框?注意:MessageBox行仅用于测试。我会把它拿出来正常使用,因为它显然会干扰GetMessage循环。

//start relevant section of WinMain:
WNDCLASS wc={0};
wc.lpfnWndProc = WindowProc;
...
if (!RegisterClass(&wc) || !CreateWindow("mc", "mc", WS_POPUPWINDOW|WS_CAPTION|WS_VISIBLE, 100, 50, 100, 100, NULL, NULL, hInstance, NULL)) {
  Error("Can't create window");
  return 0;
}
ShowWindow(win, SW_SHOWNORMAL);
MessageBox(0, "Test", 0 ,0);
while (GetMessage(&msg,NULL,0,0)>0) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
//end relevant section of WinMain

long FAR PASCAL WindowProc(HWND h, UINT m, WPARAM wParam, LPARAM l)
{
    switch (m) {
        //process other messages
        case WM_CREATE:
            win=h;
            //init stuff, paint something in the main window
        break;
    }
    return DefWindowProc(h, m, wParam, l);
}

1 个答案:

答案 0 :(得分:0)

听起来你并没有像你应该的那样立即从WM_CREATE返回,但是你的窗口的整个生命周期都在CreateWindow内。因此,在窗口停止之前,MessageBox实际上不会被调用,并且尝试传递wnd作为消息框的父级是无效参数(窗口不再存在)。

您不应为DefWindowProc致电WM_CREATE。你不应该在DispatchMessage内部有一个消息循环(即WindowProc)(例外:处理作为主窗口子节点的模态对话框的消息循环)。

如果可能的话,可以避免重复使用窗口程序。