ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:35.42KB ,
资源ID:5540547      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5540547.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Lesson 0708 图形设备接口.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Lesson 0708 图形设备接口.docx

1、Lesson 0708 图形设备接口Lesson 07-08 图形设备接口Windows系统具有丰富的图形界面。Windows系统提供许多函数来实现绘图的要求。而图形设备接口(Graphics Device Interface,简写为GDI)就可看作是这些函数的集合。GDI表示的是一个抽象的接口。通过该接口可以实现对图形的颜色、线条的粗细等属性的控制(甚至包括输出文字在内)。应用程序可以通过调用这些GDI函数和硬件打交道,而不必知道到底是哪个厂家生产的硬件,从而实现了设备无关性。Windows系统本身也使用GDI来绘制用户界面的各个部分。一、设备环境1设备环境Windows默认使用客户区坐标系

2、,其原点在窗口客户区的左上角,X轴的正方向指向右边,Y轴的正方向指向下边。当应用程序并没有设置颜色、字体等时,系统使用默认的设置。这些默认的设置保存在设备环境中。如果没有设备环境,则每输出一个字符串(调用一次TextOut函数),就需要把字体和颜色也作为参数传递给TextOut函数,而且这样的参数有很多。为了避免这样的麻烦,Windows就把这些可能会重复的参数放在了设备环境中,这样每次只需要多传入一个设备环境的指针就可以了,大大减少了重复工作。设备环境(Device Context,缩写为DC,有时译为设备上下文,也称设备描述表)是一种包含各种绘图属性(如字体、颜色等等)和方法(即各种绘图函

3、数)的数据结构(或者集合)。它不仅可以绘制各种图形,而且还可以确定在应用窗口中绘制图形的方式,即确定绘图混和模式和映射模式。用户在绘图之前,必须获取绘图窗口区域的一个设备环境DC,才能进行GDI函数的调用,执行适合于设备环境DC的命令(就像OnDraw函数中的pDC指针)。DC中除了提供绘图的函数(如:TextOut)以外,还会提供给用户改变绘图属性的函数,如颜色。Windows的设备环境是GDI的关键元素,它代表了不同的物理设备。分为4种类型:显示型、打印机型、内存型和信息型。每种类型的设备环境都有各自的特定用途,见下表:设备环境的类型和用途设备环境用途显示器型支持视频显示器上的绘图操作打印

4、机型支持打印机和绘图仪上的绘图操作内存型支持位图上的绘图操作信息型支持设备数据的访问2MFC中的设备环境类在MFC类库中,设备环境被CDC类封装了起来,而CDC类下面又有4个派生类,各有特点,并可以完成不同的功能,如下所示: CMetaFileDC专门用于Windows图元文件,剩下的三种DC类之间存在差别:CDC类的派生类派生类名称说明CClientDC说明一个客户区设备环境,提供对窗口客户区域的图形访问。在窗口中画图时可使用这种DC,但对WM_PAINT消息除外CWindowDC可以提供在整个窗口(包括客户区和非客户区)中画图的设备环境CPaintDC这是创建响应WM_PAINT消息的设备

5、环境,应用程序可以使用此类更新Windows显示,通常在MFC应用程序的OnPaint()函数中使用CMetaFileDC这个设备环境代表Windows元文件,包含一系列命令以重新产生图像。要创建独立于设备的文件时可使用这种DC,用户可以回放这种文件来创建图像CWindowDC类与CPaintDC和CClientDC类的区别绘图区域不同:CWindowDC类与CPaintDC和CClientDC类的区别的一个方面就是绘图区域不同。用CPaintDC类和CClientDC类的对象绘制图形时,绘制区只能是客户区,而不能在非客户区,而CWindowDC可以在非客户区进行图形绘制。绘图坐标系不同:在C

6、WindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角,而在CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。CPaintDC类与CClientDC类的区别绘图机制不同:CPaintDC类与CClientDC类都是在窗口的客户区内绘制图形,但两者在绘制机制上有着本质的区别。CPaintDC类应用在OnPaint函数中,以响应Windows的WM_PAINT消息,而CClientDC应用在非响应WM_PAINT消息的情况下。CPaintDC类响应WM_PAINT消息,自动完成绘制,这对维护图

