第8章 图形编程.ppt_第1页
第8章 图形编程.ppt_第2页
第8章 图形编程.ppt_第3页
第8章 图形编程.ppt_第4页
第8章 图形编程.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 图形编程,Windows应用程序在进行图形操作时,通过一种设备环境屏蔽了具体设备的差异,如显示器和打印机之间的不同,使得应用程序的绘图工作在设备环境提供的理想环境中。本章将详细介绍如何利用MFC中的图形类进行各种各样的图形输出,以及与图形有关的各种操作方式的使用。,8.1 绘制图形的相关知识,Windows应用程序在窗口内的绘图操作和与之相关的许多其他信息都是由图形设备接口负责,例如图形设备(打印机、显示器)的信息、绘图的坐标系统和映射模式、绘图工具的当前状态(什么样的画笔、画刷、文本的前景色与背景色、文本所使用的字体)等。,8.1.1 图形设备接口,图形设备接口(Graphics D

2、evice Interface),简称GDI,是Windows系统的核心部分之一。GDI管理着Windows应用程序的所有图形输出。也就是说它负责在显示器和打印机上显示图形包括显示在屏幕上的窗口、应用程序打印文档以及Windows系统本身显示的用户界面元素。,8.1.2 逻辑空间和设备空间,逻辑空间是一个理想的绘图空间。在这个空间里,程序员可以使用所有的颜色、所有的字体,可以在无限大的范围内输出。设备空间则是个真实具体的世界,在这个空间中,只有有限的颜色可用于绘图、具有特定的输出格式以及有限的输出空间。,8.1.3 设备环境,设备环境(Device Context),简称DC,是由GDI创建的

3、用于代表设备连接的数据结构。该数据结构包含了图形设备的绘制属性信息。GDI绘制调用都是借助于设备环境对象。该对象封装了用于画线、文本、图像等的Windows API。设备环境可以进行与设备无关的绘制,因此它既可以用于绘制屏幕,又可以用于绘制打印机,甚至元文件等。,8.1.4 一个简单的图形程序,为了理解利用MFC编制图形程序的过程,也为了进一步理解图形程序所用到的概念和原理,下面以一个简单的绘制线条程序为例,介绍利用SDK全局函数绘制线条的过程。,8.2 设备环境的相关类,MFC提供了一个CDC类,它封装了绘图所需要的所有成员函数和设备环境的所有功能。同时MFC还提供了几个CDC的派生类,用于

4、具体绘图操作中。例如用于WM_PAINT消息响应中的CPaintDC类,用于窗口客户区的CClientDC类,以及用于整个Windows窗口的CWindowsDC类。下面在8.1.4节简单绘图程序的基础上,通过绘制不同区域的线条来了解这些与设备环境相关的类。,8.2.1 CDC类,对于CDC类的构造函数的定义,在MFC源文件WINGDI.CPP中,打开文件。,8.2.2 CPaintDC类,在第5章曾介绍过函数BeginPaint(),它只能在WM_PAINT消息的响应程序中使用。当用函数BeginPaint()得到设备环境句柄后,就可以在设备环境中进行一系列的绘图操作,最后必须采用函数End

5、Paint()来释放这个DC句柄。CPaintDC类则完全封装了这一过程,该类派生于CDC类。,8.2.3 CClientDC类,在第6章曾介绍过视图类窗口和框架类窗口,知道整个程序窗口就是框架窗口;而框架窗口的空白区,也就是客户区,才是视图类窗口。CClientDC类所封装的设备环境仅代表视图类窗口,也就是说只能在窗口的客户区进行图形绘制,该类派生于CDC类。,8.2.4 CWindowDC类,通过前几章学习知道窗口有客户区和非客户区之分,还知道可以利用BeginPaint()/EndPaint()或GetDC()/Release()在客户区上绘图。但到目前为止还不知道怎么在非客户区绘图,非

6、客户区包括窗体标题栏、菜单、滚动条和框架。GetWindowDC()这个函数就能满足在非客户区绘图的要求,因为该函数可以获得整个窗口的设备句柄,包括客户区和非客户区,也就是说可以在一个窗体的任何位置进行绘图。CWindowDC类就是封装了这个过程,即GetWindowDC()函数是其成员函数,并且它也是派生于CDC类。,8.3 GDI对象,类对象关联了相应的设备环境句柄,就相当于有了一个理想的绘图环境。但还需要一些工具才能绘制出各种各样的图形,例如用画笔来画各式各样的线条,字体来显示不同的文本效果,这些工具称之为GDI对象。这些对象都派生于CGdiObject类。,8.3.1 GDI对象的种类

