2010-11-11 53 views
0

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

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

保存'CreateWindow'的返回值比使用全局变量要好。 – 2010-11-11 22:56:19

+0

我将“!CreateWindow ...”部分更改为“!(win = CreateWindow ...)”,并从WM_CREATE中删除了“win = h”。行为没有变化:仍然没有味精盒。 – MrSparkly 2010-11-12 01:28:04

+0

您没有发布完整的WindowProc,或者其他代码片段丢失。 MessageBox包含一个几乎相同的GetMessage循环,所以它应该没有关系。 – 2010-11-12 15:17:34

回答

0

这听起来像你不立即从WM_CREATE像你应该回来了,但你的窗口的整个生命周期里面CreateWindow。所以MessageBox实际上并没有被调用,直到你的窗口已经死了,并且试图通过wnd作为消息框的父节点是一个无效的参数(该窗口不再存在)。

对于WM_CREATE,您不应该致电DefWindowProc。在WindowProc(例外:处理作为主窗口的子模式的模式对话框的消息循环)内不应该有消息循环(即DispatchMessage)。

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

+0

DefWindowProc位于开关块之外,不属于WM_CREATE(参见上文)。 WindowProc中没有DispatchMessage,它在WinMain中(参见上文)。我在“case WM_CREATE”块的末尾添加了“MessageBox(0,”Test create“,0,0)”,在“break”之前。在应用程序窗口出现之前,我看到“测试创建”信息框。这告诉我WM_CREATE完成了它的工作。 – MrSparkly 2010-11-12 01:23:16

+0

只是注意到:如果我从CreateWindow中删除了WS_VISIBLE标志,并且“ShowWindow(win,SW_SHOWNORMAL)”行(基本上,如果我创建了一个不可见的窗口),则会显示“测试”消息框。当我单击msg框上的确定时,我会看到一个无形的应用程序正在运行。所以这是阻止msg盒子的主窗口的可见性。 – MrSparkly 2010-11-12 03:25:39