Объекты и атрибуты контекста устройства 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Объекты и атрибуты контекста устройства



 

 

Контекст является объектом Windows. В свою очередь, сам контекст содержит в себе описатели некоторых объектов, которые используются при работе с контекстом (Например, при рисовании линий, прямоугольников, областей и т.п.). К этим объектам относятся:

 

 

· Перо (PEN) определяет цвет, ширину, стиль линии, которой выполняется рисование всеми функциями API.

 

 

· Кисть (BRUSH) определяет цвет и режим фона, которыми заполняются пустоты.

 

 

Для использования объектов в программе, как уже говорилось ранее, используются описатели объектов, для создания которых существуют предопределенные типы описателей: HPEN (handle to pen) для пера и HBRUSH - для кисти. Таким образом, если в программе будет необходимо использовать данные объекты, прежде всего, необходимо определить переменные-описатели, например,

 

 

HPEN MyPen; // определение описателя пера.

 

 

HBRUSH MyBrush; // определение описателя кисти.

 

 

Оба приведенных выше объекта поддерживают три основных функции работы с ними:

 

 

·Создание нового объекта.

 

 

·Выбор объекта (из множества предопределенных в Windows).

 

 

·Удаление объекта.


 

 

Рассмотрим подробнее эти объекты и функции работы с ними.

 

 

Перо (PEN) определяет цвет, ширину, стиль линии, которой выполняется рисование всеми функциями API. Перо, устанавливаемое в контексте устройства по умолчанию, называется BLACK_PEN (черное перо). Это перо рисует сплошные черные линии толщиной в один пиксел независимо от режима отображения (mapping mode). Windows поддерживает еще два стандартных пера – это WHITE_PEN(белое перо) и NULL_PEN(пустое перо, т.е. «рисующее» прозрачным цветом).

 

 

Получить описатель одного из стандартных (предопределенных в Windows) перьев можно используя функции GetStockObject:

 

 

MyPen = GetStockObject(WHITE_PEN);

 

 

Переменной MyPen, в данном случае, присваивается адрес памяти, где расположена структура данных, соответствующая белому перу. Если такого пера не существует, функция возвращает нулевой (NULL) описатель. Программа может использовать выбранную кисть через ее описатель MyPen. Выбранное перо может использоваться в любом контексте, однако, для этого его нужно передать нужному контексту (ведь, в любой момент времени в контексте выбрано какое-то свое перо). Выбор пера в конкретный контекст осуществляется путем выполнения стандартной функции выбора объекта в контекст:

 

 

HPEN OldPen;

 

 

OldPen = SelectObject(hdc, MyPen);

 

 

Выполнив функцию SelectObject, мы тем самым устанавливаем в контексте hdc новое перо, и все функции рисования на этом контексте будут выполняться на основе этого пера. При это возникает вопрос: что при этом происходит со старым пером? Описатель старого пера возвращается в программу как результат функции SelectObject, а контекст "забывает" о существовании старого пера. На это следует обратить внимание, так как, если старое перо было перед этим создано вашей программой и не используется больше никем, оно останется в памяти компьютера как "мусор". Считается хорошим стилем программирования, если программа после работы с контекстом возвращает старые объекты в контекст после завершения работы с контекстом, и сама уничтожает созданные ею объекты. Однако, если старое перо не было создано Вашей программой, удалять его нельзя.

 

 

Создать новое перо можно при помощи функции CreatePen:

 

 

MyPen = CreatePen(iPenStyle, iWidth, rgbColor);

 

 

Параметр iPenStyle определяет тип линии и может иметь одно из следующих значений:

 

Параметр iWidth определяет ширину линии в пикселях (если значение этого параметра 0 – ширина линии равна одному пикселю).


– 23 –

 

 

Параметр rgbColor определяет цвет пера. Как получить цвет значение этого параметра будет рассмотрено позже.

 

 

Последняя операция, доступная пользователю, над пером – это удаление. Для ее реализации используется функция стандартного удаления объектов (т.е. ее можно использовать для удаления, как перьев так и кисти):

 

 

DeleteObject(MyPen);

 

 

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

 

 

SetBkColor(hdc, rgbColor);

 

 

а также может определить текущий цвет фона в контексте:

 

 

QColor = GetBkColor(hdc);

 

 

Кисть (BRUSH) определяет цвет и режим фона, которыми заполняются пустоты. По умолчанию, это стандартная кисть WHITE_BRUSH. Следовательно, внутренняя область фигуры будет закрашена белым цветом. Windows имеет шесть стандартных (stock) кистей: WHITE_BRUSH (белая кисть), LTGRAY_BRUSH (светло-серая кисть), GRAY_BRUSH (серая кисть), DKGRAY_BRUSH (темно-серая кисть), BLACK_BRUSH (черная кисть), NULL_BRUSH или HELLOW_BRUSH (пустая кисть).

 

 

Получение описателя стандартной кисти и ее выбор в контекст аналогично получению стандартного пера:

 

 

HBRUSH MyBrush, OldBrush; // объявление описателей кисти

 

 

MyBrush = GetStockObject(BLACK_BRUSH); // Получение стандартной черной кисти.

 

 

OldBrush=SelectObject(hdc,MyBrush); // Выбор кисти в контекст

 

 

// Рисование

 

 

SelectObject(hdc,OldBrush); // Выбор в контекст старой кисти

 

 

Для создания кисти Windows имеет несколько функций.

 

 

Самый простой фон задает только чистый (solid) цвет:

 

 

MyBrush = CreateSolidBrush(rgbColor);

 

 

