Простые перья создаются вызовом функции CreatePen или CreatePenIndirect.
SetDCPenColor (HDC hdc, COLORREF crColor).
SelectObject(hDC,hPen).
После этого все функции, рисующие линии будут использовать перо WHITE_PEN.
При выборе стандартного пера DC_PEN в контекст устройства можно изменять его цвет. Для этого предусмотрена функция:
Функция возвращает предшествующий цвет пера DC.
Например, необходимо нарисовать градиентную заливку одним пером:
{
HGDIOBJ hOld=SelectObject(hDC,GetStockObject(DC_PEN));
for (int i=0; i<256; ++i) {
SetDCPenColor(hDC,RGB(255-i,128,i));
MoveToEx(hDC,10,i+10,NULL);
LineTo(hDC,266,i+10);
}
SelectObject(hDC,hOld);
}
HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
Первый аргумент- стиль пера, возможные значения которого приведены ниже:
При этом все линии имеют толщину в 1 пиксель.
Если в контексте устройства используется режим отображения по умолчанию MM_TEXT, то логические единицы совпадают с физическими единицами выражаются в пикселах.
Пример: Создать простое сплошное (однородное) перо красного цвета толщиной 5 логических единиц:
hPen = CreatePen(PS_SОLID, 5, RGB(255, 0, 0));
Также можно создать простое перо вызовом функции CreatePenIndirect:
HPEN CreatePenIndirect(CONST LOGPEN* lplgpn);
Этой функции в качестве параметра передается адрес структуры типа LOGPEN:
typedef struct tagLOGPEN {
UINT style; // стиль пера
POINT width; // толщина в логических единицах
COLORREF color; // цвет
} LOGPEN;
Для вызова функции CreatePenIndirect необходимо:
А) сначала определить переменную типа LOGPEN, например:
LOGPEN logpen;
Б) полям этой переменной присвоить нужные значения, например:
logpen.style = PS_S0LID;
logpen.width.x = 10;
logpen.color = RGB(255, 0, 0);
в) вызвать функцию CreatePenIndirect:
hPen = CreatePenIndirect(&logpen);
Пример: Допустим, приложению требуются три нестандартных пера: красное толщиной 2, зеленое толщиной 5 и синее пунктирное.
a) Сначала нужно определить переменные для хранения дескрипторов этих перьев:
static HPEN hPenl. hPen2, hРеnЗ;
б) Сами перья могут быть созданы в процессе обработки сообщения WM_CREATE:
hPenl = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
hPen2 = CreatePen(PS_SOLID, 5, RGB(0, 255, 0)):
hPen3 = CreatePen(PS_DASH, 1, RGB(0, 0, 255)):
в) в процессе обработки сообщения WM_PAINT можно выбрать одно из этих перьев в контекст устройства и рисовать с его помощью:
SelectObject(hDC, hPenl);
// ... функции рисования линий
SelectObject(hDC, hPen2);
// ... функции рисования линий
г) в процессе обработки сообщения WM_DESTROY рекомендуется удалить эти перья:
DeleteObject(hPenl);
DeleteОbject(hPen2):
De1eteОbject(hPen3);
Можно создавать перья, объединяя вызовы функций CreatePen и SelectObject в одну инструкцию:
SelectObject(hDC, CreatePen(PS_DОT, 0, RGB(255, 255, 0)));
Можно удалить перо при помощи выбора стандартного пера BLACK_PEN в контекст устройства и удаления значения, возвращенного функцией SelectObject:
DeleteObject(SelectObject(hDC, GetStockObject(BLACK_PEN)));