Окт 13

Перья

Любая функция рисования линий и кривых, а также контуров замкнутых фигур использует перо (реп), выбранное в контексте устройства в данный момент. Если вы не выбирали никакого пера, то используется перо по умолчанию BLACK_PEN. Оно рисует сплошные черные линии толщиной 1 пиксел независимо от режима отображения. Возможно, вы захотите большего разнообразия при рисовании линий, например, захотите придать линиям разный цвет, разную толщину и даже разный стиль!
Для удовлетворения таких запросов Win32 GDI позволяет создавать объекты логических перьев. Логическое перо представляет собой описание требований к перу со стороны приложения. Эти требования могут в каких-то деталях и не соответствовать тому, как будут выводиться линии на поверхности физического устройства. Драйвер графического устройства может поддерживать собственные структуры данных, определяющие реализацию логического пера, — такие внутренние объекты называются физическими перьями.
Структура данных логического пера находится под управлением GDI, как и иные логические объекты. Дескриптор созданного пера возвращается приложению и используется для ссылок на перо во время последующей работы.
Дескрипторы объектов GDI описываются общим типом H6DI0BJ; для дескрипторов логических перьев зарезервирован тип HPEN (handle to a pen). Следует заметить, что тип H6DI0BJ определен в заголовочных файлах Windows как указатель на тип void, a HPEN и другие специализированные типы указателей — как указатели на совершенно разные структуры. Таким образом, типом HPEN можно заменить тип HGDI0BJ, но попытка использования H6DI0BJ вместо HPEN требует обязательного преобразования типа.
Итак, объект пера с дескриптором hPen объявляется следующим образом:
HPEN hPen;
Значение дескриптора получают вызовом соответствующей функции. Вид вызываемой функции зависит от типа пера.
Объект логического пера, как и другие объекты GDI, поглощает ресурсы операционной системы. Следовательно, когда необходимость в нем отпадает, рекомендуется исключить его из контекста устройства и удалить функцией DeleteObject.