《Visual C++程序设计教程》-梁建武-电子教案 第9章

上传人:E**** 文档编号:89402481 上传时间:2019-05-24 格式:PPT 页数:96 大小:915KB
返回 下载 相关 举报
《Visual C++程序设计教程》-梁建武-电子教案 第9章_第1页
第1页 / 共96页
《Visual C++程序设计教程》-梁建武-电子教案 第9章_第2页
第2页 / 共96页
《Visual C++程序设计教程》-梁建武-电子教案 第9章_第3页
第3页 / 共96页
《Visual C++程序设计教程》-梁建武-电子教案 第9章_第4页
第4页 / 共96页
《Visual C++程序设计教程》-梁建武-电子教案 第9章_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《《Visual C++程序设计教程》-梁建武-电子教案 第9章》由会员分享,可在线阅读,更多相关《《Visual C++程序设计教程》-梁建武-电子教案 第9章(96页珍藏版)》请在金锄头文库上搜索。

1、第9章 绘图与打印,第9章 绘图与打印,图形功能在所有的Windows程序中具有重要的地位 ; Windows是一个与设备无关的操作系统,不允许直接访问硬件,如果用户想将文本和图形绘制到显示器或其他某个设备,必须通过“设备环境”这个抽象层与硬件进行通信 ; 设备环境DC(Device Context),9.1 设备环境类,设备环境是把应用程序与设备驱动器相联的一种数据结构 ,设备环境实际上相当于一个画布,所有的绘图操作在上面进行。 MFC提供了设备环境类,它们能使DC 的处理更容易。 Windows图形设备接口功能被封装在两个MFC类中:设备环境类CDC和图形设备接口对象类GDI(Graphi

2、cs Device Interface)。,Win32 API提供的4种设备环境:,显示器环境:支持图形在视频显示器上运行。 信息环境:用于检索设备环境。 类存环境:支持在位图上进行图形操作。 打印机环境:支持在打印机或绘图仪上进行图形操作。,9.1.1 设备环境类CDC,MFC中所有的设备环境都是从基类CDC类派生出来的。CDC类封装了Windows设备环境的主要功能 ,大概共有180个成员函数。 通过调用函数CreateDC()来构造一个设备环境 。 一个CDC对象有两个指示GDI设备环境句柄的成员变量:m_hDC和m_hAttribDC。 m_hDC是CDC对象的输出设备环境 m_hAt

3、tribDC是CDC对象属性设备环境,在文档视结构的程序中典型的OnDraw函数 :,void CEg_1View:OnDraw(CDC* pDC) CDocument* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here ,删除CDC对象,方法一:在栈中构造对象,由析构函数在函数返回时自动触发 void CEgView:OnRButtonUp(UINT nFlags, CPoint point) CRect rect; CClientDC dc(this); /在栈中构造dc

4、 dc.GetClipBox(rect); /dc 自动释放 ,删除CDC对象(续),方法二:通过调用ReaseDC函数来释放设备环境 void CEgView:OnRButtonUp(UINT nFlags, CPoint point) CRect rect; CDC *pDC=GetDC(); /获取一个指向dc的指针 pDC-GetClipBox(rect); ReleaseDC(pDC); /必须调用ReleaseDC删除 /此对象 ,9.1.2 其它设备环境类,CPaintDC: CPaintDC对象封装了Windows的通用方法:调用BeginPaint函数,并在设备描述表中绘画,

