第二章 MFC 绘图基础

  • 格式:pps
  • 大小:2.89 MB
  • 文档页数:108

MFC上机操作步骤

MFC绘图方法

CDC类的主要绘图成员函数

设备上下文的调用和释放

双缓冲机制

MFC

绘制图形的几种方法本章学习目标

2.1 MFC上机操作步骤

2.2 MFC绘图方法

2.3 设备上下文的调用与释放

2.4 双缓冲机制

2.5 MFC绘图的几种方法

2.6

本章小结本章内容

微软基类库MFC(microsoft foundation class

library,MFC)是以C++形式封装的Windows API

(Application Program Interface),包含了200多个

已经定义好的常用基类。在程序设计过程中,一般是通

过MFC

调用基类的成员函数来完成设计任务的。2.1 MFC上机操作步骤

1. 从Windows的开始菜单中启动Microsoft Visual

C++ 6.0,如图2-1

所示。

图2-1 Visual C++启动菜单

2. 在Visual C++集成开发环境中,从File|New菜单命令,

弹出New对话框,切换到Projects选项卡。如图2-2

所示。

图2-2 New 对话框

3. 在MFC AppWizard-Step1对话框中,选中Single

Document单选按钮,其余保持默认值,如图2-3所示。单

击Finish按钮。

图2-3 MFC AppWizard-Step1 对话框

4. 弹出New Project Information对话框。如图2-4所示。

单击OK

按钮。

图2-4 New Project Information 对话框

5. 完成上述步骤后,Test工程的MFC应用程序框架已经

生成。如图2-5

所示。

图2-5 应用程序框架

6. 在应用程序框架的ClassView标签页中显示所创建

的类和成员函数;在ResourceView标签页板中显示所

创建的资源;在FileView标签页中显示源程序文件。如

图2-6

所示。

图2-6 应用程序框架的三个标签页显示

标签页:

从ClassView标签页可以看出,CTestApp是应用的

主函数类,用来处理消息。MFC中的数据是存储在

CTestDoc类文档中,而结果却显示在CTestView类中,

即显示在CMainFram类的客户区中。MFC中的文档/视图

结构用来将程序的数据本身和数据显示相互隔离,文

档类负责管理和维护数据本身,视图类负责处理用户

鼠标和键盘的操作。

全部展开FileView标签页后,显示如图2-7所示的

内容。本书后续的编程过程中一般使用的是CTestView

类的TestView.h头文件和TestView.cpp源文件。

图2-7 FileView标签页的展开显示

在CTestView类的源文件TestView.cpp中可以找到

OnDraw()函数

。其内容如下:

void CTestView::OnDraw(CDC* pDC)

{

CTestDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here}

pDC定义为CDC类的指针。pDoc通过GetDocument()函数得到指向文档类CTestDoc的指针。ASSERT_VALID(pDoc)函数使pDoc指针有效。使用pDC指针,可以对CDC类的成员函数进行操作。OnDraw()函数由系统框架直接调用,程序一运行就会自动执行。

7. 点击工具条上的按钮(如图2-8所示),就可以直

接编译、运行程序。Test工程运行结果如图2-9所示。尽管未编写一句代码,但

Test

程序已经形成一个可执

行程序框架。图2-8 执行按钮图2-9 Test工程运行效果图

2.2 MFC

绘图方法

MFC运算功能强大,拥有完备的绘图功能。

在Windows平台上,应用程序的图形设备接口(

graphics device interface,GDI)被抽象为设备上下

文(Device Context,DC)。

在微软基类库MFC中,CDC类是定义设备上下文对象

的基类,所有绘图函数都在CDC基类中定义。当需要输出

文字或图形时,就需要调用CDC类的成员函数,这些成员

函数具备输出文本、绘制图形的功能。

本节讲解的例程全部在TestView.cpp文件的

void CTestView::OnDraw(CDC* pDC)函数中实现。2.2.1 CDC类结构和GDI对象

CDC类派生了CClientDC类、CMetaFileDC类、

CPaintDC类和CWindowDC类。如图2-10所示。

图2-10 CDC

