特殊说明:版权归个人所有,请勿转载,谢谢合作。
现在已经理解了画笔与画刷的概念以及创建的过程,接下来学习一下它们在实际程序中绘制图形的方法。
5.3.1 绘制像素点
在使用GDI绘制点是件很容易的事,不需要使用画笔或画刷,因为一个点只是一个像素,选定画笔与画刷,并不起到任何作用。【例5-3】是在窗口200×200的位置随机绘制2000个像素点:
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (i = 0; i < 2000; ++i) { int x = rand()%200; int y = rand()%200; SetPixel(hdc, x, y, RGB(0, 0, 0)); }//end for EndPaint(hWnd, &ps); break;
程序执行效果如图5.3所示。
- 图5.3 像素点绘制
5.3.2 绘制直线
绘制直线使用MoveToEx与LineTo两个函数来实现,MoveToEx函数是确定直线的起始点坐标位置,函数原型如下:
BOOL MoveToEx( HDC hdc, // handle to device context int X, // x-coordinate of new current position int Y, // y-coordinate of new current position LPPOINT lpPoint // pointer to old current position );
参数hdc为设备环境句柄,X、Y则是起始点的坐标位置,lpPoint为光标的旧位置,一个指向POINT结构的指针,用来存放上一个点的位置。
LineTo函数用来确定直线的结束坐标位置,并进行画线操作,函数原型如下:
BOOL LineTo( HDC hdc, // device context handle int nXEnd, // x-coordinate of line's ending point int nYEnd // y-coordinate of line's ending point );
参数hdc为设备环境句柄,nXEnd、nYEnd为直线的终点。
如果绘制一条直线,需要使用这两个函数方可实现,具体代码如下所示:
MoveToEx(hdc,100,50,NULL); LineTo(hdc,200,300);
如果只使用MoveToEx与LineTo来绘制直线,直线默认为1像素黑色线,但如果绘制其他颜色风格的直线,就需要使用画笔,下例是绘制一条3像素实线型的直线,直线的颜色为红色。
// 图形绘制事件 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); { // 绘制示例 HPEN hPen= CreatePen( PS_SOLID,3,RGB(255,0,0)); HPEN hOldPen = (HPEN) SelectObject(hdc,hPen); MoveToEx(hdc,100,50,NULL); LineTo(hdc,200,300); SelectObject(hdc,hOldPen); DeleteObject(hPen); } EndPaint(hWnd, &ps); break;
程序执行结果如图5.4所示。
- 图5.4 绘制直线
5.3.3 绘制矩形
矩形绘制,可以使用Rectangle函数直接绘制,Rectangle函数原型如下:
BOOL Rectangle( HDC hdc, // handle to device context int nLeftRect, // x-coord of bounding rectangle's upper-left corner int nTopRect, // y-coord of bounding rectangle's upper-left corner int nRightRect, // x-coord of bounding rectangle's lower-right corner int nBottomRect // y-coord of bounding rectangle's lower-right corner );
参数hdc,设备环境句柄。
参数nLeftRect,指定矩形左上角的逻辑X坐标。
参数nTopRect,指定矩形左上角的逻辑Y坐标。
参数nRightRect,指定矩形右下角的逻辑X坐标。
参数nBottomRect,指定矩形右下角的逻辑Y坐标。
如果需要对矩形内部区域进行填充,就需要使用画刷。下列是创建粉红色矩形框:
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); { // 画刷实例 HBRUSH hBrush = CreateSolidBrush(RGB(255,0,255)); HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc,hBrush); Rectangle(hdc,50,50,400,400); SelectObject(hdc,hOldBrush); DeleteObject(hBrush); } EndPaint(hWnd, &ps); break;
程序执行结果如图5.5所示。
- 图5.5 绘制矩形
5.3.4 其他图形绘制函数
Windows GDI函数有很多,前面介绍的是两种最常用的绘制方法,更多的函数可以参阅MSDN。下面对GDI函数进行了分类,并进行简单介绍。
绘制直线与曲线的函数有很多,如表5.5所示,简单地对常用的绘制函数进行介绍,这些函数已经足够绘制各种各样的图形(包括汽车建模模型)。
- 表5.5 绘制直线和曲线的函数
函数 | 描述 |
MoveTo | 在绘制直线前,设定当前位置 |
LineTo | 从当前位置绘制一条线到指定位置,并将当前位置移至线的终点 |
Polyline | 将一系列点用线段连接起来 |
PolylineTo | 从当前位置开始,将一系列点用线段连接起来,并将当前位置移正至折线的终点 |
Arc | 绘制一个弧 |
ArcTo | 绘制一个弧,并将当前位置移至弧的终点 |
PolyBezier | 绘制一条或多条贝塞尔样式曲线 |
PolyBezierTo | 绘制一条或多条贝塞尔样式曲线,并将当前位置移至最后一段样式曲线的终点 |
PolyDraw | 通过一组点绘制一系列线段和贝塞尔样式曲线,并将当前位置移至最后一个线段或样式曲线的终点 |
GDI不会限制简单的直线和曲线上,还有其他很多封闭图形,如表5.6所示,列出了常用的绘制函数。
- 表5.6 绘制封闭图形的函数
函数 | 描述 |
Chord | 绘制一个由椭圆和直线相交后围成的封闭图形 |
Ellipse | 绘制一个圆或椭圆 |
Pie | 绘制一个饼状图形 |
Polygon | 连接一组点形成一个多边形 |
Rectangle | 绘制一个带直角的矩形 |
RoundRect | 绘制一个带圆角的矩形 |