Программирование для IBM OS2
4cab9ef0

Сообщения от кнопок мыши


Когда пользователь нажимает клавишу мыши, функция окна, расположенного под курсором мыши, получает одно из следующих сообщений: WM_BUTTON1DOWN , WM_BUTTON2DOWN , WM_BUTTON3DOWN (соответственно, для первой, второй и третьей кнопки). При отпускании клавиши мыши функция окна получает сообщения WM_BUTTON1UP , WM_BUTTON2UP и WM_BUTTON3UP (в зависимости от номера кнопки). Пример обработки сообщения WM_BUTTON1DOWN есть в приложении MYWINDOW, исходные тексты которого мы привели в первой главе этой книги.

Таким образом, приложение может выполнять раздельную обработку операций нажатия и отпускания кнопок мыши.

Если пользователь сделал одиночный щелчок в окне приложения (т. е. достаточно бытро нажал и отпустил клавишу мыши, не свигая курсор), в функцию окна после отпускания кнопки мыши поступит одно из следующих сообщений: WM_BUTTON1CLICK , WM_BUTTON2CLICK или WM_BUTTON3CLICK .

В ответ на двойной щелчок в функцию окна поступают сообщения WM_BUTTON1DBLCLK , WM_BUTTON2DBLCLK и WM_BUTTON3DBLCLK . Заметим, что в ответ на первый щелчок при этом в функцию окна потсупят сообщения о нажатии кнопки и об отпускани кнопки. В ответ на второй щелчок придет сообщение о двойном щелчке и затем сообщение об отпускании кнопки.

Через параметр mp1 вместе с перечисленными выше сообщениями передаются координаты курсора мыши. Вы можете извлечь их с помощью макрокоманд SHORT1FROMMP или SHORT2FROMMP (соответственно, координату X и Y). Через параметр mp2 передаются флаги и результаты теста Hit Test (о котором мы расскажем позже).

Для извлечения параметров собщений мыши удобно использовать макрокоманду MOUSEMSG , например:

case WM_BUTTON1DOWN : { cxPoint = MOUSEMSG(&msg) -> x; cyPoint = MOUSEMSG(&msg) -> y; break; }

Эта макрокоманда, а также соответствующая структура MSEMSG и указатель на нее определены следующим образом:

typedef struct _MOUSEMSG { SHORT x; // коодрината X SHORT y; // координата Y USHORT codeHitTest; // результаты тестирования USHORT fsInp; // флаги } MSEMSG; typedef MSEMSG *PMSEMSG;

#define MOUSEMSG(pmsg) \ ((PMSEMSG)((PBYTE)pmsg + sizeof(MPARAM)))

В поле fsInp могут расплагаться флаги, аналогичные флагам, передаваемым вместе с сообщением WM_CHAR . Используя эти флаги, можно определить, была ли нажата на клавиатуре какая-либо клавиша в момент, когда пользователь нажал клавишу мыши. Список возможных значений для поля fsInp был приведен при описании сообщения WM_CHAR. Теперь к этому списку добавится только одно значение:

Флаг Маска Описание
KC_NONE 0x0000 На клавиатуре не была нажата ни одна клавиша

Поле codeHitTest мы опишем позже.



Содержание раздела