第二章 MFC 绘图基础.pps
《第二章 MFC 绘图基础.pps》由会员分享,可在线阅读,更多相关《第二章 MFC 绘图基础.pps(108页珍藏版)》请在三一文库上搜索。
1、孔令德,,第二章,MFC绘图基础,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多个已经定义好的常用基类。在程序设计过程中,一般是通
2、过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. 弹
3、出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中的数据是存
4、储在CTestDoc类文档中,而结果却显示在CTestView类中,即显示在CMainFram类的客户区中。MFC中的文档/视图结构用来将程序的数据本身和数据显示相互隔离,文档类负责管理和维护数据本身,视图类负责处理用户鼠标和键盘的操作。 全部展开FileView标签页后,显示如图2-7所示的内容。本书后续的编程过程中一般使用的是CTestView类的TestView.h头文件和TestView.cpp源文件。,图2-7 FileView标签页的展开显示,在CTestView类的源文件TestView.cpp中可以找到OnDraw()函数。其内容如下:,void CTestView:OnDra
5、w(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工程运行结果如
6、图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.cp
7、p文件的 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图元文件设
8、备上下文类。 CMetaFileDC封装了在Windows中绘制图元文件的方法。 图元文件是微软定义的一种Windows平台下的与设备无关的的图形文件格式(扩展名为wmf),其所占的磁盘空间比其它任何格式的图形文件都要小得多。 wmf格式文件通常用于存储一系列由绘图命令所描述的图形(如绘制直线与文本等) 。 在建立图元文件时,不能实现即绘即得,而是先将GDI调用记录在图元文件中,然后在GDI环境中重新执行图元文件,才可显示图像。,CPaintDC类:,CPaintDC对象只在响应WM_PAINT消息时使用。 CPaintDC类的构造函数会自动调用BeginPaint()函数。CPaintDC类
9、的析构函数则会自动调用EndPaint()函数。 MFC程序中使用CPaintDC类在视图窗口中绘图时,需要先添加WM_PAINT消息的映射函数OnPaint(),然后在OnPaint()函数中编写与CPaintDC类相关的代码,而不是编写在OnDraw()中。 请注意,如果使用OnPaint()函数响应了WM_PAINT消息,则OnDraw()函数将会被自动屏蔽。,CWindowDC类:,整个屏幕区域的显示器设备上下文类。包括客户区和非客户区。 CWindowDC允许在整个屏幕区域内进行绘图,其构造函数自动调用GetWindowDC(),析构函数自动调用ReleaseDC()函数。 CWin
10、dowDC中的点(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 st
11、ruct 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类:,typedef st
12、ruct tagSIZE 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调色
13、板,提供应用程序和显示器之间的颜色接口。 CPen:封装了GDI画笔,可以选作设备上下文的当前画笔。画笔用于绘制图形边界线。 CRgn类:CRgn类封装了一个Windows的GDI区域。这一区域是某一窗口中的一个椭圆或多边形区域。,在选择GDI对象进行绘图时,需要遵循以下步骤: 绘图开始前,创建一个GDI对象,并选入当前设备上下文,同时保存原GDI对象指针。 使用新GDI对象绘图。 绘图结束后,使用已保存的原GDI对象指针将设备上下文恢复原状。,把图形显示在屏幕坐标系中的过程称为映射 根据映射模式的不同可以分为逻辑坐标,设备坐标。 逻辑坐标的单位是米制尺度或其它与字体相关的尺度。 设备坐标的单
14、位是像素 MFC提供了几种不同的映射模式,见表2-1。 一般使用设备坐标模式MM_TEXT,坐标原点位于客户区的左上角,x轴水平向右,y轴垂直向下,坐标基本单位为一个像素。,2.2.2 映射模式,表2-1 映射模式,1.设置映射模式函数 类属:CDC:SetMapMode 原型: virtual int SetMapMode(int nMapMode ); 返回值:原映射模式。 参数:nMapMode是表2-1的模式代码。 2.设置窗口范围函数 类属:CDC: SetWindowExt 原型: virtual CSize SetWindowExt ( int cx, int cy ); 返回值
15、:原窗口范围的CSize对象。,4.设置视区坐标原点函数 类属:CDC:SetViewportOrg 原型: virtual CPoint SetViewportOrg( int x, int y ); 返回值:原视区原点的CPoint对象。,3.设置视区范围函数 类属:CDC:SetViewportExt 原型: virtual CSize SetViewportExt( int cx, int cy ); 返回值:原视区范围的CSize对象。,说明:,(1)当使用各向同性的映射模式MM_ISOTROPIC 和各向异性的映射模式MM_ANISOTROPIC时,需要调用SetWindowExt
16、()和SetViewportExt()函数来改变窗口和视区的设置,其它模式则不需要调用。,(2)MM_LOMETRIC,MM_HIMETRIC,MM_LOENGLISH,MM_HIENGLISH和MM_TWIPS模式主要应用于使用物理单位(英寸或毫米)绘图的情况下,y轴始终向上。,(3)“窗口”与“视区”的概念往往不容易理解。,(4)本书为了简化操作,以后假定窗口和视区的大小相同,即x方向的比例因子和y方向的比例因子都为1。,例2-1 使用用户自定义映射模式,设置窗口大小和视区大小相等的二维屏幕坐标系。坐标系原点位于客户区中心,视区中x轴水平向右为正,y轴垂直向上为正。,void CTestV
17、iew:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rect; /声明客户区矩形 GetClientRect( /客户区中心为坐标系原点 ,2.2.3 使用GDI对象,创建画笔函数,类属:CPen:CreatePen 原型: BOOL CreatePen(int nPenStyle,int nWidth, COLORREF crColor); 返回值:如调用成功,返回“非0”;否则,返回“0”。 参数:
18、nPenStyle是画笔样式,见表2-2; nWidth是画笔的宽度;crColor是画笔的颜色。,表2-2 画笔的样式,说明: (1)当画笔的宽度大于 1个像素时,画笔样式只能取 PS_SOLID、PS_NULL和PS_INSIDEFRAME。 (2)画笔也可以使用构造函数直接定义。原型为 CPen (int nPenStyle, int nWidth, COLORREF crColor ); (3)COLORREF是32位颜色数据类型,用双字表示。原型为 typedef DWORD COLORREF;,(4)COLORREF可以表示为十六进制形式:0xbbggrr。例如0x0000ff代表
19、红色,0x00ff00代表绿色,0xff0000代表蓝色。,(5)可以使用RGB宏来创建COLORREF颜色。原型为 COLORREF RGB(BYTE byRed,BYTE byGreen,B YTE byBlue); 其中,byRed是红色分量,byGreen是绿色分量,byBlue是蓝色分量,全部用字节表示。颜色分量可以表示为十六进制数,范围为0x000xff,也可以表示为十进制数,范围为(0 255),0代表无色,255代表全色。,(6)可以使用GetRValue(),GetGValue()和GetBValue()宏从COLORREF颜色中获得红、绿、蓝分量。,2.创建画刷函数,(1)
20、创建实体画刷函数 类属:CBrush:CreateSolidBrush 原型: BOOL CreateSolidBrush(COLORREF crColor ); 返回值:如果调用成功,返回“非0”;否则,返回“0”。 参数:crColor是画刷的颜色。,(2)创建阴影画刷函数 类属:CBrush:CreateHatchBrush 原型: BOOL CreateHatchBrush(int nIndex,COLORREF crColor); 返回值:如果调用成功,返回“非0”;否则,返回“0”。 参数:nIndex是阴影样式,见表2-3; crColor是阴影线的颜色。,3.选入GDI对象 类
21、属:CDC:SelectObject 原型: CPen* SelectObject(CPen* pPen ); CBrush* SelectObject(CBrush* pBrush ); CBitmap* SelectObject(CBitmap* pBitmap ); 返回值:如果成功,返回被替换对象的指针;否则,返回NULL。 参数:pPen是将要选择的画笔对象指针;pBrush是将要选择的画刷对象指针;pBitmap是将要选择的位图对象指针。,说明:本函数将设备上下文的原GDI对象更换为新对象,同时返回指向原对象的指针。,4.删除GDI对象 类属:CGdiObject:DeleteOb
22、ject 原型: BOOL DeleteObject(); 返回值:如成功删除GDI对象,返回“非0”;否则,返回“0”。 参数:无。,5.选入库对象 类属:CDC:SelectStockObject 原型: virtual CGdiObject *SelectStockObject(int nIndex); 返回值:如果调用成功,返回被替代的CGdiObject类对象的指针;否则返回NULL。 参数:参数nIndex可以是表2-4给出的库画笔代码或表2-5给出的库画刷代码。,表2-3 常用的阴影线样式,表2-4 3种常用库笔,表2-5 7种常用库画刷,说明: SetPixelV()函数不需要
23、返回所绘制像素点的RGB值,执行速度比SetPixel()快得多。推荐使用SetPixelV()函数绘制像素点。,2.2.4 CDC类绘图成员函数,绘制像素点函数,类属:CDC:SetPixel 和 CDC:SetPixelV 原型: COLORREF SetPixel(int x,int y,COLORREF crColor ); BOOL SetPixelV(int x, int y, COLORREF crColor); 返回值:SetPixel()函数如果调用成功,返回所绘制像素点的RGB值;否则,返回-1。SetPixelV()函数如果调用成功,返回“非0”;否则,返回“0”。 参数
24、:x是像素点位置的x逻辑坐标;y是像素点位置的y逻辑坐标;crColor是像素点颜色。,返回值:指定像素的RGB值。 参数说明:得到指定像素的RGB颜色值。 本函数是常成员函数 。,2.获取像素点颜色函数,例2-6在屏幕的P0(20,20)坐标位置处绘制一个绿色像素点,然后读出该像素点的颜色,水平平移100个像素绘制P1点。效果如图2-13所示。,类属:CDC:GetPixel 原型: COLORREF GetPixel(int x,int y)const;, CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);,void CTestView:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 MFC 绘图基础 第二 绘图 基础
链接地址:https://www.31doc.com/p-2285423.html