本文(略有修改)转载自Win32绘图总结篇(点、直线、折线、贝塞尔曲线、矩形、椭圆、圆弧、弓形、扇形、多边形等)_win32 画点-优快云博客
前言:
想在窗口上绘制出各种各样的图形,Windows给我们提供了大量的API函数,这些绘图函数种类很多,基本上能满足我们的绘图需求。
一、画笔和画刷
画笔画刷的使用步骤:(两者使用一致)
1.创建画笔或画刷。
2.选取画笔或画刷(选入设备环境,记得保留先前画笔和画刷)(用SelectObject,此函数返回值为先前画笔画刷)。
3.使用绘图函数进行绘图。
4.删除自己所创建的画笔或画刷。(用DeleteObject)
画笔:
画笔的不同创建:
1.GetStockObject函数
GetStockObject 函数用于获得 Windows 预设的画笔、画刷、字体或者调色板的句柄。 (样式获取点击上面链接即可)
HGDIOBJ GetStockObject( _In_ int fnObject);//指定待获取对象的类型
注意: 当样式为DC_BRUSH或DC_PEN时,需要调用 SetDCBrushColor 或 SetDCPenColor 函数可以修改该值的颜色,将当前设备上下文环境(DC)的笔颜色设置为指定颜色值。
2.CreatePen函数
CreatePen是指定的样式、宽度和颜色创建画笔。返回画笔HPEN
HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor);//样式、笔宽、颜色
Style 参数可选值: | 含义 |
PS_SOLID = 0 | 实线 |
PS_DASH = 1 | 段线; 要求笔宽<=1 |
PS_DOT = 2; | 点线; 要求笔宽<=1 |
PS_DASHDOT = 3 | 线、点; 要求笔宽<=1 |
PS_DASHDOTDOT = 4 | 线、点、点; 要求笔宽<=1 |
PS_NULL = 5; | 不可见 |
PS_INSIDEFRAME = 6 | 实线; 但笔宽是向里扩展 |
3.CreatePenIndirect函数
CreatePenIndirect,根据指定的LOGPEN结构创建,这个结构与CreatePen函数的参数非常接近.
画笔使用实例:
HPEN hpen = CreatePen(PS_SOLID,0,RDB(255,0,0)); //创建 一条红色实线
HPEN oldhpen = SelectObject(hdc,hpen); // 画笔选入设备环境,并保留先前画笔
MoveToEx(hdc,0,0,NULL); //画一条直线
LineTo(hdc,100,100);
SelectObject(hdc,oldhpen); // 恢复先前画笔
DeleteObject(hpen); // 删除创建画笔hpen
画刷:
画刷的不同创建:
1. 实心画刷CreateSolidBrush函数
HBRUSH CreateSolidBrush(COLORREF clrref);// 参数为填充颜色RGB的值
CreateSolidBrush函数,该函数创建一个具有指定颜色的逻辑刷子。画笔可以随后被选为任何设备上下文的当前刷子。
2. 阴影画刷CreateHatchBrush函数
HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);// fnStyle:指定刷子的阴影样式、cirref:指定用于阴影的刷子的前景色
样式 | 说明 |
HS_BDIAGONAL | 表示45度向上,从左至右的阴影(/) |
HS_CROSS | 水平和垂直交叉阴影(+++++) |
HS_DIAGCROSS | 45度交叉阴影(XXXXX) |
HS_FDIAGONAL | 45度向下,自左至右阴影(\\\) |
HS_HORIZONTAL | 水平阴影(-----) |
HS_VERTICAL | 垂直阴影(||||||) |
3. CreateBrushIndirect函数
HBRUSH CreateBrushlndirect(CONST LOGBRUSH *lplb);// LOGBRUSH结构体
CreateBrushIndirect,可以创建具有指定风格、颜色和模式的逻辑刷子。
LOGBRUSH结构体
画刷使用实例:
HBRUSH hbrush = CreateSolidBrush(RGB(0,255,0)); // 创建一个绿色实心画刷
HBRUSH oldhbrush = SelectObject(hdc,hbrush); // 选入设备环境,并保留先前画刷
Rectangle(hdc,100,100,200,200); // 绘制一个矩形
SelectObject(hdc,oldhbrush); // 恢复画刷
DeleteObject(hbrush); // 删除创建画刷
二、绘图
1. 一个点的绘制
API函数:
绘制:
COLORREF SetPixel(HDC hdc,int X,int Y, COLORREF crColor );//参数:DC句柄、x坐标,y坐标,绘制颜色
取色:
COLORREF GetPixel(HDC hdc,int XPos,int nYPos); //参数:DC句柄、x坐标、y坐标
2. 直线的绘制
API函数:
如果无MoveToEx,直线默认起点为原点(0,0);GetCurrentPositionEx函数能够获取当前位置。
BOOL MoveToEx(HDC hdc, int X, int Y, LPPOINT lpPoint); //参数:DC句柄、设置的新点x坐标,新的y坐标,lpPoint是指向POINT结构的指针,用来存放上一个点的位置,若为NULL,则不保存上一个点的位置。
BOOL LineTo(HDC hdc, int nXEnd, int YEnd); //参数:DC句柄,直线终点x坐标,直线终点y坐标
3. 折线的绘制
API函数:
PolylineTo 与Polyline类似, PolylineTo的不同就是:在绘制折线前,会将当前位置连一根线到折线的第一个顶点。
BOOL Polyline(HDC hdc,CONST POINT *lppt, int cPoints); //一条折线的绘制。参数:DC句柄、顶点的坐标数组、顶点的个数
BOOL PolyPolyline(HDC hdc, CONST POINT *lppt, CONST DWORD *lpdwPolyPoints, DWORD cCount ); //多条折线的绘制。参数:DC句柄、所有点的数组(按顺序)、每条顶点个数的数组、折线的条数
4. 贝塞尔曲线的绘制
API函数:
4个点: 1和4是端点,2.3点是控制点
7个点: 1.4.7是端点,其余是控制点
BOOL PolyBezier(HDC hdc, CONST POINT *lppt, DWORD cPoints ); //参数:DC句柄、点数组-最少4个点、点的数量
5. 矩形的绘制
API函数:
BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); //普通矩形绘制。参数:DC句柄、左上X坐标、左上Y坐标、右下X坐标、右下Y坐标
BOOL RoundRect(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidth, int nHeight ); //圆角矩形绘制。最后两个参数:生成圆角的椭圆的宽度、生成圆角的椭圆的高度
6. 椭圆和圆的绘制
API函数:
椭圆和圆由外切矩形控制。
BOOL Ellipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);//参数:DC句柄、圆的左切边、圆的上切边、圆的右切边、圆的下切边。
7. 圆弧的绘制
API函数:
Arc函数: 可以使用SetArcDirection函数,设置Arc函数切割方向,顺时针和逆时针。这里所说的切割半径坐标意思是说,此坐标与椭圆中点的连线为半径,两条半径之间形成弧。
BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc ); //参数:DC句柄、外切矩形的坐标、外切矩形的坐标、外切矩形的坐标、外切矩形的坐标、起始切割半径的X坐标、起始切割半径的Y坐标、终止切割半径的X坐标、终止切割半径的X坐标
AngleArc函数: 直线连弧绘制函数,需要注意的 ,会与当前位置连接起来。
BOOL AngleArc(HDC hdc, int X, int Y, DWORD dwRadius, FLOAT eStartAngle, FLOAT eSweepAngle ); // 参数:DC句柄、圆心的X坐标、圆心的Y坐标、圆的半径、开始角度、夹角
8. 弓形弦的绘制
API函数:
填充图形,弧的首尾相连形成弓形。
BOOL Chord(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2 ); //参数:DC句柄,左切边,上切边,右切边,下切边,切割起始半径X坐标、切割起始半径Y坐标、切割终止半径X坐标、切割终止半径Y坐标
9. 扇形饼的绘制
API函数:
BOOL Pie(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2 ); //参数:DC句柄,左切边,上切边,右切边,下切边,切割起始半径X坐标、切割起始半径Y坐标、切割终止半径X坐标、切割终止半径Y坐标
10. 多边形的绘制
在多边形绘制这里会有用到多边形填充模式,填充模式一共有两种:ALTERANATE(交替式,默认)
和WINDING(螺旋式)
。用SetPolyFillMode函数设置
API函数:
一个多边形的绘制:
BOOL Polygon(HDC hdc, CONST POINT *lpPoints, int nCount ); //参数:DC句柄、多边形的顶点、顶点的数量
多个多边形的绘制:
第二个参数中各多边形是连续定义的,每个多边形通过画一条从最后中一个顶点到第一个顶点的线段而自动闭合起来,每个顶点应被定义一次。
BOOL PolyPolygon(HDC hdc, CONST POINT *lpPoints, CONST INT *lpPolyCounts, int nCount); //参数:DC句柄、顶点的POINT结构数组的指针、整数数组的指针-每个整数指定相应多边表的点数-每个整数必须大于等于2、指定多边形的总个数