Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi Win32/C can';t在CreateWindow之后显示消息框_Winapi_Window_Modal Dialog_Messagebox - Fatal编程技术网

Winapi Win32/C can';t在CreateWindow之后显示消息框

Winapi Win32/C can';t在CreateWindow之后显示消息框,winapi,window,modal-dialog,messagebox,Winapi,Window,Modal Dialog,Messagebox,我正在用代码创建我的应用程序窗口,并尝试在窗口存在时立即显示一个消息框。但我不能。我只看到新创建的窗口,没有消息框。如果我关闭应用程序窗口退出应用程序,消息框会突然出现,好像它正在某个队列中等待,只有在应用程序窗口关闭时才会显示。我创建窗口的方式是否会阻止模态消息框?注意:MessageBox行仅用于测试。我会将其取出以供正常使用,因为它显然会干扰GetMessage循环 //start relevant section of WinMain: WNDCLASS wc={0}; wc.lpfnW

我正在用代码创建我的应用程序窗口,并尝试在窗口存在时立即显示一个消息框。但我不能。我只看到新创建的窗口,没有消息框。如果我关闭应用程序窗口退出应用程序,消息框会突然出现,好像它正在某个队列中等待,只有在应用程序窗口关闭时才会显示。我创建窗口的方式是否会阻止模态消息框?注意: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);
}

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

您不应该为
WM\u CREATE
调用
DefWindowProc
。在
WindowProc
中不应该有消息循环(即
DispatchMessage
)(例外:处理作为主窗口子窗口的模式对话框的消息循环)


如果可能的话,可以避免重新进入窗口过程。

保存
CreateWindow
的返回值比使用全局变量要好。我将“!CreateWindow…”部分更改为“!(win=CreateWindow…”,并从WM_CREATE中删除了“win=h”。行为没有改变:仍然没有消息框。您没有发布完整的WindowProc,或者缺少一些其他代码。MessageBox包含一个几乎完全相同的GetMessage循环,所以这不重要。逐行检查WindowProc,最终找到了罪魁祸首。3行:case WM_PAINT:返回0;打破过去实验的残余物。我天真地认为“return0”只会跳过WM_画图块(比如注释掉它),但它当然不会。它的意思是:当你收到WM_绘画信息时,什么也不做。当然,这会把窗口显示搞砸。如果我认为这可能与问题有关,我会把它包括在这里。再说一次,如果我知道这是个问题,我会把它拿出来,一开始就不会打扰别人。强迫我重新分析WindowProc.DefWindowProc的Thx在开关块之外,而不是WM_CREATE的一部分(见上文)。WindowProc中没有DispatchMessage,它在WinMain中(见上文)。我刚刚在“casewm_create”块的末尾添加了“MessageBox(0,“testcreate”,0,0)”,就在“break”之前。在应用程序窗口出现之前,我看到“测试创建”消息框。这告诉我WM_CREATE完成了它的工作。刚刚注意到:如果我从CreateWindow和“ShowWindow(win,SW_SHOWNORMAL)”行中删除WS_VISIBLE标志(基本上,如果我创建了一个不可见的窗口),那么“Test”消息框就会出现。当我在消息框上单击OK时,我看到一个不可见的应用程序正在运行。因此,是主窗口的可见性阻止了消息框。