我在创建主窗口之后创建了一个窗口,但在其句柄上调用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 :(得分:4)
我刚发现这条评论:
如果指定的窗口是父窗口或所有者窗口,则DestroyWindow会在销毁父窗口或所有者窗口时自动销毁关联的子窗口或拥有的窗口。该函数首先销毁子窗口或拥有窗口,然后它会破坏父窗口或所有者窗口。
on the DestroyWindow
MSDN page。
这会对您的问题产生影响吗?您可以设置hWnd
的父级//some code
吗?
答案 1 :(得分:4)
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()将终止消息循环。
答案 2 :(得分:2)
我怀疑为“伪手柄”窗口而不是NULL指定父级(从末尾开始的第四个参数)可能会有所帮助。
此外,您可以检查此引号是否“如果正在销毁的窗口是没有WS_EX_NOPARENTNOTIFY样式的子窗口,则会向父级发送WM_PARENTNOTIFY消息。” (来自:msdn.microsoft.com)适用于您的案例。
答案 3 :(得分:2)
szWindowClass
在收到PostQuitMessage
或WM_CLOSE
后致电WM_DESTROY
,是否提及该课程?我认为这会阻止你的消息循环第一次。 (但是如果你正在使用调试器,可能你已经发现了这个?)
无论如何,对于你的哑窗,为了获得最佳效果,你需要第二个带有哑巴WndProc的窗口类。 (我认为DefWindowProc
是合适的。)