7、形的完整性有着重要的作用。例如在一个窗口中,已经绘制了n条直线,这个窗口的完整性可能会被破坏(如被对话框覆盖),当破坏完整性的程序结束时,即覆盖取消,这个窗口就会接收到一个WM_PAINT消息,得到此消息后,激活消息处理函数(如OnPaint)进行窗口绘制。CPaintDC类对象就担负着此时的绘制工作。如果现在想在屏幕上再绘制一条直线(如用鼠标实时绘制,当第二次单击鼠标左键时完成绘制),就要用到CClinetDC类,这个类可以实时的将图形绘制在屏幕上。如果用CPaintDC完成同样的工作,只能发出指令让包含要绘制这条直线的屏幕部分重画,把这条直线绘制到屏幕上。当然,这个重画区域内的其他图形元素

8、同时也会重画。 适用范围不同:CPaintDC类只能支持屏幕显示,而CClientDC类除了支持屏幕显示以外,还支持打印。 CDC类中的函数除了绘制图形的函数以外,还有以Get开头的获取绘图属性的函数,以Set开头的设置绘图属性的函数。 3常用绘图函数示例 CDC类中封装了一大批用来绘图的函数,除了文本输出函数TextOut以外,介绍几个常用的绘图函数,函数的原型以及更多的绘图函数用法查阅MSDN。 画点/绘制一个彩色点pDC-TextOut(20, 20, 点);pDC-SetPixel(100, 40, RGB(255,0,0);上面的代码表示用红色画一个点。 RGB是一个宏,可以将颜色的

9、三个R(Red)、G(Green)、B(Blue)分量值转换为Windows的颜色数据类型COLORREF(格式为0x00bbggrr),三个分量分别表示红、绿、蓝颜色的多少,取值范围为0255。常用的8种颜色如下表所示:常用的8种纯色RGB颜色RGB值颜色RGB(0,0,0)黑色RGB(255,255,255)白色RGB(255,0,0)红色RGB(0,255,0)绿色RGB(0,0,255)蓝色RGB(255,255,0)黄色RGB(0,255,255)青色RGB(255,0,255)品红 画线段/绘制线段 pDC-TextOut(320, 20,线段); pDC-MoveTo(400,

10、40); pDC-LineTo(500, 40); 上面的代码画线,MoveTo函数移动画笔到一点,LineTo函数画线。 画折线(多义线) /绘制折线 pDC-TextOut(20, 170, 折线); POINT polyline4=240,240,80,120,240,120,80,240; pDC-Polyline(polyline,4); 上面的代码将给定的4个点顺序连成折线,函数中第一个参数为折线顶点数组名,第二个参数表示一共有几个点构成折线(最小必须为2)。 POINT是Windows的一种结构,用来标识一个点,它有两个成员变量,分别用来表示点的X和Y坐标;在MFC类库中,CPo

11、int封装了这种结构。 画矩形 /绘制矩形 pDC-TextOut(320, 170, 矩形); pDC-Rectangle(390, 110, 600, 230); 此函数只能画平行于屏幕的矩形,前两个参数分别为矩形的左上角点的X和Y坐标,第三、四个参数分别为矩形的右下角点的X和Y坐标。 画椭圆 /绘制椭圆 pDC-TextOut(20, 320, 椭圆); pDC-Ellipse(80, 260, 280, 380); 此函数画一个由4个参数表示的矩形的内切椭圆。CDC里没专门画圆的函数,画圆仍然使用Ellipse函数。使X和Y方向的长度相等,这时画出来的就是一个圆。 画多边形 /绘制多边

12、形 pDC-TextOut(320, 320, 多边形); POINT polygon3=380,330,530,260,500,360; pDC-Polygon(polygon,3); 上面的代码将给定三个点顺序首尾连成封闭的多边形,函数中第一个参数为多边形顶点数组名,第二个参数表示多边形顶点的数目。 新建一个Graph单文档工程,并在CGraphView类的OnDraw函数中加入上述代码: 编译并运行程序,可见输出的图形。 4获取设备环境 在窗口中绘图,必须首先取得窗口的设备环境,如果不在CDC类中进行绘制,就必须首先想办法获取对应的设备环境(或者一个指向设备环境的指针)。 使用GetDC

13、函数 GetDC函数用于获取指定窗口工作区的显示器设备环境,其原型声明如下:CDC* CWnd:GetDC( ); 函数不带任何参数,如果函数调用成功,则返回标识CWnd客户区的设备环境,否则返回NULL。返回指针可能是临时性的,所以应该把它保存下来供以后使用。 对于公用的设备环境,GetDC成员函数为每一次被获取的设备环境指定默认属性。对于私有的设备环境GetDC成员函数保持它先前所具有的属性不变。设备环境可以用于图形设备接口(GDI)函数在客户区中绘图。一般完成作图之后,用GetDC成员函数获取的设备环境必须通过调用ReleaseDC成员函数来释放。因为在一个给定的时刻,系统只有五个公共的

14、设备环境是可用的,如果使用了设备环境后不释放,有可能会妨碍其他的应用程序访问设备环境。ReleaseDC用于释放一个设备环境,以便该设备环境可以被其他应用程序申请使用。其原型声明如下:int ReleaseDC( CDC* pDC ); 其中pDC为待释放的设备环境的指针。如果释放成功,函数返回非零值,否则,函数返回零。 下面的代码表示在单击某个菜单时画一个椭圆:void CGraphView:OnDrawEllipse() CDC * pDC; /调用CGraphView:GetDC()获取设备环境 pDC = GetDC(); pDC-Ellipse(0, 0, 100, 100); /使

15、用完后调用CGraphView:ReleaseDC()释放设备环境 ReleaseDC(pDC); 直接构造CDC对象声明一个CDC类或者其派生类对象,获取设备环境,方法如下:CClientDC dc(CWnd* );构造一个对象,间接使用了GetDC成员函数。当用一个C+的类声明一个对象时,系统会自动调用该类的构造函数,而在CClientDC类的构造函数中就调用GetDC函数。当对象被释放时,又会自动调用该类的析构函数,而在其析构函数中,则调用了ReleaseDC函数来释放设备环境。因此,前面的代码可以改为:void CGraphView:OnDrawEllipse() CClientDC

16、dc(this); dc.Ellipse(0, 0, 100, 100);这样不用用户自己去释放设备环境,在CClinetDC对象被折构时会自动释放。二、GDI对象Windows的GDI对象类型是通过MFC库中的类来表示的,其中CGdiObject类是所有GDI对象的抽象基类,其派生类包括CBitmap类、CBrush类、CFont类、CPen类、CRgn类和CPalette类,继承关系如下图所示。这些派生类对于绘制图形和图像都是非常重要的,经常要使用这些类来创建绘图工具,而很少直接使用基类CGdiObject。 设备环境和图形设备接口是实现计算机绘图的两个重要的组成部分,设备环境主要定义了绘

17、图的状态和方式,而图形设备接口则主要定义了用来绘图的工具。设备环境中包含有默认的GDI对象。CBitmap:位图是一种位矩阵,每一个显示像素都对应于其中的一个或多个位。用户可以利用位图来表示图像,也可以利用它来创建画刷。CBrush:画刷定义了一种位图形式的像素,利用它可对区域内部填充颜色。CFont:字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依赖于某种设备。CPen:画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线和虚线。CRgn:区域是由多边形、椭圆或二者组合形成的一种范围,可以利用它来进行填充、

18、裁剪以及鼠标点中测试。CPalette:调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,充分利用输出设备的颜色描绘能力。为了使用某种GDI对象,一般需要首先构造一个GDI对象,然后将这个GDI对象放入设备环境中,进行绘制工作。绘制完毕后,还必须将GDI对象释放。三、使用画笔画笔是一种用来画线及绘制有形边框的工具。在MFC中,用CPen类封装了GDI的画笔对象。用户可以通过画笔来选择线条的形状、粗细和颜色三种属性。系统默认的画笔是黑色,线宽为1个像素、并且是实线。1构造一支画笔MFC中CPen类的构造函数:CPen类一共重载了三个构造函数:CPen(); /没有参数;CPe

19、n( int nPenStyle, /线条类型 Int nWidth, /线条宽度 COLORREF crColor); /线条颜色CPen( int nPenStyle, /线条类型 int nWidth, /线条宽度 const LOGBRUSH* pLogBrush, /指向LOGBRUSH结构的指针 int nStyleCount=0, /如果非PS_USERSTYLE,恒为0const DWORD* lpStyle=NULL); /如非PS_USERSTYLE,恒为空第一个构造函数不带任何参数,由于它所构造的只是一个未初使化的CPen对象,构造完成后还必须调用CPen类的其他成员函数

20、初始化之后才可以使用。另外,该构造函数总是可以被成功调用。第二个构造函数带有三个参数,分别对画笔的线形、线宽和颜色进行了初始化:参数nPenStyle:指定画笔的风格(样式),也就是画笔的线形,该参数在构造函数中可以为如下所列值:参数nPenStyle参数值注释示例PS_SOLID创建一个实线画笔 PS_DASH创建一个虚线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效 PS_DOT创建一个点线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效 PS_DASHDOT创建一个点划线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效 PS_DASHDOTDOT创建一个双点划线画笔,

21、该值只有当画笔宽度小于1个设备单位或更小时才有效 PS_NULL创建一个空线画笔PS_INSIDEFRAME创建一个内框线画笔,该画笔可以在WindowsGDI输出函数定义的矩形边界所生成的封闭形状的边框内绘制直线 参数nWidth:指定画笔的宽度。对于该构造函数,如果该值为0,那么无论是什么映射模式,设备单位的宽度总1个像素。注意:如果nWidth大于1,则第一个参数中的PS_DSDH(虚线)、PD_DOT(点线)、PD_SASHDOT(点划线)、PS_DASHDOTDOT(双点划线)风格不可用。参数crColor:包含了一个画笔所具有的RGB颜色。使用了32位的COLORREF类型值来确定

22、图形颜色值,其结构为0x00bbggrr(十六进制),各部分的数值分别说明如下:bb代表蓝色值,范围从00到FF(即从0到255)。gg代表绿色值,范围从00到FF(即从0到255)r r代表红色值,范围从00到FF(即从0到255)在程序中还可以使用RGB宏来完成相同的功能。第三个构造函数带有5个参数。如果需要直接构造一支画笔,只需要一句代码就可以。2使用(选择)画笔在绘图中使用画笔,要把新的画笔选入到设备环境中去。使用CDC类的成员函数SelectObject来把新的GDI对象选入到设备环境中,同时这个函数将会把设备环境以前的GDI对象作为函数的返回值返回。CDC类中一共重载了5个Sele

23、ctObject()函数:CPen* SelectObject( CPen* pPen );CBrush* SelectObject( CBrush* pBrush );virtual CFont* SelectObject( CFont* pFont );CBitmap* SelectObject( CBitmap* pBitmap );int SelectObject( CRgn* pRgn );/选择区域函数的参数就是将要使用的新GDI对象,而函数的返回值(除最后一个函数以外)就是设备环境原来使用的GDI对象。一般情况下,需要把旧的GDI对象保存起来,在画完图以后再把旧的GDI对象用Se

24、lectObject函数选回去,以勉资源的浪费。3画笔使用实例如TestPen工程,改写视图类的OnDraw函数。改变线宽参数,使它大于1,观察结果:注意:当线宽大于1的时候,虚线、点线、点划线、双点划线风格都被忽略,仍然采用实线画笔。因此,是不可能用构造函数创建线宽为4的虚线画笔的。可以看到,使用一支画笔绘图一般为分三步:创建、选择、落选。其他的GDI对象的使用方法也基本相同。GDI对象的使用方法一般为下面3大步骤:第1步:创建GDI对象(可以直接构造,或者用Greate函数);第2步:用CDC:SelectObject函数将GDI对象选入设备环境(DC)中;第3步:使用完之后,再用CDC:

25、SelectObject函数将GDI对象落选(即选回来),最后释放GDI对象。注意:有些GDI对象可以一步由构造函数直接创建,如CPen和CBrush,而另外一些类如CFont和CRgn等则必须要两步:首先构造对象,其次进一步调用相应的创建函数。四、使用画刷画刷(Brush)用来对封闭区域内部进行填充。例如用Ellipse函数画一个封闭的圆,此圆并不是空心的,圆的中间会用设备环境中默认的画刷来填充(由于默认的画刷为白色,因此在白色背景中,这个圆仿佛就是空心了,实际上是一个白色的实心圆)。MFC类库中,画刷被封装在CBrush类中。通过该类构造的CBrush对象可以传递给任何一个需要画刷的CDC

26、成员函数。画刷可以是实线、阴影线或某种图案。1创建画刷CBrush类有4个重载的构造函数:CBrhsh(); /无参数的构造函数CBrhsh(COLORREF crColor); /构造实体画刷CBrush(int nIndex,COLORREF crColor); /构造阴影线模式画刷CBrush(CBitmap* pBitmap); /构造位图画刷第一个构造函数构造了一支未被初始化的画刷,如果用户使用了该构造函数,类似CPen的无参数构造函数一样,必须调用其他成员函数对所得到的CBrush 对象进行初始化。其他重载的构造函数分别使用指定的颜色、阴影线模式和颜色或位图指针来构造一支已经被初始

27、化的画刷。参数crColor:以RGB颜色指定画刷的前景色。如果是表示阴影线模式的画刷,则该参数指定的是阴影线的颜色。参数nIndex:指定了画刷的阴影线的风格,如下所示:画刷阴影线的样式阴影线参数值注释HS_BDIAGONAL从左到右向下成45的对角线HS_CROSS水平线和垂直线相交的十字交叉线HS_DIAGCROSS夹角为45的斜十字交叉线HS_FDIAGONAL从左到右向上成45的对角线HS_HORIZONTAL水平阴影线HS_VERTICAL垂直阴影线参数pBitmap:指向一个CBitmap对象,该对象指定了一幅用作画刷的位图。和画笔一样,要直接构造一支画刷,只需要一句代码就可以。

28、2使用(选择)画刷使用画刷,和CPen一样,要分三步走:创建、选择、落选。创建名为TestBrush单文档工程,其他设置使用默认选项,修改视图类的OnDraw函数创建并使用画刷。五、输出文本要使用不同的字体输出文本,需要使用到GDI对象字体。MFC类库中,Windows的图形设备接口字体和操纵字体的函数都被封装在CFont类中。1用CreateFont创建字体创建一个CFont对象相对比较复杂,在使用字体对象之前,必须调用CFont类的其他成员函数(如CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect等)对

29、字体对象进行初始化,以便确定字体对象的参数。调用CerateFont函数来选择一种字体时,需要很多的参数,该成员函数的原型声明如下:BOOL CreateFont(int nHeight, /字体高度 int nWidth, /字体平均宽度 int nEscapement, /字体标注行旋转角度 int nOrientation, /字符基线角度 int nWeight, /字体粗细程度 BYTE bItalic, /是否斜体 BYTE bUnderline, /是否下划线 BYTE cStrikeOut, /是否着重号 BYTE nCharSet, /字体的字体集 BYTE nOutPrec

30、ision, /输出精度 BYTE nClipPrecision, /载剪精度 BYTE nQuality, /字体质量 BYTE nPitchAndFamily, /字体的间距和所属的族 LPCTSTR lpszFacename); /字体的名字很多参数一般情况下都不用(除非编写专门的排版软件),而且都有默认的设置。其中参数nWeight:定义了字体的浓度即字体的粗细程序(像素数/1000)。如下列出了该参数的通用常量值:字体的浓度值粗细程度常量值常量值FW_DONTCARE0FW_SEMIBOLD600FW_THIN100FW_DEMIBOLD600FW_EXTRALIGHT200FW_BOLD700FW_ULTRALIGHT200FW_EXTRABOLD800FW_LIGHT300FW_ULTRABOLD800FW_NORMAL400FW_BLACK900FW_REGUNAL400FW_HEAVY900FW_MEDIUM500参数cCharSet:指出了字体的字体集。如下列出了预定义的字符集常量的值:预定义的字符集常量常量值ANSI_CHARSET0DE

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1