VC++讲义第10单元 图形设备接口.doc

上传人:壹****1 文档编号:547971418 上传时间:2022-11-28 格式:DOC 页数:20 大小:178KB
返回 下载 相关 举报
VC++讲义第10单元 图形设备接口.doc_第1页
第1页 / 共20页
VC++讲义第10单元 图形设备接口.doc_第2页
第2页 / 共20页
VC++讲义第10单元 图形设备接口.doc_第3页
第3页 / 共20页
VC++讲义第10单元 图形设备接口.doc_第4页
第4页 / 共20页
VC++讲义第10单元 图形设备接口.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《VC++讲义第10单元 图形设备接口.doc》由会员分享,可在线阅读,更多相关《VC++讲义第10单元 图形设备接口.doc(20页珍藏版)》请在金锄头文库上搜索。

1、第10单元 图形设备接口- 213 -第10单元 图形设备接口本单元教学目标介绍Windows的图形设备接口(GDI)和MFC的图形对象。学习要求了解图形设备接口的概念,掌握画笔、画刷和字体的用法,以及逻辑坐标和设备坐标的概念。授课内容在Windows程序中,应用程序的输出并不直接面向物理的设备,如显示屏或打印机,而是针对一个称之为设备环境(Device Context)的逻辑设备进行操作,设备环境与实际设备之间的信息传送由Windows直接管理。在MFC应用程序中,所有的绘制调用均通过相应的设备环境对象实现,设备环境对象封装了相应的Windows API功能,由一个32位的HDC类型句柄标识

2、。在MFC类库中,用CDC类封装设备文本对象。CPaintDC类是从CDC类派生的设备环境类。CPaintDC类的对象在OnPaint()函数中使用。另外,CClientDC类也是常用的CDC派生类,用于在OnPaint()函数外访问设备环境。在第9单元的程序举例中,我们已经看到了CPaintDC类的应用。但是,那些举例都很单调,没有颜色、线型和字体的变化。本单元首先介绍一些在设备环境下使用的绘图工具(图形设备接口对象),使用它们可改善应用程序的外观,然后介绍图形设备接口(GDI)的坐标系统。10.1 画笔与画刷画笔是用来画线的工具,是CPen类的对象。其使用方法为:/ 声明画笔对象,并创建宽

