Главная » Win32 API » Обработка сообщений от мыши

0

Определить наличие мыши в системе можно с помощью функции
GetSystemMetrics, передав ей в качестве параметра значение
SM_MOUSEPRESENT. Если мышь есть, эта функция возвращает не­
нулевое значение. Для определения количества кнопок мыши можно
использовать        вызов        GetSystemMetrics   с        параметром

SMCMOUSEBUTTONS.

Когда пользователь перемещает мышь, Windows перемещает по эк­рану растровую картинку, которая называется курсор мыши (mouse cursor). Курсор мыши имеет вершину (hot spot) размером в один пик­сель, точно указывающий положение мыши на экране.

Ресурсы Windows содержат несколько курсоров мыши, которые могут использоваться в приложениях. Наиболее типичным курсором является наклонная стрелка, которая называется IDCARROW (вер­шина курсора острие стрелки). Курсор, в виде перекрестья (IDCCROSS) имеет горячую точку в центре крестообразного шабло­на. Курсор IDCWAIT в виде песочных часов обычно используется для индикации того, что программа чем-то занята.

Кнопки трехкнопочной мыши обозначаются аббревиатурами LBUTTON, MBUTTON и RBUTTON.

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

WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN -однократное нажатие левой, средней или правой кнопки, WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP отпускание левой, средней или правой кнопки, WMLBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK двойной щелчок ле­вой, средней или правой кнопки.

Для всех этих сообщений значение параметра lParam содержит по­ложение мыши, причем в младшем слове находится значение коорди­наты X, а в старшем слове — значение координаты Y от левого верх­него угла клиентской области окна. Эти значения можно извлечь из lParam при помощи макросов LOWORD и HI WORD. Значение пара­метра wParam показывает состояние кнопок мыши и клавиш Shift и Ctrl. Можно проверить параметр wParam с помощью битовых масок, определенных в заголовочных файлах:

MKLBUTTON левая кнопка нажата.

MKRBUTTON правая кнопка нажата.

MKMBUTTON средняя кнопка нажата.

MKSHIFT клавиша Shift нажата.

MKCONTROL клавиша Ctrl нажата.

Состояние кнопок мыши или клавиш Shift и Ctrl можно получить также с помощью функции GetKeyState.

При обработке двойного щелчка мыши следует отметить, что окно будет получать сообщения о двойном щелчке только если стиль соот­ветствующего класса окна содержит флаг CSDBLCLKS. Поэтому пе­ред регистрацией класса окна нужно присвоить полю style структуры WNDCLASS значение, включающее этот флаг.

Для мыши с колесом при нажатии на колесо Windows генерирует такие же сообщения, какие вырабатываются при нажатии средней кнопки трехкнопочной мыши. Прокрутка колеса приводит к генерации сообщения WMMOUSEWHEEL. Если нужно обработать прокрутку колеса, то рекомендуется подключить файл ztnouse.h. Младшая часть параметра wParam сообщения WMMOUSEWHEEL показывает со­стояние кнопок и клавиш Shift и Ctrl. Старшая часть wParam содержит значение, отображающее расстояние, пройденное колесом. Оно рас­считывается как количество шагов колеса при прокрутке, умноженное на коэффициент WHEELDELTA. В файле zmouse.h этот коэффициент равен 120.

В Windows для мыши определен набор из 21 сообщения. Однако 11 из этих сообщений не относятся к клиентской области, и программы для Windows обычно игнорируют их.

Количество посылок сообщения WMMOUSEMOVE зависит от устройства мыши и скорости, с которой оконная функция может обрабатывать сообщения о движении мыши. Если мышь оказывается вне клиентской области окна, но все еще внутри окна, то Windows посыла­ет оконной процедуре сообщения мыши, связанные с неклиентской областью, включающей заголовок, меню, рамку и полосы прокрутки.

Сообщения мыши для неклиентской области содержат в названиях буквы NC, что означает неклиентская (nonclient). Например, если мышь перемещается внутри неклиентской области окна, то оконная функция получает сообщение WMNCMOUSEMOVE. Однако пара­метры wParam и lParam для таких сообщений, связанных с неклиент­ской областью, имеют другой смысл: Параметр wParam показывает зону неклиентской области, в которой произошло перемещение или щелчок. Его значение совпадает с одним из идентификаторов, начи­нающихся с НТ, что означает тест попадания (hit-test). Сообщения тес­та попадания будут рассмотрены ниже.

Параметр lParam содержит в младшем слове значение координаты X, а в старшем Y. Однако эти координаты являются координатами относительно начала экрана, а не относительно начала клиентской об­ласти. Значения координат X и Y верхнего левого угла экрана равны 0.

Приложение может преобразовать экранные координаты в коорди­наты клиентской области окна и наоборот с помощью функций Windows ScreenToClient и ClientToScreen.

Сообщение WMNCHITTEST (тест попадания в нерабочую об­ласть nonclient hit-test) предшествует всем остальным сообщениям мыши клиентской и неклиентской области. Параметр lParam содер­жит значения X и Y экранных координат положения мыши. Параметр wParam не используется.

В приложениях Windows это сообщение обычно передается в DefWindowProc. В этом случае Windows использует сообщение WMNCHITTEST для выработки всех остальных сообщений на основе положения мыши.

Для сообщений мыши неклиентской области возвращаемое значе­ние функции DefWindowProc при обработке сообщения WMNCHITTEST передается как параметр wParam в сообщении мы­ши.

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

Рассмотренные выше сообщения приложение получает в случаях, когда курсор мыши находится в клиентской или в неклиентской об­ласти окна. Но иногда приложению может понадобиться получать сообщения от мыши даже в случаях, когда курсор мыши находится вне окна. Если это необходимо сделать, то приложение может произвести захват (capture) мыши.

Захват мыши осуществляется с помощью функции SetCapture. По­сле вызова этой функции, Windows посылает все сообщения мыши в оконную функцию того окна, чей дескриптор окна был передан в функцию SetCapture. Пока мышь захвачена, системные функции кла­виатуры тоже не действуют.

Сообщения мыши в захваченном состоянии всегда остаются сооб­щениями клиентской области, даже если мышь оказывается не в кли­ентской области окна. Параметр lParam, однако, показывает положе­ние мыши в координатах клиентской области. Эти координаты, одна­ко, могут стать отрицательными, если мышь окажется левее или выше клиентской области.

Освободить мышь можно при помощи функции ReleaseCapture.

При обработке сообщений от мыши следует отметить, что если системное модальное окно сообщений или системное модальное окно диалога находится на экране, никакая другая программа не может по­лучать сообщения от мыши.

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии