第26周-window程序设计(基础篇)-第5章(图形基础)-Polygon函数和多边形填入方式

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);
  }
结果:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值