HPEN ExtCreatePen(

Расширенные перья

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

 

DWORD dwPenStyle, // тип, стиль и атрибуты пера

DWORD dwWidth, // толщина

CONST LOGBRUSH* lplb, // атрибуты кисти

DWORD dwStyleCount, // длина массива lpStyle

CONST DWORD* lpStyle // массив, задающий правила чередования пикселов

);

Параметр dwPenStyle может принимать значения в виде комбинации флагов, определяющих тип пера, его стиль, тип завершения линий и тип соединения линий. Возможные значения этих флагов приведены в табл. 2.6-2.9.

 


Пример_2: Создать приложение, которое выводит в окно параболу.

 

#include <windows.h>

#include <math.h>

LRESULT CALLBACK PaintWndProc(HWND,UINT,UINT,LONG);

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

HWND hMainWnd;

char szClassName[] = "MyClass";

MSG msg;

WNDCLASSEX wc;

 

// Заполняем структуру класса окна

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = PaintWndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = szClassName;

wc.hIconSm = LoadIcon(NULL, IDI_INFORMATION);

 

// Регестрируем класс окна

if (!RegisterClassEx(&wc)) {

MessageBox(NULL, "Cannot register class", "Error", MB_OK);

return 0;

}

 

hMainWnd=CreateWindow(szClassName,"Ïàðàáîëà...",

WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,

CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,

hInstance,NULL);

if (!hMainWnd)

{

MessageBox(NULL,"Не могу зарегестрировать класс окна!","Error",MB_OK);

return 0;

}

ShowWindow(hMainWnd,nCmdShow);

UpdateWindow(hMainWnd);

 

while (GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK PaintWndProc(HWND hWnd,UINT Message,

UINT wParam,LONG lParam)

{

HDC hDC;

PAINTSTRUCT PaintStruct;

HPEN hpenRed,hpenOld;

 

int i;

static int nn=101;

 

switch(Message)

{

case WM_PAINT:

hDC=BeginPaint(hWnd,&PaintStruct);

hpenRed=CreatePen(PS_SOLID, 14, RGB(55,11,100));

hpenOld = (HPEN)SelectObject(PaintStruct.hdc,(HGDIOBJ)hpenRed);

 

 

for (i=300; i<=500; i++){

SetPixel(hDC,i,450-(i-300)*(i-300)*0.01,RGB(55,211,100));

SetPixel(hDC,600-i,450-(i-300)*(i-300)*0.01,RGB(0,11,255));

 

}

 

DeleteObject((HGDIOBJ)hpenRed );

DeleteObject((HGDIOBJ)hpenOld );

EndPaint(hWnd,&PaintStruct);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hWnd,Message,wParam,lParam);

}