Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Когда пользователь закрывает окно, это действие активирует последовательность сообщений окна.
Пользователь может закрыть окно приложения, нажав кнопку Закрыть или с помощью сочетания клавиш, например 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 отображает модальное диалоговое окно, содержащее кнопки OK и кнопки отмены . Если пользователь нажимает кнопку ОК, программа вызывает DestroyWindow. В противном случае, если пользователь нажимает Cancel, вызов DestroyWindow пропускается, а окно остается открытым. В любом случае верните ноль, чтобы указать, что вы обрабатывали сообщение.
Если вы хотите закрыть окно без запроса пользователя, можно просто вызвать DestroyWindow без вызова MessageBox. Однако в этом случае есть кратчайший путь. Помните, что DefWindowProc выполняет действие по умолчанию для любого сообщения окна. В случае WM_CLOSEDefWindowProc автоматически вызывает DestroyWindow. Это означает, что если вы игнорируете сообщение WM_CLOSE в инструкции переключателя, окно уничтожается по умолчанию.
Когда окно будет уничтожено, оно получает сообщение WM_DESTROY. Это сообщение отправляется после удаления окна с экрана, но до того, как происходит разрушение (в частности, до уничтожения всех дочерних окон).
В главном окне приложения обычно вы будете отвечать на WM_DESTROY путем вызова PostQuitMessage.
case WM_DESTROY:
PostQuitMessage(0);
return 0;
Мы видели в разделе "Сообщения окна", что PostQuitMessage помещает сообщение WM_QUIT в очередь сообщений, что приводит к завершению цикла сообщений.
Ниже приведена блок-диаграмма, показывающая типичный способ обработки WM_CLOSE и WM_DESTROY сообщений: