Если перо задает линию большой толщины, то стоит воспринимать ее как любую закрашенную область. Разработчик может использовать сплошную заливКу цветом, заполнять линию штриховкой и выполнять другие необходимые действия. Это приводит к тому, что перо должно иметь тот же набор атрибутов, что и кисть. Такое перо называется геометрическим, и его можно создать при помощи функции ExtCreatePen(DWORD dwPenStyle, DWORD dwWidth, LOGBRUSH *lplb. DWORD dwStyleCount, CONST DWORD *lpStyle): В параметре dwPenStyle указывается стиль пера, в параметре dwWidth - толщина пера. Параметр *lplb содержит адрес структуры, в которой определена кисть для закраски площади линий. Параметр dwStyleCount позволяет указывать длину массива, в котором можно задать нестандартный стиль линии. В этом массиве указываются размеры штрихов и промежутков между ними. И наконец, в параметре *lpStyle передается адрес массива, задающего нестандартный стиль.
Эта же функция может создавать и косметическое перо. В этом случае используются первые три параметра, причем из структуры *lplb читается только цвет. Четвертый и пятый параметры используются, если создается геометрическое перо стиля PSJJSERSTYLE.
В Windows 9х из всех возможностей геометрического пера можно создать только непрерывную линию со сплошной заливкой. Пример работы с геометрическим пером на основе кисти в Windows NT/XP приведен в [6].
Изменение элементов контекста Последовательность действий при изменении контекста Следует помнить, что контекст устройства содержит дескрипторы объектов. Чтобы заменить объект в контексте устройства, применяется функция SelectObject (HDC, <Новый_дескриптор>). Она заменяет объект в контексте устройства и возвращает дескриптор того объекта, который был раньше связан с контекстом. Если в качестве объекта используется регион, то функция возвращает тип региона. Это происходит из-за того, что регион, в отличие от остальных объектов, является не объектом GDI, а объектом ядра операционной системы.
Когда необходимость в объекте отпадает, его следует удалить из контекста и уничтожить ранее созданный объект при помощи функции DeleteObject-(HGDIOBJ hObject). Этой функции в качестве параметра передается дескриптор удаляемого объекта. При успешном выполнении она возвращает ненулевое значение.