7、,MFC对这些图形对象进行了封装,并提供了相对应的图形对象类,大概有6种类型的GDI对象,每种GDI对象都包含了一个与之对应的Windows句柄。表8.1列出了所有的GDI对象和与其对应的句柄。,8.3.2 GDI对象的生命周期,下面通过一个简单例子的例子看一下GDI对象的生命周期。 通常视图类的OnDraw用来完成图形的绘制,因此本示例就在函数OnDraw()内完成绘图程序的编写。,8.4 绘制图形,前面学习了利用不同的设备环境相关类来实现在不同区域进行画线,除了线条之外,还有一些简单的图形如矩形、椭圆、弧线、多边形、贝赛尔曲线等。任何复杂的图形都是由这些最基本的简单图形组合而成的,这些简单

8、图形又称为图元。本节就利用这些图元进行简单绘图。,8.4.1 绘制线条,前面已经详细讲解过几种不同GDI类实现简单画线,这里再进一步讲解用画笔实现不同效果的线条。画笔类有三个构造函数,其中一种构造函数的原型声明如下: CPen( int nPenStyle, int nWidth, COLORREF crColor );,8.4.2 绘制矩形,下面实现一个用鼠标拖动绘制的矩形,该矩形内部被蓝色图案填充。要使用蓝色填充矩形,可以采用一个蓝色画刷来实现,8.4.3 绘制椭圆,下面绘制一个可以相互重叠的椭圆。若采用先前的方法进行编程时,会发现并不能实现可以重叠的图形,因为设备环境提供了一个默认的白色

9、画刷,当绘制图形时,Windows系统会用一个默认的白色画刷来填充图形内部。因此当绘制两个重叠的椭圆时,最后一个绘制的椭圆会覆盖前一个绘制的椭圆。若实现多个重叠的图形完全显示,需要采用一个透明的画刷来代替当前默认的画刷。,8.4.4 其他绘图方式,除了绘制上述的简单图形外,还可以画点、画折线或者画连续线等,下面就介绍一些常用的绘图方式。 1画点 2画折线 3画连续线 4画弧线,8.5 映射模式,Windows应用程序绘制图形时使用的是一种逻辑单位,每个逻辑单位的大小由映射模式决定,这个逻辑单位可以与设备单位相同,如屏幕或打印机上的一个像素点,也可以是一种物理单位,如毫米,还可以是用户自定义的一

10、种单位。在Windows应用程序中,只要与输出有关系,都要使用映射模式。,8.5.1 坐标转换,所谓映射模式,就是确定用于绘图操作的单位大小的一种量度转换。也就是说,设定的映射模式主要是确定应该如何将逻辑空间的一个坐标点转换为设备空间中的一个设备坐标点。映射模式是一种影响绘图操作的设备属性,其中窗口原点、视口原点、窗口范围和视口范围这四个设备属性和映射模式密切相关。因此映射模式主要规定了窗口和视口的范围、各轴的相对方向、原点或缩放比例等。,8.5.2 映射模式,在上文已经提到SetMapMode()函数用于设置设备环境的映射模式,在Windows下有几种映射模式,以适应不同的需要。它们分别是:

11、MM_TEXT映射模式、固定比例映射模式、可变比例映射模式。下面分别来对以上几种映射模式作详细的说明。 1MM_TEXT映射模式 2固定比例映射模式 3可变比例映射模式,8.6 文本编程,有时开发人员需要编写类似Windows记事本之类的程序,这是也需要图形图像编程的知识,如对插入符的处理、文字的显示等。本节将对相关的内容做详细讲解。,8.6.1 插入符,Windows操作系统中的文本处理程序有Word、记事本和写字板。当在这些文本处理程序的编辑窗口进行输入、编辑和修改文本时,有一条闪烁的竖线,用来表明即将编辑文本的位置,这就是插入符。,8.6.2 文本的输入与显示,在上面的示例程序中,尽管出

12、现了文本插入符,但依旧不能进行文本的输入。回想所学的东西,才知道要想输入字符,就必须能够触发键盘按下消息,即产生WM_CHAR消息。对于文本输入要求在当前插入符位置显示,也就是说当鼠标左键单击客户区的任意某一位置时,插入符就在此位置显示,并在其后进行文本的输入。 1鼠标左键按下消息的响应 2键盘按下消息的响应,8.7 滚动视窗,在编写与窗口有关的应用程序时,经常碰到要使用滚到条的情况,本节将对有关滚动条的编程作详细讲解。,8.7.1 滚动条,在先前介绍基于CView类的应用程序窗口中时并没有出现滚动条,这说明MFC中的CView类不直接支持窗口的滚动。但MFC中的CScrollView类支持窗口滚动,CScrollView是从CView类派生出来的。因此在利用MFC AppWizard生成工程时,再创建向导的第6步,如图8.16所示,可以把视类的基类选择为CScrollView类。这样视图窗口就具有滚动功能,当图形过大,无法完整的在窗口中显示时,就可以通过拖动滚动条来浏览完整的图形。,8.7.2 滚动视窗应用实例,在原来的Scroll应用程序基础上创建一个宽30厘米、高30厘米的滚动逻辑窗口,然后在该窗口内实现矩形的渐变,即每

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论