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

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 25, М.: Диалог-МИФИ, 1993, 286 стр.

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

6.4. Функции для работы с мышью

В программном интерфейсе Presentation Manager есть несколько функций, предназначенных для работы с мышью. В этом разделе мы опишем некоторые из них, наиболее полезные на наш взгляд.

Захват курсора мыши

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

Для чего приложению может потребоваться захват мыши?

Например, для того чтобы выделить какую-либо область рабочего стола Workplace Shell или нарисовать что-либо вне области, занятой окном приложения. Типичный пример - приложение, сохраняющее выделенный фрагмент изображения рабочего стола в графическом файле.

Для захвата мыши приложение может вызвать функцию WinSetCapture следующим образом:

WinSetCapture (HWND_DESKTOP, hWnd);

В качестве первого параметра функции передается идентификатор окна Desktop Window , в качестве второго - идентификатор окна, захватывающего мышь.

Освободить мышь несложно. Для этого достаточно вызвать функцию WinSetCapture еще раз, указав в качестве второго параметра идентификатор NULLHANDLE:

WinSetCapture (HWND_DESKTOP, NULLHANDLE);

Определение координат курсора мыши

Один из способов определения координат курсора мыши вы уже знаете - эти координаты передаются вместе с сообщениями мыши. Существует и и другой способ, основанный на вызове функций программного интерфейса Presentation Manager.

Функция WinQueryPointerPos

С помощью функции WinQueryPointerPos вы можете узнать положение курсора на момент выборки последнего сообщения из очереди приложения. Прототип функции приведен ниже:

BOOL WinQueryPointerPos (
  HWND    hwndDeskTop, // идентификатор окна Desktop Window 
  PPOINTL pptlPoint);  // адрес структуры типа POINTL

Положение курсора записывается в структуру типа POINTL, адрес которой передается функции через параметр pptlPoint. В случае успешного завершения функция возвращает значение TRUE, при ошибке - FALSE.

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

Функция WinQueryMsgPos

Так же как и функция WinQueryPointerPos , функция WinQueryMsgPos возвращает экранные координаты курсора мыши. Однако в отличие от функции WinQueryPointerPos, координаты курсора определяются не в момент извлечения сообщения из очереди, а в момент записи последнего сообщения в очередь приложения.

Прототип функции WinQueryMsgPos приведен ниже:

BOOL WinQueryMsgPos (
  HAB     hab,   // идентификатор блока Anchor-block
  PPOINTL pptl); // адрес структуры типа POINTL

Определение сосотояния клавиш мыши

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

Прототип функции WinGetKeyState представлен ниже:

LONG WinGetKeyState (
  HWND hwndDeskTop, // идентификатор окна Desktop Window 
  LONG vkey);       // код виртуальной клавиши

Для того чтобы определить состояние кнопок мыши, необходимо указать в параметре vkey значения констант VK_BUTTON1 , VK_BUTTON2 или VK_BUTTON3 . Информацию о кнопках, расположенных на клавиатуре, вы можете получить, указав в этом параметре соответствующий код виртуальной клавиши. Эти коды приведены в главе нашей книги, посвященной клавиатуре.

Возвращаемое функцией значение может быть комбинацией следующих констант:

Константа Описание
0x0001 С момента запуска операционной системы клавиша была нажато нечетное количество раз
0x8000 Клавиша нажата

Установка позиции курсора мыши

Ваше приложение может не только определить текущую позицию курсора мыши, но и установить курсор в новую позицию. Для этого следует использовать функцию WinSetPointer Pos , прототип которой приведен ниже:

BOOL WinSetPointer Pos (
  HWND hwndDeskTop, // идентификатор окна Desktop Window 
  LONG lx,          // новая экранная координата X
  LONG ly);         // новая экранная координата Y

Заметим, что для установки курсора мыши используются экранные координаты.

Как убрать курсор мыши

С помощью функции WinShowPointer вы можете убрать курсор мыши с экрана или высветить его вновь. Прототип этой функции представлен ниже:

BOOL WinShowPointer(
  HWND hwndDeskTop,  // идентификатор окна Desktop Window
  BOOL fShow);       // флаг

Вызывая эту функцию, вы можете увеличивать или уменьшать внутренний индикатор отображения курсора, передавая через параметр fShow, соответственно, значения FALSE и TRUE. Если этот индикатор равен нулю, курсор мыши отображается, а если больше нуля - нет.

Функция WinShowPointer возвращает новое значение индикатора отображения курсора мыши.

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