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);
}