Вы можете также создать штриховую (hatch) кисть при помощи следующей функции:

 

 

MyBrush = CreateHathBrush(iHatchStyle, rgbColor);

 

 

где параметр iHatchStyle задает стиль штриховки:


 

 

Вы можете создать кисть, используя свою собственную штриховку:

 

 

MyBruch = CreatePatternBrush(hBitmap);

 

 

где hBitmap – описатель битового образа.

 

 

Так же, как и в случае с пером, программа должна удалить все созданные ею кисти при помощи уже знакомой нам процедуры DeleteObject:

 

 

DeleteObject(MyBrush);

 

 

В заключении разговоров об объекте можно повторить общие правила, которые мы обсудили при их рассмотрении:

 

 

·Удаляйте все созданные вами объекты.

 

 

·Не удаляйте объекты, пока они выбраны в контексте.

 

 

·Не удаляйте стандартные объекты.

 

 

В обоих объектах, как в прочем и в самом контексте, используется понятие цвета. Windows использует 32-разрядное беззнаковое целое для представления цвета. Тип данных для цвета называется COLORREF. Младшие три байта задают красную, зеленую и голубую составляющую, величина которых находится в интервале от 0 до 255, как показано на рисунке. Таким образом, палитра может иметь 2 24 цвета.

 

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


– 25 –

 

 

COLORREF MyColor = RGB(255,0,0); // определение синего цвета

 

 

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

 

 

Когда программа запрашивает описатель контекста устройства, 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 и ваша программа получит сообщение, являющееся обработкой системного сообщения (например, сообщит вам, что окно закрывается, либо окно теряет фокус ввода).

 

 

Аппаратные сообщения.

 

 

Сообщения, которые приложение (ваша программа) получает от клавиатуры, различаются на аппаратные (keystrokes) и символьные (characters). Любое нажатие на клавиатуре генерирует аппаратное сообщение. Нажатие клавиши с каким-либо символом (буквой, цифрой, значком) должно привести к тому, что Windows, кроме аппаратного сообщения, пошлет в вашу программу символьное сообщение. Как это происходит, мы рассмотрим позже, а сейчас подробно рассмотрим аппаратные сообщения.

 

 

Операционная система выделяет в потоке аппаратных сообщений системные и несистемные сообщения. Системные сообщения обычно вырабатываются при нажатии клавиш в сочетании с клавишей < Alt >. Эти сообщения вызывают опции меню программы или системного меню (< Alt +функциональная клавиша>,< Alt + Esc >), или используются для системных функций, таких как смена активного окна (< Alt + Tab >). Обычно программа игнорирует системные сообщения, однако иногда возникает необходимость в их обработке.

 

 

Типы сообщений, поступающих в приложение от клавиатуры приведены в следующей таблице:

 

 


Типы сообщений

Несистемные аппаратные сообщения Системные аппаратные сообщения


Клавиша нажата WM_KEYDOWN WM_SYSKEYDOWN


Клавиша отпущена WM_KEYUP WM_SYSKEYUP


 

 

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

 

 

Одновременно с одним из аппаратных сообщений приходят два параметра сообщения: lParam и wParam. Переменная lParam состоит из 6 полей:

 

Счетчик повторений. Равен числу нажатий клавиши, которое отражено в сообщении. В случае, когда его значение отлично от 1 (больше одного нажатия), это обычно означает, что программа не успевает обработать сообщения в реальном времени, либо система загружена в данный момент какой-либо работой. Ваша программа может как игнорировать число нажатий (реагировать только на сам факт нажатия), либо обрабатывать все нажатий клавиши клавиатуры.

 

 

Скан-код. Является кодом клавиатуры, генерируемым аппаратурой, то есть является тем кодом, который непосредственно приходит от клавиатуры. Обычно игнорируется приложением.

 

 

Флаг расширенной клавиатуры. Устанавливается в 1, если сообщение пришло от дополнительной клавиатуры (клавиши управления курсором, цифровая клавиатура и др.)

 

 

Код контекста. Код контекста устанавливается в 1, если нажата клавиша < Alt >. Часто, при помощи этого бита можно выделить системные сообщения.


– 31 –

 

 

Флаг предыдущего состояния клавиши. Равен 0, если в предыдущем состоянии клавиша была отпущена, и 1, если в предыдущем состоянии она была нажата.

 

 

Флаг состояния клавиши. Равен 0, если клавиши нажимается, и 1, если клавиша отпускается.

 

 

Второй параметр wParam содержит виртуальный код клавиши (virtual key code), идентифицирующий нажатую и отпущенную клавишу, чем реализуется аппаратная независимость программного представления клавиатуры. Виртуальные коды клавиш, которые вы используете, имеют имена, определенные в заголовочных файлах Windows. Вот несколько примеров виртуальных кодов:

 

 


Нажатая клавиша

 

Ctrl-Break

Tab (табуляция) Shift

Enter Ctrl Alt Esc

Пробел Стрелка влево Стрелка вправо Стрелка вниз Стрелка вверх Delete

End Home Page Up

Page Down F1


Идентификатор, определенный в windows. h

VK_CANCEL VK_TAB VK_SHIFT VK_ENTER VK_CONTROL VK_MENU VK_ESCAPE VK_SPACE VK_LEFT VK_RIGHT VK_DOWN VK_UP VK_DELETE VK_END VK_HOME VK_PRIOR VK_NEXT VK_F1


Десятичный код

 

3 9 13 16 17 18 27 32 37 38 40 39 46 35 36 33 34 70


 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 412; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.228.35 (0.183 с.)