Простые перья создаются вызовом функции 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)));