Почему DestroyWindow закрывает мое приложение? - PullRequest
1 голос
/ 26 мая 2010

Я создал окно после создания основного, но вызов 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.

Спасибо

Ответы [ 4 ]

4 голосов
/ 26 мая 2010

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 () завершит цикл обработки сообщений.

4 голосов
/ 26 мая 2010

Я только что нашел этот комментарий:

Если указанное окно является родительским или оконным владельцем, DestroyWindow автоматически уничтожает связанный дочерний или принадлежащий ему окно, когда оно разрушает родительское или родительское окно. Функция сначала уничтожает дочерние или собственные окна, а затем разрушает родительское или родительское окно.

на странице DestroyWindow MSDN .

Может ли это иметь какое-то отношение к вашей проблеме? Не могли бы вы установить родителя hWnd там, где у вас есть //some code?

2 голосов
/ 26 мая 2010

Класс, на который ссылается szWindowClass, вызывает PostQuitMessage при получении WM_CLOSE или WM_DESTROY? Я думаю, это остановит ваш цикл сообщений в первый раз. (Но если вы используете отладчик, возможно, вы бы это заметили?)

В любом случае, для вашего тупого окна, для лучших результатов вам понадобится второй класс окна с тупым WndProc. (Я думаю, что DefWindowProc подойдет.)

2 голосов
/ 26 мая 2010

Я подозреваю, что указание родителя (четвертый параметр от конца) для окна "fakehandle" вместо NULL может помочь.

Кроме того, вы можете проверить, является ли эта цитата «Если разрушаемое окно является дочерним окном, у которого нет стиля WS_EX_NOPARENTNOTIFY, сообщение WM_PARENTNOTIFY отправляется родителю». (От: msdn.microsoft.com ) относится к вашему делу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...