第二章 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区域。这一
区域是某一窗口中的一个椭圆或多边形区域。