常用的几何图形有以下几种:
直角矩形: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);
画椭圆
这个函数的参数和矩形参数是一样的。
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;
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 // 第二个与圆心连接的半径
);
简单的说就是有一个椭圆,割去一部分,然后用弦连接起来,后面四个参数就是两个连接点的位置。如图:
那根横线就是弦,那两点坐标就是后面四个参数。
椭圆上的饼图
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
);