Windows程序设计--画几何图形

常用的几何图形有以下几种:

直角矩形:Rectangle
椭圆 :Ellipse
圆角矩形:RoundRect
椭圆周上的弧,两端以弦连接:Chord
椭圆上的饼图:Pie
多边形:Polygon
多个多边形:PolyPolygon

函数原型如下:

画直角矩形

BOOL Rectangle(
  HDC hdc,         // 设备环境句柄
  int nLeftRect,   // 左上角x
  int nTopRect,    // 左上角y
  int nRightRect,  // 右下角x
  int nBottomRect  // 右下角y
);

例如:

 hdc = BeginPaint(hwnd, &ps); hPen = CreatePen(PS_SOLID, 4, RGB(255, 255, 0)); SelectObject(hdc, hPen); Rectangle(hdc, 100, 100, 300, 300); EndPaint(hwnd, &ps); DeleteObject(hPen);


如果想填充颜色有两种办法,第一种就是利用自定义画刷自动填充。
第二种就是利用FillRect函数,其原型如下:

int FillRect(
  HDC hDC,           // 设备环境句柄
  CONST RECT *lprc,  // 矩形区域
  HBRUSH hbr         // 画刷
);

用这个填充颜色还需要一个函数SetRect,因为你要设置一个填充的区域.其原型如下:
//设置矩形区域

BOOL SetRect(
  LPRECT lprc, // 矩形区域
  int xLeft,   // 左上角x
  int yTop,    // 左上角y
  int xRight,  // 右下角x
  int yBottom  // 右下角y
);

用来填充颜色的画刷不用事先选入设备环境句柄,例如:

hdc = BeginPaint(hwnd, &ps);

        hPen = CreatePen(PS_SOLID, 4, RGB(255, 255, 0));
        SelectObject(hdc, hPen);
        //使用纯画刷
        logbrush.lbStyle = BS_SOLID;
        //使用阴影画刷
        //logbrush.lbStyle = BS_HATCHED;
        logbrush.lbHatch = HS_CROSS;
        logbrush.lbColor = RGB(255, 255, 0);

        hBrush = CreateBrushIndirect(&logbrush);
        //画矩形
        Rectangle(hdc, 100, 100, 300, 300);
        //设置填充区域
        SetRect(&rect, 100, 100, 300, 300);
        //填充颜色
        FillRect(hdc, &rect, hBrush);

        EndPaint(hwnd, &ps);
        DeleteObject(hPen);

Windows程序设计--画几何图形_第1张图片

画椭圆
这个函数的参数和矩形参数是一样的。

BOOL Ellipse(
  HDC hdc,        
  int nLeftRect,  
  int nTopRect,   
  int nRightRect,
  int nBottomRect 
);

例如:
椭圆你不能用上面那个方法来填充颜色,只能用自定义画刷,然后选入DC中自动填充

 hBrush = CreateBrushIndirect(&logbrush); SelectObject(hdc, hBrush); Ellipse(hdc, 100, 100, 300, 300);

圆角矩形

BOOL RoundRect(
  HDC hdc,         //设备环境句柄
  int nLeftRect,   // 左上角x
  int nTopRect,    // 左上角y
  int nRightRect,  // 右下角x
  int nBottomRect, // 右下角y
  int nWidth,      // 椭圆宽度
  int nHeight      // 椭圆高度
);

其中前面五个参数和矩形一样,后面两个参数是矩形四个角的椭圆参数。意思就是矩形的四个角被椭圆化了,当后面两个参数为0的时候,这个函数和矩形函数一模一样。
如图:
nWidth=100,nHeight=100;
Windows程序设计--画几何图形_第2张图片
nWidth=0,nHeight=0;

椭圆周上的弧,两端以弦连接

BOOL Chord(
  HDC hdc,         //设备环境句柄
  int nLeftRect,   // 左上角x
  int nTopRect,    // 左上角y
  int nRightRect,  // 右下角x
  int nBottomRect, // 右下角y
  int nXRadial1,   // 
  int nYRadial1,   // 第一个与圆心连接的半径
  int nXRadial2,   // 
  int nYRadial2    // 第二个与圆心连接的半径
);

简单的说就是有一个椭圆,割去一部分,然后用弦连接起来,后面四个参数就是两个连接点的位置。如图:
Windows程序设计--画几何图形_第3张图片
那根横线就是弦,那两点坐标就是后面四个参数。

椭圆上的饼图

BOOL Pie(
  HDC hdc,         
  int nLeftRect,   
  int nTopRect,    
  int nRightRect,  
  int nBottomRect, 
  int nXRadial1,   
  int nYRadial1,   
  int nXRadial2,   
  int nYRadial2    
);

参数和Chord函数一模一样,只是处理的结果不一样,这个是把一段弧擦掉,然后把两个端点与圆心相连。
如图

多边形

BOOL Polygon(
  HDC hdc,     // 设备环境句柄 
   CONST POINT *lpPoints,  // 边的集合,两点确定一条边
  int nCount              // 总共有多少条边
  );

点和点之间的连线顺序是按照0 1 2 3的顺序连的,这里举个简单的例子,还可以多加N个点进去,例如:

        apt[0].x = 100;
        apt[0].y = 100;
        apt[1].x = 100;
        apt[1].y = 300;
        apt[2].x = 300;
        apt[2].y = 300;
        apt[3].x = 300;
        apt[3].y = 100;

        Polygon(hdc, apt, 4);

多个多边形

BOOL PolyPolygon(
  HDC hdc,                  // 设备环境句柄
  CONST POINT *lpPoints,    // 边的集合
  CONST INT *lpPolyCounts,  // 每个多边形的边数
  int nCount                // 多少个多边形
);

例如:

//第一个多边形
        apt[0].x = 100;
        apt[0].y = 100;
        apt[1].x = 100;
        apt[1].y = 300;
        apt[2].x = 300;
        apt[2].y = 300;
        apt[3].x = 300;
        apt[3].y = 100;
        //第二个多边形
        apt[4].x = 400;
        apt[4].y = 100;
        apt[5].x = 400;
        apt[5].y = 300;
        apt[6].x = 600;
        apt[6].y = 300;
        apt[7].x = 600;
        apt[7].y = 100;
        //第一个多边形的边数
        lpPolyCounts[0] = 4;
        //第二个多边形的边数
        lpPolyCounts[1] = 4;
        //画多个多边形
        PolyPolygon(hdc, apt, lpPolyCounts, 2);

如图:

再补充几个填充函数:
使用画刷绘制矩形框

int FrameRect(
  HDC hDC,           // handle to DC
  CONST RECT *lprc,  // rectangle
  HBRUSH hbr         // handle to brush
);

反转矩形内所有的像素

BOOL InvertRect(
  HDC hDC,           // handle to DC
  CONST RECT *lprc   // rectangle
);

你可能感兴趣的:(windows,函数,设计,图形)