Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для 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. Теперь к этому списку добавится только одно значение:

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

Поле 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_TRANSPARENT Часть окна, расположенная под курсором мыши, считается прозрачной. Тест должен выполняться для окна, расположенного ниже под данным окном, как будто прозрачное окно не существует. В качестве прозрачного вы можете объявить, например, дочернее окно
HT_DISCARD Сообщения мыши не должны передаваться функции окна
HT_ERROR Аналогично предыдущему, однако раздается звуковой сигнал и окно отодвигается на задний план

По умолчанию обработчик активного окна возвращает значение 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 , позволяющее определить отображение клавиш мыши в сообщениях, проходящих через очередь. Однако это сообщение не рекомендуется к использованию обычными приложениями.

[Назад] [Содеожание] [Дальше]