一.MFC中与GDI有关的类
为了支持GDI绘图,MFC提供了两种重要的类:设备环境DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。
二.MFC中GDI绘图
GDI绘图包括以下步骤:获取设备环境,设置坐标映射,创建绘图工具,调用DC绘图函数绘图。
1、在MFC中,MFC提供了不同类型的DC类。
<1> CPaintDC构造函数:CPaintDC(CWnd* pWnd); 构造一个CPaintDC对象(pWnd指向一个CPaintDC对象所属的CWnd对象),准备用于绘画的应用程序窗口。
void CView::OnPaint()
{
CPaintDC dc(this);
// TODO: Add your message handler code here
OnPrepareDC(&dc);
OnDraw(&dc)
}
<2>CClientDC构造函数:CClientDC(CWnd* pWnd); 构造一个CClientDC对象,它将存取pWnd指向的CWnd的客户区。
// 鼠标左键事件处理
void CExView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);//定义客户区设备环境
dc.LineTo(point);//绘制线段
}
<3>CWindowDC构造函数:CWindowDC( CWnd* pWnd );构造一个CWindowDC对象,它可以访问pWnd指向的CWnd对象的整个屏幕区域(包括客户区和非客户区)。比如我们在做屏幕保护程序时,一般以整个屏幕区域作为绘制区域。
2、设置坐标映射
3、创建绘图工具并选入DC
MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen、CBrush、CFont、CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类。
例:
CPen *pOldPen,newPen;
CBrush *pOldBrush,newBrush1,newBrush2;
//创建宽度为pixel的白色实线画笔
newPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
//创建红色实线画刷
newBrush1.CreateSolidBrush(RGB(255,0,0));
//创建红色实线度的向下(从右到左)影线的阴影画刷
newBrush2.CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));
//将newPen画笔和newBrush1画刷对象选入设备环境
pOldPen = pDC->SelectObject(&newPen);
pOldBrush = pDC->SelectObject(&newBrush1);
//调用DC绘图函数绘图
//……
//绘图完毕,恢复原来画笔、画刷
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
//删除创建的画笔、画刷
newPen.DeleteObject();
newBrush1.DeleteObject();
newBrush2.DeleteObject();
4、调用DC绘图函数绘图
GDI提供了绘制基本图形的成员函数,在MFC中这些函数封装在CDC类中。
注意:绘图函数使用的坐标都是逻辑坐标。
常用CDC绘图函数 | |
函数 | 功能 |
线输出函数 | |
GetCurrentPosition | 获取笔的当前位置(以逻辑坐标表示) |
MoveTo | 移动当前位置 |
LineTo | 从当前位置到一点画直线,但不包括那个点 |
Arc | 画一段椭圆弧 |
ArcTo | 画一段椭圆弧。除了更新当前位置以外,这个函数与Arc类似 |
PolyPolyline | 画多组相连线段。这个函数不使用也不更新当前位置 |
PolylineTo | 画一条或多条直线,并把当前位置移到最后一条直线的终点 |
PolyBezier | 画一条或多条Bezier样条。不使用也不更新当前位置 |
PolyBezierTo | 画一条或多条Bezier样条,并把当前位置移到最后一条Bezier样条的终点 |
椭圆和多边形函数 | |
Chord | 绘制椭圆弧(椭圆和一条线段相交围成的闭合图形) |
DrawFocusRect | 绘制用于表示焦点的风格的矩形 |
Ellipse | 绘制椭圆 |
Pie | 绘制饼形图 |
Polygon | 绘制多边形,包含由线段连接的一个或多个点(顶点) |
PolyPolygon | 创建使用当前多边形填充模式的两个或多个多边形,多边形可以相互分开或叠加 |
Polyline | 绘制多边形,包含连接指定点的一组线段 |
Rectangle | 使用当前笔绘制矩形,用当前画刷填充 |
RoundRect | 使用当前笔绘制圆角矩形,用当前画刷填充 |
位图函数 | |
BitBlt | 从指定设备上下文拷贝位图 |
StretchBlt | 把位图由源矩形和设备移动到目标矩形,必要时拉伸或压缩位图以适合目标矩形的维数 |
GetPixel | 获取指定点像素的RGB颜色值 |
SetPixel | 设置指定点像素为最接近指定色的近似值 |
文本函数 | |
TextOut | 用当前选取字体在指定位置写字符串 |
ExtTextOut | 用当前选取字体在矩形区域写字符串 |
TabbedTextOut | 在指定位置写字符串,制表符扩展为制表符停止位置数组中指定值 |
DrawText | 在指定矩形内绘制格式化文本 |
------------------------------详情参考MSDN、MFC类库详解--------------------------- |
摘自博客网址:http://blog.csdn.net/phunxm/article/details/5083119