Закрытие окна

Когда пользователь закрывает окно, это действие активирует последовательность сообщений окна.

Пользователь может закрыть окно приложения, нажав кнопку "Закрыть " или нажав сочетание клавиш, например ALT+F4. Любое из этих действий приводит к тому, что окно получит сообщение WM_CLOSE . Сообщение WM_CLOSE дает возможность запрашивать пользователя перед закрытием окна. Если вы действительно хотите закрыть окно, вызовите функцию DestroyWindow . В противном случае просто верните ноль из сообщения WM_CLOSE , и операционная система будет игнорировать сообщение и не уничтожать окно.

Ниже приведен пример того, как программа может обрабатывать WM_CLOSE.

case WM_CLOSE:
    if (MessageBox(hwnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK)
    {
        DestroyWindow(hwnd);
    }
    // Else: User canceled. Do nothing.
    return 0;

В этом примере функция MessageBox отображает модальное диалоговое окно, содержащее кнопки "ОК " и "Отмена ". Если пользователь нажимает кнопку "ОК", программа вызывает DestroyWindow. В противном случае, если пользователь нажимает кнопку "Отмена", вызов DestroyWindow пропускается, а окно остается открытым. В любом случае верните ноль, чтобы указать, что вы обрабатывали сообщение.

Если вы хотите закрыть окно без запроса пользователя, можно просто вызвать DestroyWindow без вызова MessageBox. Однако в этом случае существует ярлык. Напомним, что DefWindowProc выполняет действие по умолчанию для любого сообщения окна. В случае WM_CLOSEDefWindowProc автоматически вызывает DestroyWindow. Это означает, что если вы игнорируете сообщение WM_CLOSE в инструкции switch , окно уничтожается по умолчанию.

Когда окно будет уничтожено, оно получает сообщение WM_DESTROY . Это сообщение отправляется после удаления окна с экрана, но перед уничтожением (в частности, до уничтожения дочерних окон).

В главном окне приложения обычно вы будете отвечать на WM_DESTROY путем вызова PostQuitMessage.

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

Мы видели в разделе "Сообщения окна" , что PostQuitMessage помещает WM_QUIT сообщение в очередь сообщений, что приводит к завершению цикла сообщений.

Ниже приведена блок-схема, показывающая типичный способ обработки сообщений WM_CLOSE и WM_DESTROY :

flow chart showing how to handle wm-close and wm-destroy messages

Следующая

Управление состоянием приложения