1、Polygon函数和多边形填入方式:
*/
Polygon(hdc,apt,iCount);//apt是POINT数组,iCount点数目,它将第一个点与最后一个点连起来,Polyline不会这么做。
PolyPolygon(hdc,apt,aiCounts,iPolyCount); //iPolyCount多边形个数,aiCounts数组时多边形端点数,apt具有全部多边形所有的点
PolyPolygon在功能上与下面的代码相同:
for(i = 0;iAccum =0;i<iPolyCount;i++)
{
Polgon(hdc,apt+iAccum,aiCounts[i]);
iAccum += aiCounts[i];
}
/*在设备内容中的目前画刷来填入这个带边界的区域*/
SetPolyFillMode(hdc,iMode);
2、ALTWIND.C
/*ALTWIND.C——Alternate and Winding Fill Modes*/
#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("AltWind");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName= NULL ;
wndclass.lpszClassName= szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Alternate and Winding Fill Modes"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static POINT aptFigure[10] = {10,70, 50,70, 50,10, 90,10, 90,50,
30,50, 30,90, 70,90, 70,30, 10,30}; //图形的坐标(划分为100×100个单位)储存在aptFigure数组中。
static int cxClient,cyClient;
HDC hdc;
int i;
PAINTSTRUCT ps;
POINT apt[10];
switch(message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
SelectObject(hdc,GetStockObject(GRAY_BRUSH));
for(i = 0;i<10;i++ )
{
apt[i].x = cxClient*aptFigure[i].x/200;
apt[i].y = cyClient*aptFigure[i].y/100;
}
SetPolyFillMode(hdc,ALTERNATE);
Polygon(hdc,apt,10);
for(i = 0; i<10; i++)
{
apt[i].x += cxClient/2; //在原来apt[i].x的基础上增加客户区水平宽度的一半
}
SetPolyFillMode(hdc,WINDING);
Polygon(hdc,apt,10);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
结果: