Атрибуты контекста.
Когда программа запрашивает описатель контекста устройства, Windows создает контекст со значением всех атрибутов по умолчанию. Атрибуты контекста устройства приведены в следующей таблице. Программа может изменить или получить любой из этих атрибутов.
Атрибут контекста Режим отображения
( Mapping mode ) Начало координат окна
( Window origin ) Начало координат области вывода
( Viewport Origin ) Протяженность окна
Значение по умолчанию MM_TEXT
(0,0)
(0,0)
(1,1)
Функция для изменения SetMapMode
SetWindowOrgEx
SetViewportOrgEx
SetWindowExtEx
Функция для получения GetMapMode
GetWindowOrgEx
GetViewportOrgEx
GetWindowExtEx
(Window extent) Протяженность области (1,1) вывода ( Viewport extent )
Перо ( Pen ) BLACK_PEN Кисть ( Brush ) WHITE_BRUSH Шрифт ( Font ) SYSTEM_FONT Битовый образ ( Bitmap ) NOT
Текущая позиция пера ( (0,0) Current pen position )
SetVievportExtEx
SetMapMode SelectObject SelectObject SelectObject SelectObject MoveToEx
LineTo
GetVievportExtEx
SelectObject SelectObject SelectObject SelectObject GetCurrentPositionEx
PolylineTo
PolyBezierTo
Режим фона OPAQUE SetBkMode GetBkMode
( Background mode )
Цвет фона ( Background Белый color )
Цвет текста ( TextColor ) Черный Режим рисования ( R2_COPYPEN Drawing mode )
Режим растяжения ( BLACKONWHITE Stretching mode )
Режим закрашивания ALTERNATE
SetBkColor
SetTextColor SetROP2
SetStrethBltMode
SetPolyFillMode
GetBkColor
GetTextColor GetROP2
GetStrethBltMode
GetPolyFillMode
многоугольников
( Polygon filling mode )
Межсимвольный 0 SetTextCharacterExtra GetTextCharacterExtra интервал ( Intercharacter
spacing )
Начало координат кисти (0,0) SetBrushOrgEx GetBrushOrgEx
( Brush origin )
Область отсечения Not SelectObject
( Clipping region ) SelectClipRgn
– 27 –
ЛЕКЦИЯ 4. ОБРАБОТКА СООБЩЕНИЙ. ЦИКЛ ОБРАБОТКИ СООБЩЕНИЙ
Когда в системе происходит какое-либо событие, на которое должна отреагировать исполняемая программа (например, нажата клавиша на клавиатуре, перемещена мышь или истекло время ожидания), операционная система посылает программе сообщение об этом событии. Программа получает сообщение и выполняет код (часть программы), реагирующий на это событие. Сформированное операционной системой сообщение помещается в системную очередь сообщений. Каждое сообщение предназначено конкретному окну. ОС определяет какому приложению предназначено сообщение и помещает его в очередь сообщений программы. Далее программа сама должна заботиться об обработке сообщения.
Цикл обработки сообщения выбирает очередное сообщение из программной очереди и вызывает оконную процедуру (ОП) того окна, которому оно предназначено. Если программа в это время занята обработкой другого сообщения, вновь прибывшее сообщение ожидает в очереди завершения обработки предыдущего сообщения (это особенно заметно на медленных машинах, когда например, набранное слово на клавиатуре появляется на экране спустя некоторое время).
Мышь
Общие сведения
Мышь – это графическое устройство ввода информации с одной или более кнопками. Windows поддерживает однокнопочную, двухкнопочную или трехкнопочную мышь. Фактически стандартом, используемым большинством приложений Windows , стала двухкнопочная мышь. Программа может определить наличие мыши и количество кнопок мыши с помощью системных установок:
bool fMouse = GetSystemMetrics(SM_MOUSEPRESENT);
int cButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
Если мышь установлена, fMouse будет установлена в TRUE , количество кнопок при этом будет равняться cButtons .
Когда пользователь перемещает мышь, операционная система перемещает по экрану растровую картинку (обычно стрелку), которая называется "курсор мыши" ( mouse cursor ). Курсор мыши имеет "вершину" картинки ( hot spot ), размером в один пиксель, определяющую положение мыши на экране.
Ранее, при регистрации класса окна, мы уже сталкивались с необходимостью выбора типа курсора мыши, который устанавливается в приложении по умолчанию (см. тему "Регистрация окна"):
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
Тип IDC _ ARROW является наиболее часто используемым курсором, представляющим собой стрелку, и имеющим вершину в левой верхней части. Приведем несколько примеров предопределенного курсора мыши:
IDC _ APPSTARTING Стандартная стрелка с песочными часами
IDC _ ARROW Стандартная стрелка
IDC _ CROSS Крест
IDC _ IBEAM Текстовый курсор (в виде символа I)
IDC _ ICON Пустая иконка для Windows NT
IDC _ NO Перечеркнутая окружность
IDC _ SIZE Четыренаправленная стрелка для Windows NT
IDC _ SIZENESW
IDC _ SIZENS Различные стрелки изменения размера
IDC_SIZENWSE
IDC_SIZEWE
IDC_UPARROW
IDC _ WAIT Песочные часы ожидания
Сообщения мыши
В отличие от клавиатуры, сообщения от мыши приходят в окно в любом случае, если мышь находится над окном (даже, если окно не активно и не имеет фокуса ввода) и совершается какое-либо действие с мышью (перемещение мыши или нажатие клавиш). В следующей таблице приведены основные сообщения от мыши, которые могут быть обработаны оконной процедурой:
Сообщение
WM_MOUSEMOVE
Назначение
Мышка перемещается над окном
Значение Значение параметра wParam параметра lParam
Координаты мышиБитовая маска, определяющая в координатах состояние управляющих клиентской клавиш и других кнопок области окна: мыши:
MK _ LBUTT О N
x= левая кнопка нажата
LOWORD(lParam) MK _ RBUTT О N
y=
HIWORD(lParam)
правая кнопка нажата
MK _М BUTTUN
средняя кнопка нажата
MK_SHIFT
– 29 –
<Shift> нажат
MK_CONTROL
WM_LBUTTONDOWN WM_MBUTTONDOWN WM_RBUTTONDOWN WM_LBUTTONUP WM_MBUTTONUP
WM_RBUTTONUP
WM_LBUTTONDBLCLK
WM_MBUTTONDBLCLK
WM_RBUTTONDBLCLK
<Ctrl> нажат Левая клавиша нажата
Средняя клавиша нажата Правая клавиша нажата Левая клавиша отпущена Средняя клавиша отпущена
Правая клавиша отпущена
Левая клавиша дважды нажата
Средняя клавиша дважды нажата
Правая клавиша дважды нажата
Следует заметить, что окно состоит из двух частей – клиентской области (куда непосредственно осуществляется графический вывод оконной процедуры) и не клиентской области, которую занимает все оставшееся пространство окна (рамка, строка заголовка, меню). Сообщение от мыши приходит в оконную процедуру при попадании в любую область окна – клиентскую и не клиентскую. Тип сообщений в обоих случаях разный. Каждому сообщению в таблице, приведенной выше, соответствует сообщение не клиентской области имеющее префикс NC ( nonclient ). Например, WM _ NCLBUTTONDOWN , WM _ NCLBUTTONUP . Значения остальных параметров для не клиентской области отличаются: wParam показывает зону нерабочей области, в которой произошло перемещение или щелчок мыши (что можно определить при помощи идентификаторов, начинающихся с HT ( hit - test ) и определенных в заголовочных файлах Windows ); параметр lParam содержит координаты мыши относительно экрана.
Клавиатура
Общие сведения
Приложения Windows обязаны поддерживать пользовательский ввод с клавиатуры, так как данный вид ввода информации является основным (совместно с мышью). Windows полностью поддерживает для клавиатуры идеологию сообщений, то есть любая программа узнает о нажатии той или иной клавиши посредством сообщений, которые посылаются оконной процедуре.
Сообщение от клавиатуры проходит две очереди прежде, чем попадет в вашу программу – системную очередь сообщений и очередь сообщений приложения. Из системной очереди Windows выбирает сообщения, предназначенные исключительно ей (например, что нажата перегрузка машины < Ctrl + Alt + Del > или переключение между приложениями < Alt + Tab >). Таким образом, программа получает только адресованные ей сообщения от клавиатуры.
Возникает вопрос: Windows – многозадачное приложение и одновременно в системе могут работать несколько программ и, соответственно, открыты несколько окон, - какое же из окон будет получать сообщения от клавиатуры? Ответ – окно, которое имеет фокус ввода (“ input focus ”). Концепция фокуса ввода тесно связана с концепцией активного окна. Активное окно – это окно, имеющее фокус ввода, либо имеющее дочернее окно, которое имеет фокус ввода. Только одно окно в данный момент времени может быть активным. В этом случае, фокус ввода принадлежит либо данному окну, либо одному из дочерних окон активного окна (если они существуют).
Когда любое окно получает от системы сообщение WM _ SETFOCUS , это означает, что окно получает фокус ввода. Теперь все сообщения от клавиатуры будут посылаться в данное окно. Окно теряет фокус ввода, когда его оконная процедура получает сообщение WM _ KILLFOCUS .
Вашей программе не нежно реагировать на все сообщения от клавиатуры, так как операционная система сама обрабатывает многие клавиатурные сообщения (например, начинающиеся с префикса < Alt + >). Эти сообщения будут обработаны Windows и ваша программа получит сообщение, являющееся обработкой системного сообщения (например, сообщит вам, что окно закрывается, либо окно теряет фокус ввода).
Дата добавления: 2016-11-22; просмотров: 1087;