Программирование для IBM OS/2© Александр Фролов, Григорий ФроловТом 25, М.: Диалог-МИФИ, 1993, 286 стр. 6.3. Сообщения, поступающие от мышиВ отличие от клавиатурных сообщений, поступающих в то окно, которое имеет фокус ввода, сообщения от мыши попадают в окно, в котором расположен курсор мыши. Если на экране находится несколько перекрывающих друг друга окон, сообщения мыши передаются в окно, расположенное наверху. В том случае, когда в родительском окне создано дочернее окно и курсор мыши располагается в дочернем окне, то сообщения мыши посупают в функцию дочернего окна. Сообщения от кнопок мышиКогда пользователь нажимает клавишу мыши, функция окна, расположенного под курсором мыши, получает одно из следующих сообщений: 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. Теперь к этому списку добавится только одно
значение:
Поле codeHitTest мы опишем позже. Сообщение WM_MOUSEMOVEСообщение WM_MOUSEMOVE передается в функцию окна при перемещении курсора мыши внутри окна. Параметры, которые передаются с этим сообщением, такие же, что и параметры сообщений от клавиш мыши, рассмотренные выше. По умолчанию это сообщение обрабатывается функцией WinDefWindowProc , причем соответствующий обработчик устанавливает стандартную форму курсора мыши (в виде стрелки). Приложение может изменить форму курсора мыши, выполняя обработку сообщения WM_MOUSEMOVE . В приложении MOUSEMOV, исходные тексты которого приведены в этой главе, мы покажем, как это делается. Сообщение WM_HITTESTС помощью сообщения WM_HITTEST система Presentation Manager может определить способ обработки сообщений мыши для заданного окна. Это сообщение передается фукнции окна только в том случае, если при регистрации класса окна был указан стиль CS_HITTEST . Определив собственный обработчик для этого сообщения, приложение может заблокировать сообщения мыши для выбранного окна, при этом окно будет вести себя как заблокированное. Попытка сделать щелчок мышью в этом окне вызовет звуковой сигнал. Обработчик сообщения WM_HITTEST получает через
парметр mp1 координаты курсора мыши. Он может
вернуть одно из перечисленных ниже значений (так
называемый индикатор теста Hit Test):
По умолчанию обработчик активного окна возвращает значение HT_NORMAL, а обработчик заблокированного окна - значение HT_ERROR. Другие сообщенияОдна из часто выполняемых с помощью мыши операций - перемещение объектов (drag and drop). Для выполнения этой операции вы можете использовать сообщения WM_BUTTON1MOTIONSTART и WM_BUTTON1MOTIONEND и аналогичные для кнопок с другими номерами. Первое из этих сообщений передается функции окна когда пользователь начинает операцию перемещения, нажав кнопку с соответствующим номером. Через параметр mp1 этих сообщений передаются координаты курсора мыши, а через младшее слово параметра mp2 - результаты теста Hit Test. Кроме этого, для обработки операций перемещения можно использовать сообщения WM_BEGINDRAG и WM_ENDDRAG . Через параметр mp1 сообщений WM_BEGINDRAG и WM_ENDDRAG передаются координаты курсора мыши, а через младшее слово параметра mp2 - флаг, определяющий устройство ввода, которое было использовано для выполнения операции перемещения. Если это была мышь, флаг равен TRUE, если клавиатура - FALSE. Есть еще одно сообщение, имеющее отношение к мыши. Это сообщение с кодом WM_MOUSEMAP , позволяющее определить отображение клавиш мыши в сообщениях, проходящих через очередь. Однако это сообщение не рекомендуется к использованию обычными приложениями. |