VC|MFC的CDC类及如何使用画笔绘制各种图形(mfc创建画笔)
CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员。另外还为绘制文本、处理字体,使用打印机跳转,滚动和播放元文件提供成员函数。
它还为获取和设置绘图属性、映射,处理视点、窗口扩展、转换坐标,处理区域、剪贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。
可以通过CDC对象的成员函数进行所有的绘图。
其对象层次结构如下:
类名 | 说明 |
CPaintDC | 窗口用户区的设备描述环境,在OnDraw()函数中来处理WM_PAINT消息 |
CClientDC | 窗口客户区的设备描述环境,但应用在WM_PAINT消息之外的消息处理函数中 |
CWindowDC | 在整个窗口内(不只是用户区)绘图的设备描述环境 |
CMetaFileDC | 图元文件的设备描述环境,在创建可以回放的图像时使用 |
专门用于在应用程序窗口客户区绘图的CPaintDC,是所有CDC子类中最常用的一个类。为了防止程序设计人员误把绘图代码写到其他位置,MFC规定,CPaintDC对象只在CView类的OnDraw( )函数中有效。并且为了方便和引起程序员注意,MFC AppWizard在自动为用户生成的CVeiw派生类代码中就生成了如下框架代码:
OnDraw(CDC *Pdc)
{……..}
其中,函数的参数pDC就是指向CPaintDC对象的指针。
系统每次创建应用程序窗口及窗口需要刷新时就会产生WM_PAINT消息,系统接收到这个消息就会自动调用OnDraw( )函数。应用程序也可以调用相关函数来激活OnDraw( ),所以程序中所有对窗口客户区进行绘图的代码都应该写在这个函数中。
CDC类有很多成员函数,包括绘制点、直线、矩形、椭圆、多边形、文本以及位图等的成员函数。
以下是一个小实例:
// Ch9Demo3View.cpp
void CCh9Demo3View::OnDraw(CDC* pDC)
{
CCh9Demo3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen pen[5];
//创建实线画笔
pen[0].CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
//创建虚线画笔
pen[1].CreatePen(PS_DASH, 1, RGB(0, 255, 0));
//创建点线画笔
pen[2].CreatePen(PS_DOT, 1, RGB(0, 0, 255));
//创建点划线画笔
pen[3].CreatePen(PS_DASHDOT, 1, RGB(0, 255, 255));
// 创建双点划线画笔
pen[4].CreatePen(PS_DASHDOTDOT, 1, RGB(255, 0, 255));
// 保存指向设备上下文原有画笔的指针
CPen *pOldPen;
//以实线画笔绘制矩形
pOldPen=pDC->SelectObject(&pen[0]);
pDC->Rectangle(10, 10, 110, 110);
pDC->TextOut(10, 115, “Rectangle绘制矩形”);
//使用虚线画笔和函数Polyline输出多段折线
pDC->SelectObject(&pen[1]);//载入画笔
pDC->Rectangle(180, 10, 330, 110);//绘制矩形
CPoint pts[]={CPoint(190, 20), CPoint(200, 60), CPoint(270, 40), CPoint(210, 80),
CPoint(250, 100), CPoint(300, 30), CPoint(310, 80)};
pDC->Polyline(pts, 7);//绘制多端折线
pDC->TextOut(180, 115, “Polyline绘制多段折线”);
// 使用Pie和Arc输出饼图和弧形
pDC->SelectObject(&pen[2]);//载入点线画笔
pDC->Ellipse(10, 140, 160, 240);
pDC->SelectObject(&pen[3]);//载入点划线画笔
pDC->Pie(20, 150, 150, 230, 160, 160, 10, 160);
pDC->SelectObject(&pen[4]);//载入双点划线画笔
pDC->Arc(20, 150, 150, 230, 10, 220, 160, 220);
pDC->TextOut(10, 245, “不同画笔绘制椭圆、弧形和饼图”);
//恢复设备上下文的原有画笔
pDC->SelectObject(pOldPen);
//删除所创建的画笔资源
for (int i=0; i<5; i )
pen[i].DeleteObject();
}
绘制弧形需要4个坐标点,函数原型如下:
Arc(int x1,int x2, int x3, int x4, int x5, int x6, int x7, int x8)
4个坐标点如下图所示:
Pie()函数的参数与上述Arc()函数相同。
-End-