2010-05-25 87 views
1

我在创建主窗口后创建了一个窗口,但在其句柄上调用DestroyWindow关闭了整个应用程序,我该如何摆脱它?为什么DestroyWindow关闭我的应用程序?

它看起来像这样:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    HWND fakehandle; 


    hInst = hInstance; // Store instance handle in our global variable 

    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_EX_LAYERED, 
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

    fakehandle = CreateWindow(szWindowClass, "FAKE WINDOW", WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

    if (!hWnd || !fakehandle) 
    { 
     return FALSE; 
    } 
//some code 
    DestroyWindow(fakehandle); 


    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    return TRUE; 
} 

我怎么能摧毁这个窗口不会破坏我的主吗?我正在创建一个虚拟窗口来检查OpenGL中的多重采样。

感谢

+0

你是否检查过“hWnd”和“fakehandle”是不同的? – ChrisF 2010-05-25 21:29:38

+0

是的,他们是不同的根据调试... – jmasterx 2010-05-25 21:30:09

+0

不要故意批评你,因为我相信你也有一个很好的理由。 Justo想要了解为什么要开发一个Windows应用Petzold风格? – 2010-05-25 21:38:26

回答

4

我刚刚发现了这个评论:

如果指定的窗口是父母或所有者窗口,当DestroyWindow而它破坏了父母或所有者窗口自动销毁相关的儿童或拥有的窗口。该函数首先销毁子窗口或拥有的窗口,然后销毁父窗口或所有者窗口。

on the DestroyWindow MSDN page

这可能对您的问题有一些影响?你可以设置hWnd的父母,你有//some code

2

我怀疑指定的父(从末四PARAM)的“fakehandle”窗口,而不是NULL,可能会有帮助。

此外,您可能会检查是否引用此引用“如果被销毁的窗口是没有WS_EX_NOPARENTNOTIFY样式的子窗口,则会向父级发送WM_PARENTNOTIFY消息。” (来自:msdn.microsoft.com)适用于您的案例。

2

在收到WM_CLOSEWM_DESTROY后,szWindowClass提及PostQuitMessage所指的等级?这应该会在第一时间停止你的消息循环,我应该想。 (但是如果你使用的是调试器,大概你已经发现了这个?)

在任何情况下,为了达到最佳效果,你需要第二个带有哑WndProc的窗口类。 (我认为DefWindowProc将是合适的。)

3

DestroyWindow()发送WM_DESTROY到有问题的窗口。如果WndProc将WM_DESTROY传递给DefWindowProc(),那么DefWindowProc()将会终止你的应用程序。

因此,在你的WndProc中,为WM_DESTROY创建一个处理程序(如果你还没有的话),并检查窗口句柄。你应该能够区分这两者并从那里采取行动。

// assuming you have the two window handles as hwnd1 and hwnd2 
case WM_DESTROY: 
    if(hwnd == hwnd1) { 
     // this will kill the app 
     PostQuitMessage(0); 
    } else if(hwnd == hwnd2) { 
     // chucking WM_DESTROY on the floor 
     // means this window will just close, 
     // and the other one will stay up. 
     return; 
    } 
    break; 

请注意,如果你代表要么窗口做PostQuitMessage(),它会记下你的应用程序,因为PostQuitMessage()将终止消息循环。

相关问题