类1.CDC类CClientDC类:

显示器客户区设备上下文类。

•CClientDC只能在窗口的客户区进行绘图。

(不包括边框、标题栏、菜单栏及状态栏的空白区域)

•点(0,0)是客户区的左上角。

•构造函数自动调用GetDC()函数,析构函数自动调用

ReleaseDC()函数。CMetaFileDC类:

Windows图元文件设备上下文类。

•CMetaFileDC封装了在Windows中绘制图元文件的方法。

•图元文件是微软定义的一种Windows平台下的与设备

无关的的图形文件格式(扩展名为wmf),其所占的磁

盘空间比其它任何格式的图形文件都要小得多。

•wmf格式文件通常用于存储一系列由绘图命令所描述

的图形(如绘制直线与文本等)。

•在建立图元文件时,不能实现即绘即得,而是先将

GDI调用记录在图元文件中,然后在GDI环境中重新执

行图元文件,才可显示图像。CPaintDC类:

CPaintDC对象只在响应WM_PAINT消息时使用。

•CPaintDC类的构造函数会自动调用BeginPaint()函数。

CPaintDC类的析构函数则会自动调用EndPaint()函数。

•MFC程序中使用CPaintDC类在视图窗口中绘图时,需

要先添加WM_PAINT消息的映射函数OnPaint(),然后在

OnPaint()函数中编写与CPaintDC类相关的代码,而不

是编写在OnDraw()中。

•请注意,如果使用OnPaint()函数响应了WM_PAINT消

息,则OnDraw()函数将会被自动屏蔽。CWindowDC类:

整个屏幕区域的显示器设备上下文类。包括客户

区和非客户区。

•CWindowDC允许在整个屏幕区域内进行绘图,其构造

函数自动调用GetWindowDC(),析构函数自动调用

ReleaseDC()函数。

•CWindowDC中的点(0,0)在屏幕的左上角,而

CClientDC和CPaintDC中的点(0,0)是屏幕客户区的

左上角。

•如果在CTestView类中使用CWindowDC类对象进行绘图,

只有在使用GetParent()函数获得CWnd指针后,才能在

整个屏幕区域内绘图。

图2-11

绘图对象类2. 常用绘图类

包括CPoint、CRect、CSize等,如图2-11所示。由

于CPoint、CRect和CSize是对Windows的POINT、RECT和

SIZE结构体的封装,因此可以直接使用其成员变量。CPoint类:存放点坐标(x,y)。相应的POINT

结构体定义为

typedef struct tagPOINT

{

LONG x; //点的x坐标

LONG y;//点的y坐标

} POINT, *PPOINT; CRect

类:

存放矩形左上角点和右下角点的坐标(left,top

,right,bottom),相应的RECT

结构体定义为typedef struct _RECT

{

LONG left;//左上角点的x坐标

LONG top;//左上角点的y坐标

LONG right;//右下角点的x坐标

LONG bottom;//右下角点的y坐标

} RECT, *PRECT;

存放矩形x方向的长度和y方向的长度(cx,cy),

相应的SIZE结构体定义为CSize

类:

typedefstructtagSIZE

{

LONG cx; //矩形的宽度

LONG cy; //矩形的高度} SIZE, *PSIZE;

3.

绘图工具类

图2-12

绘图工具类包括CGdiObject、CBitmap、

CBrush、CFont、CPalette、

CPen、CRgn等,如图2-12所示。

CGdiObject类:GDI绘图工具的基类,一般不能直接使

用。

CBitmap:封装了一个GDI位图,提供位图操作的接口。

CBrush类:封装了GDI画刷,可以选作设备上下文的当

前画刷。画刷用于填充图形内部。

CFont:封装了GDI字体,可以选作设备上下文中的当

前字体。

CPallette:封装了GDI调色板,提供应用程序和显示

器之间的颜色接口。

CPen:封装了GDI画笔,可以选作设备上下文的当前画

笔。画笔用于绘制图形边界线。

CRgn类:CRgn类封装了一个Windows的GDI区域。这一

区域是某一窗口中的一个椭圆或多边形区域。