开发者

Win32/C can't display msg box right after CreateWindow

开发者 https://www.devze.com 2023-01-24 09:44 出处:网络
I\'m creating my app window in code and I\'m trying to show a message box as soon as the window exists. But I can\'t. I see only the newly created window, no msg box. If I quit the app by closing its

I'm creating my app window in code and I'm trying to show a message box as soon as the window exists. But I can't. I see only the newly created window, no msg box. If I quit the app by closing its w开发者_运维问答indow, the msg box suddenly appears, as if it were waiting in some queue, to be shown only when the app window is closed. Does the way I create the window somehow block modal msg boxes? Note: the MessageBox line is there just for testing. I'll take it out for normal use, as it would obviously interfere with the GetMessage loop.

//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);
}


It sounds like you're not returning immediately from WM_CREATE like you're supposed to, but your window's entire lifetime is inside CreateWindow. So MessageBox doesn't actually get called until your window is dead, and trying to pass wnd as the parent of the message box is an invalid argument (the window no longer exists).

You shouldn't call DefWindowProc for WM_CREATE. You shouldn't have a message loop (i.e. DispatchMessage) inside WindowProc (exception: a message loop handling a modal dialog that is a child of the main window).

Re-entrancy of window procedures is something to avoid if possible.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号