为什么DestroyWindow会关闭我的应用程序?

3

我创建了一个窗口,但是调用其句柄上的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中的多重采样。

谢谢。


你检查过 hWndfakehandle 是否不同了吗? - ChrisF
是的,根据调试器它们是不同的。 - jmasterx
我并不是要批评你,因为我相信你也有充分的理由。我只是想了解一下,为什么你会开发一个Petzold风格的Windows应用程序呢? - Kevin Le - Khnle
3
我不想怀疑发布者,但是如果该应用程序完全使用OpenGL,那么除了简单的Win32之外,任何更聪明的东西都是过度的。你只需要一个HWND(在每个“WM_PAINT”上验证更新矩形并在“WM_CLOSE”上发送退出消息),以及一个轮询消息循环。一旦你掌握了那些,就可以放心使用,不再需要考虑其他复杂的事情,因为这可能会引入额外的依赖项或使整体变得更加困难。 - please delete me
2
纯Win32代码可能比使用MFC更易读。 - Lothar
4个回答

5

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()函数,它将关闭您的应用程序,因为该函数将终止消息循环。


5

我刚找到这条评论:

如果指定的窗口是父窗口或拥有者窗口,DestroyWindow在销毁父窗口或拥有者窗口时自动销毁相关的子窗口或拥有的窗口。该函数首先销毁子窗口或拥有的窗口,然后销毁父窗口或拥有者窗口。

DestroyWindow MSDN页面上发现了这个评论。

这对你的问题是否有影响呢?您是否在//some code中设置了hWnd的父级?


2
我怀疑在“fakehandle”窗口的最后第四个参数中指定父窗口(而不是NULL)可能会有所帮助。
另外,您可以检查一下这句话是否适用于您的情况:“如果要销毁的窗口是一个没有WS_EX_NOPARENTNOTIFY样式的子窗口,则会向其父窗口发送WM_PARENTNOTIFY消息。”(来自:msdn.microsoft.com

2
szWindowClass 所指的类在收到 WM_CLOSE 或者 WM_DESTROY 消息时是否会调用 PostQuitMessage?这个应该可以在消息循环第一次运行时解决。但如果您使用调试器,那么您肯定会注意到这个问题吧?
无论如何,对于您的简单窗口,为了获得最佳效果,您需要一个带有简单 WndProc 的第二个窗口类。(我认为 DefWindowProc 可以适用。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接