Контекст устройств. GDI, драйверы и устройства вывода., страница 5

Эти шаги продемонстрированы в следующем фрагменте программного кода, который использует объект пера для рисования прямоугольника в контексте устройства с дескриптором hDC:

HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0) ) ;

HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);

Rectangle(hDC, 0, 0, 100, 100);

SelectObject(hOldPen) ;

DeleteObject(hPen) ;

Объекты GDI создаются, используя любую из множества функций, представленных в следующем разделе. После создания на объект можно сослаться по дескриптору, то можно выбрать его в контекст устройства, используя функцию SelectObject. (Палитры выбираются с помощью функции SelectPalette.) Эта функция также возвращает дескриптор предыдущего выбора пера, кисти, шрифта или растрового изображения; после завершения рисования его можно использовать для восстановления контекста устройства в начальное состояние. Неиспользуемые объекты разрушаются с помощью функции DeleteObject.

Не всегда необходимо создавать объекты GDI "с нуля". Приложения могут использовать предопределенные системой объекты посредством функции GetStockObject, которую можно использовать для получения дескриптора различных перьев, кистей, шрифтов и системных палитр. Хотя для этих базовых объектов не обязательно вызывать функцию DeleteObject, это тем не менее не повредит.

Перья

Перья используются для рисования линий, кривых и контуров других фигур. Перья создаются с помощью функции CreatePen. При вызове этой функции приложение указывает ширину, стиль и цвет пера.

Цвет пера определяется как значение RGB; однако при указании соответствующего элемента логической палитры Windows обычно заменяет его ближайшим цветом палитры. Исключение составляет случай, когда ширина пера больше единицы и установлен стиль PS_INSIDEFRAME, в этой ситуации Windows использует цвета с оттенками.

Штриховой и точечный стили не поддерживаются для перьев с шириной больше единицы. Однако в Windows NT такие перья можно создать с помощью функции ExtCreatePen, доступной и в Windows 95, но с ограниченными возможностями.

ExtCreatePen также обеспечивает лучшее управление формой узлов соединения и окончаний.

Еще одна функция, которую можно использовать для создания пера — функция CreatePenIndirect. Параметром этой функции является указатель на структуру LOGPEN, определяющую ширину, цвет и стиль пера.

На рисование пером влияет режим смешивания переднего плана. Этот режим устанавливается с помощью функции SetROPZ. Различные логические операции между цветом пера и цветом пиксела определяются несколькими установками. Текущий режим смешивания можно получить с помощью функции GetROPZ.

Кисти

Кисти используются для заполнения содержимого рисуемых фигур. Использование кисти определяет цвет и образец заполнения.

Кисть создается вызовом функции CreateBrushIndirect. Этой функции передается указатель на структуру LOGBRUSH, которая определяет стиль, цвет и образец кисти.

Образец кисти может основываться на растровом изображении. Если значением стиля кисти является BS_DIBPATTERN или BS_DIBPATTERNPT, то переменная IbStyle структуры LOGBRUSH указывает дескриптор растрового изображения.

Windows 95 поддерживает только растровые изображения размером 8х8. Если размер указанного растрового изображения больше, то используется только его часть.

Кроме этого, кисть может содержать штриховку; в этом случае переменная IbStyle структуры LOGBRUSH указывает штриховую палитру.

Переменная IbColor указывает цвет переднего плана кисти со штриховкой. Однако цвет фона и режим управляются функциями SetBkColor и SetBkMode соответственно.

Специфической проблемой при использовании образцов и штриховки является проблема начала отсчета кисти. Чтобы обеспечить равномерный внешний вид, необходимо выровнять начала отсчета растрового изображения кисти или образца кисти со штриховкой при отдельном рисовании разных участков фигуры. В Windows 95 это выполняется при вызове функции UnrealizeObject каждый раз перед выбором кисти в контекст устройства. В Windows NT в этом нет необходимости — она отслеживает начала отсчета кистей.