3、度为3的红色实线画笔CPen penRed;penRed.CreatePen(PS_SOLID, 3, RGB(255, 0, 0);/ 使用新的画笔,保存原来的画笔以便恢复CPen *pOldPen;pOldPen = dc.SelectObject(&pOldPen);/ 以下为作图代码,所画的线均使用新画笔 / 恢复原来的画笔dc.SelectObject(pOldPen);保存并恢复原来画笔的原因是,每个图形设备接口对象要占用一个HDC句柄,而可用的句柄数量是有限的,在使用完后要及时释放。否则,每次执行OnPaint()函数时均要重新创建图形接口对象,未被释放的非法句柄会留在设备上下文

4、对象中,积累下去将导致严重的运行错误。CPen类的成员函数CreatePen()用于创建画笔,其原型为:BOOL CreatePen (int nPenStyle, int nWidth, COLORREF crColor);第1个参数是画笔样式,可取画笔样式说明PS_SOLID创建实线笔PS_DASH创建由短线构成的虚线PS_DOT创建由点构成的虚线PS_DASHDOT创建由短线和点构成的虚线PS_DASH_DOTDOT创建由短线、点、点构成的虚线PS_NULL创建空(空白)画笔各种虚线只有当线宽为1时有效。第2个参数为线宽,第3个参数为线的颜色,可使用RGB()函数指定。RGB()函数有3

5、个参数,分别代表选取颜色的红、绿、蓝分量,可取0255之间的整数值。例如RGB(255,255,255)为白色,RGB(0,0,0)为黑色。画刷是用来填充图形的工具,是CBrush类的对象,使用方法与画笔类似,也要定义画刷对象,创建画刷并保存原来的画刷,在绘图工作结束后恢复原来的画刷。创建画刷的成员函数的原型为:BOOL CreateSolidBrush ( COLORREF crColor );参数crColor指定了画刷的颜色。除此而外,还可以创建一个阴影风格的画刷:BOOL CreateHatchBrush ( int nIndex, COLORREF crColor );其中参数nIn

6、dex指定了阴影风格,可取值为:阴影风格说明HS_BDIAGONAL从左下角到右上角的45度斜线HS_CROSS水平线与垂直线HS_DIAGCROSS相互垂直的45度线HS_FDIAGONAL从左上角到右下角的45度斜线HS_HORIZONTAL水平线HS_VERTICAL垂直线CDC类的SelectObject()函数原型如下:CPen* SelectObject( CPen* pPen );CBrush* SelectObject( CBrush* pBrush );virtual CFont* SelectObject( CFont* pFont );即SelectObject()是重载

7、的CDC类成员函数。SelectObject()将一个GDI对象选入到设备环境中,新选中的对象将替换原有的同类型对象,然后返回指向被替换的对象的指针。10.2 绘画模式在Windows中,绘图的最终效果不但取决于画笔和画刷的设置,还可以通过设定绘图模式来修正。屏幕绘图模式可通过CDC的成员函数SetROP2()设定,其原型为:int SetROP2 ( int nDrawMode );其中参数nDrawMode为选定的绘图模式,常用模式有:绘图模式说明R2_BLACK无论画笔色如何,只用黑色绘图;R2_WHITE无论画笔色如何,只用白色绘图;R2_NOP无论画笔色如何,用无色笔绘图;R2_NO

8、T用与背景色相反的颜色绘图;R2_NOTCOPYPEN 用与画笔色相反的颜色绘图;R2_COPYPEN用画笔色绘图;R2_XORPEN对画笔色和背景色作异或(XOR)运算。其中R2_NOT模式可保证所绘图形是可见的,即如果画笔色与背景色相同,则以与背景色相反的颜色作图,避免了所画图形“淹没”在背景中;R2_XORPEN模式有一种特殊效果,即对同一条线画两次会起到擦除作用。该函数的返回值为原来的绘图模式。10.3 GDI坐标系GDI支持两种类型的坐标系,即逻辑坐标系和设备坐标系。逻辑坐标系按坐标设置方式(又称为映射模式)可分为8种,它们的坐标特性如下:映射模式逻辑单位 x递增方向y递增方向 MM

9、_TEXT像素向右向下 MM_LOMETRIC0.1mm向右向上 MM_HIMETRIC0.01mm向右向上 MM_LOENGLISH0.01inch向右向上 MM_HIENGLISH0.001inch向右向上 MM_TWIPS1/1440inch向右向上 MM_ISOTROPIC可调整 (x = y)可选择可选择 MM_ANISOTROPIC可调整(x != y) 可选择可选择注意所有映射模式的坐标原点均在设备输出区域(如窗口客户区或打印纸上的打印区域)的左上角。因此,对于y坐标递增方向向下的映射模式(如MM_TEXT),y坐标值均为正值,而对于y坐标递增方向向上的映射模式(如MM_LOME

10、TRIC等),所有的y坐标值均为负值,在编程时要特别注意。最常用的映射模式是MM_TEXT,这也是缺省设置。在该模式下,坐标原点在客户区左上角,x坐标值是向右递增,y坐标值是向下递增,单位值1代表一个像素,与屏幕坐标系类似。采用除MM_TEXT外的其他映射模式的原因有二:一是欲使程序显示在不同的屏幕分辨率(如640480、800600或1024768等)下有相近的尺度;二是欲使程序的显示和打印比例相近(参看13.2:“打印和打印预览”)。设置映射模式,可使用CDC类的SetMapMode()成员函数,其原型为virtual int SetMapMode ( int nMapMode );其中参

11、数nMapMode为欲设置的映射模式,返回值为原来的映射模式。MFC绘图函数均使用逻辑坐标作为位置参数。例如CString str(“Hello, MFC!”);dc.TextOut(10, 10, str, str.GetLength();这里的(10,10)是逻辑坐标而不是像素点数(只是在缺省映射模式MM_TEXT下,正好与像素点相对应),在输出时GDI函数会将逻辑坐标(10,10)依据当前映射模式转化为“设备坐标”,然后将文字输出在屏幕上。设备坐标以像素点为单位,且x轴坐标值向右递增,y轴坐标值向下延伸,但原点(0,0)位置却不限定在工作区左上角。依据设备坐标的原点和用途,可以将Wind

12、ows下使用的设备坐标系统分为三种:客户区坐标系统,窗口坐标系统和屏幕坐标系统。1客户区坐标系统:客户区坐标系统是最常见的坐标系统,以窗口客户区左上角为原点(0,0),主要用于窗口客户区绘图输出以及处理窗口的一些消息。鼠标消息WM_LBUTTONDOWN、WM_MOUSEMOVE传给框架的消息参数以及CDC一些用于绘图的成员都是使用客户区坐标。2屏幕坐标系统:屏幕坐标系统是另一类常用的坐标系统,以屏幕左上角为原点(0,0)。一些与窗口客户区不相关的函数均以屏幕坐标为单位,例如设置和取得光标位置的函数SetCursorPos()和GetCursorPos();由于光标可以在任何一个窗口之间移动,

13、它不属于任何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,CreateWindow()和MoveWindow()等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。3窗口坐标系统:窗口坐标系统以窗口左上角为坐标原点,它包含了窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。MFC提供ClientToScreen()、ScreenToClient()两个函数用于完成客户区坐标和屏幕坐标之间的转换工作。void ScreenToClient( LPPOINT lpPoint ) const;void ScreenToClient

14、( LPRECT lpRect ) const;void ClientToScreen( LPPOINT lpPoint ) const;void ClientToScreen( LPRECT lpRect ) const;如果用户在窗口客户区移动鼠标或按下鼠标按键,就会得到鼠标位置的设备坐标。在使用该数据绘图时,需要将其转化为逻辑坐标。CDC类提供了两个成员函数LPtoDP()和DPtoLP()完成逻辑坐标和设备坐标之间的转换工作,其中LPtoDP用于将逻辑坐标转换为设备坐标,而DPtoLP()用于将设备坐标转换为逻辑坐标:void LPtoDP ( LPPOINT lpPoints, in

15、t nCount = 1 ) const;void LPtoDP ( LPRECT lpRect ) const;void DPtoLP ( LPPOINT lpPoints, int nCount = 1 ) const;void DPtoLP ( LPRECT lpRect ) const;但如果采用MM_TEXT的映射模式,设备坐标和逻辑坐标一致,就无需转换了。第9单元的例题程序均如此。例10-1 在窗口中显示一个椭圆,并用鼠标切换该椭圆的图形参数。说 明:建立项目的方法见9.8:“用Visual C+集成开发环境开发Win32应用程序”。程 序:/ Example 10-1: 用鼠标切换图形参数#include / 框架窗口类class CMyWnd: public CFrameWndint m_nColor;CR

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

当前位置:首页 > 生活休闲 > 科普知识

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