Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
370
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

SetWindowPos позволяет переводить окно как «наверх» (во втором параметре передается HWND_TOP), так и на «задний план» (во втором параметре передается

HWND_BOTTOM):

BOOL SetWindowPos(HWND hwnd, HWND hwndlnsertAfter, int x, int y, int ex, int cy, UINT fuFlags);

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

Функция GetAsyncKeyState применяется для определения того, нажата ли сейчас

заданная клавиша :

SHORT GetAsyncKeyState(int nVirtKey);

Параметр nVirtKey задает код виртуальной клавиши, состояние которой нужно проверить. Старший бит результата определяет, нажата в данный момент клавиша (1) или нет (0).

Функция GetKeyState отличается от GetAsyncKeyState тем, что возвращает состояние клавиатуры на момент, когда из очереди потока извлечено последнее клавиатурное сообщение:

SHORT GetKeyState(int nVirtKey);

Эту функцию можно вызвать в любой момент; ей все равно, какое окно в фокусе.

Управление курсором мыши

Мышь — это графическое устройство ввода информации с одной или более кнопками.

Определения терминов, соответствующих действиям над кнопками мыши: Щелчок — нажатие и отпускание кнопки мыши Двойной щелчок — двойное быстрое одно за другим нажатие и отпускание кнопки мыши

Перетаскивание — перемещение мыши при нажатой кнопке

Если мышь перемещается по рабочей области окна, оконная процедура получает сообщение WM_MOUSEMOVE. Если кнопка мыши нажимается или отпускается внутри рабочей области окна, оконная процедура получает следующие сообщения:

Кнопка Нажатие

Отпускание

Нажатие

 

 

(Второй щелчок)

Левая

WM_LBUTTON

WM_LBUTTO

WM_LBUTTOND

 

DOWN

NUP

BLCLK

Средняя

WM_MBUTTON

WM_MBUTTO

WM_MBUTTOND

 

DOWN

NUP

BLCLK

Правая

WM_RBUTTON

WM_RBUTTO

WM_RBUTTOND

 

DOWN

NUP

BLCLK

В концепцию локального состояния ввода входит и управление состоянием курсора мыши. Поскольку мышь, как и клавиатура, должна быть доступна всем потокам, Win32 не

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

Рассмотрим, как система управляет этим курсором.

Один из аспектов управления курсором мыши заключается в его показе. Система скрывает курсор, когда он оказывается над окном, созданным потоком, вызвавшим ShowCursor(FALSE), и показывает его всякий раз, когда он располагается над окном, созданным другим потоком.

Другой аспект управления курсором мыши — возможность ограничить его перемещение каким-либо прямоугольным участком. В 16-разрядной Windows это делают вызовом ClipCursor.

BOOL ClipCursor(CONST RECT *lprc);

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

Захватывая мышь (вызовом SetCapture), окно требует, чтобы все связанные с мышью сообщения RIT отправлял в виртуальную очередь ввода вызывающего потока, а из нее — установившему захват окну до тех пор, пока программа не вызовет

ReleaseCapture.

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

Однако вызвавшему SetCapture потоку «кажется», что режим захвата мыши попрежнему действует. Всякий раз, когда курсор оказывается на любом из окон, созданных установившим захват потоком, сообщения от мыши направляются в окно, применительно к которому этот захват и установлен.

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

Последняя переменная локального состояния ввода, связанная с мышью, — форма курсора. Всякий раз, когда поток вызывает SetCursor для изменения формы курсора, переменные локального состояния ввода соответствующим образом обновляются.

Допустим, пользователь перемещает курсор мыши на окно Вашей программы, окно получает сообщение WM_SETCURSOR, и Вы вызываете SetCursor, чтобы преобразовать курсор в «песочные часы». Вызвав SetCursor, программа начинает выполнять какую-то длительную операцию. Далее пользователь уводит курсор из окна Вашей программы в окно другого приложения.

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

Контрольные вопросы

1.На уровне чего рассматривается ввод в WIN32?

2.Что означает упорядоченный ввод? Что означает разупорядоченный ввод? В чем их отличие?

3.Как достигается разупорядочивание? Есть ли у потока своя очередь асинхронных сообщений и своя виртуальная очередь ввода?

4.Объясните принцип разделения потоками виртуальных очередей ввода. Какая функция дает возможность двум и более потокам использовать виртуальную очередь?

5.Что происходит с системой, если заставить все потоки использовать одну очередь сообщений?

6.В каком случае система неявно соединяет виртуальные очереди ввода нескольких потоков?

7.Какой стиль работы системы основан на концепции локального состояния ввода? Чем обладает поток в этом случае?

8.Перечислите управляющую информацию о состоянии ввода у клавиатуры и мыши.

9.В чем заключается принцип аппаратных сообщений? Перечислите эти сообщения.

10.Какие сообщения относятся к символьным? Когда они доставляются в оконную процедуру?

11.Куда направляется потоком необработанного ввода (RIT) в Win32 ввод с клавиатуры? Что происходит, когда поток вызывает GetMessage?

12.Что нужно, чтобы направить клавиатурный ввод в другое окно?

13.Что определяет оконная процедура, обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS?

14.Какая функция активизирует в системе окно верхнего уровня? Есть ли функция, дополняющая ее?

15.Назовите функции, которые переводят фокус между окнами и позволяют RIT перенаправить ввод в другой поток.

16.Существует и функция для определения того, нажата ли сейчас заданная клавиша? Если да, то какая ?

17.Что такое мышь? Какие действия ей соответствуют?

18.Каким образом система управляет курсором мыши?