特殊说明:版权归个人所有,请勿转载,谢谢合作。
现在已经理解了画笔与画刷的概念以及创建的过程,接下来学习一下它们在实际程序中绘制图形的方法。
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 | 绘制一个带圆角的矩形 |