Объекты и атрибуты контекста устройства
Контекст является объектом 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); // определение синего цвета
Дата добавления: 2016-11-22; просмотров: 668;