5、然后调用EndPaint函数。 CPaintDC主要针对WM_PAINT消息,用在OnPaint()函数中。,实例:,下面的OnPaint()函数中,创建了一个CPaintDC对象。 void CMyView:OnPaint() CPaintDC dc(this); OnPrepareDC( ,第二个设备环境类,CClientDC CClientDC对象封装了窗口客户区的设备环境。在CClientDC的构造函数中调用了Windows的GetDC函数,在析构函数中调用了ReleaseDC函数。,实例Eg9_1 :,在客户区内画一条对角线 步骤1.创建一个单文档应用程序Eg9_1。 步骤2.选择V

6、iewClassWizard,在MFC ClassWizard对话框中确定Class name和Object IDs都选择了CEg9_1View,然后在Messages框中选择WM_LBUTTONDOWN,双击它为单击鼠标左键其添加消息响应函数。,消息响应函数代码:,void CEg9_1View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default /建立一个CClientDC CClientDC dc(this); /在建立的DC上画线

7、CRect rect; GetClientRect( ,实例Eg9_1(续),步骤3.展开Eg9_1 ResourceString Table,双击String Table,修改IDR_MAINFRAME对应的字符串属性对话框 。,实例Eg9_1(续),最后,编译、链接、运行。结果如下:,第三个设备环境类,CWindowDC CWindowDC对象封装了代表了整个窗口的设备环境,包括框架和客户区。 该类在构造函数时调用Windows的GetWindowsDC函数,在析构时调用Windows函数ReleaseDC。,第四个设备环境类,CMetaFileDC CMetaFileDC对象封装了在一个

8、Windows图元文件中绘画; 要实现一个Windows元文件,首先创建一个CMetaFileDC对象;激活CMetaFileDC构造函数,然后调用Create成员函数创建一个Windows元文件设备环境,并将它连接到此CMetaFileDC对象上。,9.2 GDI对象,MFC将Windows中的GDI转化为C+形式的类。 CGdiObject类是基类,提供了许多派生类管理,如位图、区域、画刷、画笔、调色板和字体等。,GDI对象与Windows句柄类型的对应,在DC中使用GDI对象的步骤 :,定义GDI对象 选入GDI对象 删除GDI对象,第一步:定义GDI对象,例一: CPen myPen(

9、PS_DOT,5,RGB(0,0,0) ; 例二: CPen myPen1; /先构造 if(myPen1.CreatePen(PS_DOT,5,RGB(0,0,0) /后进行初始化 /可以开始使用 else /构造不成功,第二步:选入GDI对象,选入GDI对象可以使用SelectObject()函数来完成。此函数对各种GDI对象都有重载。如: CPen * SelectObject(CPen * pPen); 在选入当前的CPen对象时返回指向原有的CPen对象的指针。在完成绘图后需要使用此指针恢复原有对象。如: CPen * pOldPen=SelectObject(myPen); /进行

10、绘图 SelectObject(pOldPen);,第三步:删除GDI对象,如果不再使用某一对象可以调用CGdiObject:DeleteObject成员函数将其删除。 注意:已经选入DC中的对象不能删除。,9.3 坐标与坐标模式,逻辑坐标 设备坐标 坐标映射 映射方式 CDC的设置映射模式的成员函数是: virtual int SetMapMode(int nMapMode);,9.3.1 固定映射模式,9.3.2 可变映射模式,可变比例因子 Windows还提供两种可变比例因子的映射模式: MM_ISOTROPIC和MM_ANISOTROPIC,两种可变比例因子的映射模式:,在MM_ISO

11、TROPIC映射模式下,将逻辑单位转换成有相等比例轴的特定单位,纵横比为1:1 。即图形不会改变自己的形状 ,例如圆总是圆 。 在MM_ANISOTROPIC映射方式下,纵横方向的比例因子可以单独地变化,图形的形状可以发生变化,圆可以被拉扁成为椭圆。,与设置映射模式相关的函数:,SetWindowExt():用来设置窗口区域 SetViewportExt():用来设置视口 SetViewportOrg() :用来定义视口原点,实例:,void CMyView:OnDraw(CDC* pDC) CEg9_0Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc)

12、; / TODO: add draw code for native data here CRect rect; /申请一个CRect对象 GetClientRect(rect); /使用CWnd函数得到 /客户区尺寸 pDC-SetMapMode (MM_ANISOTROPIC); /设置映射方式,实例(续):,pDC-SetWindowExt (100,100); /设置窗口尺寸 /设置视口尺寸为客户区尺寸 /注意,将Y轴进行了反向 pDC-SetViewportExt (rect.right,-rect.bottom); /设置视原点为客户区中点 pDC-SetViewportOrg (

13、rect.right/2,rect.bottom/2); pDC-Ellipse(CRect(-50,-50,50,50); /绘制椭圆 ,9.3.3 坐标转换,对大多数CDC成员函数而言,可以使用逻辑坐标作为其参数。 但是,从WM_MOUSEMOVE消息所获得的鼠标光标的坐标值却是设备坐标,还有一些MFC库函数,如类CRect的成员函数,也只接收设备坐标。,坐标转换函数,9.4 常用绘图函数,绘图函数接收逻辑坐标作为参数。默认值采用MM_TEXT映射。,9.4.1 常用位置类,CPoint类: CPoint类由POINT派生,包括数据项x和y。在类中重载了各种运算符,包括=、!=、+=、-=

14、、+和- 等,运算结果可以是CPoint类或POINT结构。也可以使用Offset()在CPoint中加减x和y的值。,常用位置类(续),CSize类: CSize类由SIZE派生。其中的数据包括cx和cy。它也重载了上些运算符,但没有Offset()。 CRect类: CRect类来自RECT结构,使用了top、left、bottom、right成员定义一个矩形。在CRect类中有很多函数和操作符。,9.4.2 简单图形函数,1.画点。 SetPixel():用指定的颜色画一个像素 SetPixelV() 2.画线 GetCurrentPosition():获得当前笔停留的位置; MoveT

15、o(): 光标移动到一个初始位置; LineTo(): 画一条直线; Arc():画一段椭圆弧但不移动当前位置; ArcTo():画一段弧,并更新初始位置;,简单图形函数(续),AngleArc():画一条线,然后画一段弧,并更新初始位置; PolyDraw():画一系列线段和Bezier样条; Polyline():画一系列线段,折线; PolyPolyLine(): 画多个系列线条; 3.画形状 Rectangle():画矩形区域; RoundRect():画一个圆角矩形; Polygon():画一个多边形 PolyPolygon():创建一个或多个多边形,简单图形函数(续),Ellips

16、e():画椭圆 Pie():用于画饼图; Draw3dRect():画三维矩形; DrawEdge(): 画矩形的边缘; DrawFrameControl():画框架控件 4.形状填充和翻转 FillRect(): 填充矩形; InvertRect(): 反转矩形的颜色 ; FrameRect(): 画矩形的边框; FillSolidRect(): 用用某单色填充矩形;,简单图形函数(续),ExtFloodFill(): 用当前画刷填充一个区域 ; FillRgn(): 填充一个区域; FrameRgn():画一个特定区域的边框; InvertRgn(): 反转一个区域的颜色 。 5.绘制文本 TextOut():在指定的位置,输出一个字符串; ExtTextOut():在矩形区域里输出一个字符串;,简单图形函数(续),TabbedTextOut(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号