Атрибуты контекста.

 

 

Когда программа запрашивает описатель контекста устройства, 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; просмотров: 1098;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.036 сек.