Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

6.3.1 Сообщение теста попадания

Если вы вели подсчет, то знаете, что мы рассмотрели 20 из 21 сообщения мыши. Последним сообщением является WM_NCHITTEST, означающее "тест попадания в нерабочую область" (nonclient hit-test). Это сообщение предшествует всем остальным сообщениям мыши рабочей и нерабочей области. Параметр lParam содержит значения х и у экранных координат положения мыши. Параметр wParam не используется.

В приложениях для Windows это сообщение обычно передается в DefWindowProc. В этом случае Windows использует сообщение WM_NCHITTEST для выработки всех остальных сообщений мыши на основе положения мыши. Для сообщений мыши нерабочей области возвращаемое значение функции DefWindowProc при обработке сообщения WM_NCHITTEST передается как параметр wParam в сообщении мыши. Это значение может быть любым из множества значений wParam, которое бывает у этого параметра для сообщений мыши нерабочей области, плюс следующие:

HTCLIENT Рабочая область

HTNOWHERE Нет ни на одном из окон

HTTRANSPARENT Окно перекрыто другим окном

HTERROR Заставляет DefWindowProc генерировать гудок

Если функция DefWindowProc после обработки сообщения WM_NCHITTEST возвращает значение HTCLIENT, то Windows преобразует экранные координаты в координаты рабочей области и вырабатывает сообщение мыши рабочей области.

Если вы вспомните, как мы запретили все системные функции клавиатуры при обработке сообщения WM_SYSKEYDOWN, то вы, наверное, удивитесь, если сможете сделать что-нибудь подобное, используя сообщения мыши. Действительно, если вы вставите строки:

case WM_NCHITTEST:

return(LRESULT) HTNOWHERE;

в вашу оконную процедуру, то вы полностью запретите все сообщения мыши рабочей и нерабочей области вашего окна. Кнопки мыши просто не будут работать до тех пор, пока мышь будет находиться где-либо внутри вашего окна, включая значок системного меню, кнопки минимизации, максимизации и закрытия окна.

6.3.2 Сообщения порождают сообщения

Windows использует сообщение WM_NCHITTEST для выработки всех остальных сообщений мыши. Идея сообщений, порождающих другие сообщения, характерна для Windows. Давайте рассмотрим ример. Если вы дважды щелкните мышью на значке системного меню Windows-программы, то программа завершится. Двойной щелчок генерирует серию сообщений WM_NCHITTEST. Поскольку мышь установлена над значком системного меню, то возвращаемым значением функции DefWindowProc является HTSYSMENU, и Windows ставит в очередь сообщение WM_NCLBUTTONDBLCLK с параметром wParam, равным HTSYSMENU.

Оконная процедура обычно передает это сообщение DefWindowProc. Когда функция DefWindowProc получает сообщение WM_NCLBUTTONDBLCLK с параметром wParam, равным HTSYSMENU, то она ставит в очередь сообщение WM_SYSCOMMAND с параметром wParam, равным SC_CLOSE. (Это сообщение WM_SYSCOMMAND также генерируется, когда пользователь выбирает в системном меню пункт Close.) Оконная процедура вновь передает это сообщение в DefWindowProc. DefWindowProc обрабатывает сообщение, отправляя оконной процедуре синхронное сообщение WM_CLOSE.

Если программе для своего завершения требуется получить от пользователя подтверждение, оконная процедура может обработать сообщение WM_CLOSE. В противном случае оконная процедура обрабатывает сообщение WM_CLOSE, вызывая функцию DestroyWindow. Помимо других действий, функция DestroyWindow посылает оконной процедуре синхронное сообщение WM_DESTROY. Обычно оконная процедура обрабатывает сообщение WM_DESTROY следующим образом:

case WM_DESTROY:

PostQuitMessage(0);

return 0;

Функция PostQuitMessage заставляет Windows поместить в очередь сообщений сообщение WM_QUIT. До оконной процедуры это сообщение никогда не доходит, поскольку оно является причиной того, что функция GetMessage возвращает 0, что вызывает завершение цикла обработки сообщений и программы в целом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]