第6章图形设备接囗
第6章 图形设备接口
由于 Windows系统为基础操作系统和硬件之 间提供了图形用户接口(GUI),因此图形是 Windows程序的主要组成部分。在当今的GU操 作系统世界里图形学是十分重要的, Windows当 然也毫不例外。本章主要介绍在 Windows应用程 序实现中如何理解MFC的封装、设备描述表、图 形对象以及如何使用图形学的基本概念,讨论用 来显示绘图称之为设备描述表的数据类型和结构, 并描述用来建立 Windows图形的每个基础图形对 象
由于Windows 系统为基础操作系统和硬件之 间提供了图形用户接口(GUI),因此图形是 Windows程序的主要组成部分。在当今的GUI 操 作系统世界里图形学是十分重要的, Windows当 然也毫不例外。本章主要介绍在Windows应用程 序实现中如何理解MFC的封装、设备描述表、图 形对象以及如何使用图形学的基本概念,讨论用 来显示绘图称之为设备描述表的数据类型和结构, 并描述用来建立Windows图形的每个基础图形对 象
设备描述表与图形对象 当 Windows程序(包括 Windows自己)给显示器或其它别的输出设备(如 打印机)绘制文本和图形时,它不像DOS程序那样直接画到硬件上,而是 通过图形设备接口来实现绘制的。实际上,在 Windows世界里,直接写到 硬件上的应用程序被认为是禁忌,应用程序使用一个称之为设备描述表 (DC)的概念,它表示物理设备(如监视器、打印机、绘图仪或某个别的 物理设备)的逻辑形式。MFC提供几种DC的不同类型,在给设备绘制图形 前应用程序必须显式请求DC 然而,设备描述表不仅限于物理设备,DC也可指逻辑设备。逻辑设 备的一个例子就是元文件。它是以与设备无关的格式存储图面的结构的集 合。另一个例子是位图,它是图形图像的像素集合。在位图上或元文件上 绘图如同在显示器上或打印机上绘图一样容易
设备描述表与图形对象 当Windows程序(包括Windows自己)给显示器或其它别的输出设备(如 打印机)绘制文本和图形时,它不像DOS程序那样直接画到硬件上,而是 通过图形设备接口来实现绘制的。实际上, 在Windows世界里, 直接写到 硬件上的应用程序被认为是禁忌, 应用程序使用一个称之为设备描述表 (DC)的概念, 它表示物理设备(如监视器、打印机、绘图仪或某个别的 物理设备)的逻辑形式。MFC提供几种DC的不同类型, 在给设备绘制图形 前应用程序必须显式请求DC。 然而, 设备描述表不仅限于物理设备,DC也可指逻辑设备。逻辑设 备的一个例子就是元文件。它是以与设备无关的格式存储图面的结构的集 合。另一个例子是位图,它是图形图像的像素集合。在位图上或元文件上 绘图如同在显示器上或打印机上绘图一样容易
Win32API提供四种类型设备描述表: 显示描述表。支持视频显示器上图形操作。 信息描述表。提供设备数据的检索。 内存描述表。支持位图上的图形操作。 打印描述表。支持在打印机或绘图仪上的图形操作。 图形设备接口( Graphics Device Interface,简称GD在 Windows 系统中用以扩展设备描述表,它是 Windows系统结构的主要组成 部分。在SDK程序里,DC作为参数发送至GD函数调用,以给 Windows提供要在上面绘图设备的特性说明。GD给 Windows提供 全部绘图功能;DC表示提供抽象层的设备,该抽象层使应用程 序与直接绘图到硬件上的有害性相隔离(图6-1)展示硬件抽象)。 通过调用合适的设备驱动程序以响应 Windows图形函数调用的途 径,GD提供此隔离层
Win32 API 提供四种类型设备描述表: l 显示描述表。支持视频显示器上图形操作。 l 信息描述表。提供设备数据的检索。 l 内存描述表。支持位图上的图形操作。 l 打印描述表。支持在打印机或绘图仪上的图形操作。 图形设备接口(Graphics Device Interface ,简称GDI)在Windows 系统中用以扩展设备描述表,它是Windows系统结构的主要组成 部分。在SDK程序里,DC作为参数发送至GDI函数调用, 以给 Windows提供要在上面绘图设备的特性说明。GDI给Windows提供 全部绘图功能;DC表示提供抽象层的设备,该抽象层使应用程 序与直接绘图到硬件上的有害性相隔离(图6-1)展示硬件抽象)。 通过调用合适的设备驱动程序以响应Windows图形函数调用的途 径, GDI提供此隔离层
下面分别讲述各种GD对象和拥有的属性 CFont类:字体 CFont对象用于输出文字时选用不同风格和大 小的字体。可选择的风格包括:是否为斜体、粗体、字体名称、下 划线等。颜色和背景色不属于字体的属性。 CBrush类:刷子 CBrush对象决定填充区域时所采用的颜色或 模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格 和网格的类型如水平的,垂直的,交叉的等。你也可以利用8*8的位 图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利 用位图逐步填充区域。 CPen类:画笔CPen对象在画点和画线时有用。它的属性包括 颜色,宽度,线的风格,如虚线,实线,点划线等 CBitmap类:位图 CBitmap对象可以包含一幅图像,可以保存 在资源中。关于位图编程技术请见下一章 CRg类:多边形CRgn对象是一种特殊的GD对象,该对象利用多边 形可以很好的限制作图区域或是改变窗口外型
下面分别讲述各种GDI对象和拥有的属性: l CFont类:字体CFont对象用于输出文字时选用不同风格和大 小的字体。可选择的风格包括:是否为斜体、粗体、字体名称、下 划线等。颜色和背景色不属于字体的属性。 l CBrush类:刷子CBrush对象决定填充区域时所采用的颜色或 模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格 和网格的类型如水平的,垂直的,交叉的等。你也可以利用8*8的位 图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利 用位图逐步填充区域。 l CPen类:画笔CPen对象在画点和画线时有用。它的属性包括 颜色,宽度,线的风格,如虚线,实线,点划线等。 l CBitmap类:位图CBitmap对象可以包含一幅图像,可以保存 在资源中。关于位图编程技术请见下一章。 CRgn类:多边形CRgn对象是一种特殊的GDI对象,该对象利用多边 形可以很好的限制作图区域或是改变窗口外型
在 Windows中使用GD对象可以按以下步骤加以实现: 1、首先在绘金文字图形、图象等之前,我们要创建一个台法的 GD对象,不同的对象创建方法不同,有坐象必级经过初始化才能 使用。我们定义在代码块内的图形象,用相应的 Create()方法 初始化对象。例如,使用 eate Palett0去创Pal象 2、然后需要将建立饮D对象选入DC中,同的保存DC中原来的GDI 对象。一般通过使用CDC:: Selectobject0方法选择新对象进入当前 设备描述表。此方法返回指向被取代对象的指针(一个指向 CGdiObject派生类的指针)。注意:如果你选入一个非法的象将会 引起异常 3、当图形对象结束它的任务时,先前选中的图形对象返回设备述 表,保图事物的原来状态。在使用完后恢复原来的象,这一点特别 重要,如果保存一个临的象在DC中,历在临的对象被销毁后可能引 起学常。有一点必须注意,每个象在重新创建前必级毁。 注意:当对象越出范围时,在栈上声明的对象自动删除。恢复DC的 先前状态后,声明作为指针并与新操作符定位在一起的图形对象必须 显式删除
在Windows中使用GDI对象可以按以下步骤加以实现: 1、首先在绘制文字、图形、图象等之前,我们需要创建一个合法的 GDI对象,不同的对象创建方法不同,有些对象必须经过初始化才能 使用。我们定义在代码块内的图形对象, 用相应的CreateX()方法 初始化对象。例如,使用CreatePalette()去创建CPalette对象。 2、然后需要将建立的GDI对象选入DC中,同时保存DC中原来的GDI 对象。一般通过使用CDC::SelectObject()方法选择新对象进入当前 设 备描 述表 。此 方法返 回指 向被 取代对 象的 指针 (一 个指 向 CGdiObject派生类的指针)。注意:如果你选入一个非法的对象将会 引起异常。 3、当图形对象结束它的任务时, 先前选中的图形对象返回设备描述 表, 保留事物的原来状态。在使用完后恢复原来的对象,这一点特别 重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引 起异常。有一点必须注意,每一个对象在重新创建前必须销毁。 注意:当对象越出范围时,在栈上声明的对象自动删除。恢复DC的 先前状态后, 声明作为指针并与新操作符定位在一起的图形对象必须 显式删除
图形对象介绍 Windows提供了显示设备描述表定义的逻辑显示面,GDI 提供了在DC上使用的绘图工具。MFC图形对象类封装了 Windows绘图工具,这些类都从称为 CGdiobject的公用基类 派生的。MFC定义了几种图形对象类型及其它们相应的 Windows绘图工具,这些图形对象和绘图工具类有:笔、刷 子、字体、位图、调色板、区域。 上述的 CGdiob ject类根据图像对象句柄及其他,提供 到原始Win32API的接口。我们决不要直接创建 CGdiobject 对象,可从它的派生类之一(如CPen或 CFont)创建对象
图形对象介绍 Windows提供了显示设备描述表定义的逻辑显示面, GDI 提供了在DC上使用的绘图工具。MFC图形对象类封装了 Windows绘图工具,这些类都从称为CGdiObject 的公用基类 派生的。MFC定义了几种图形对象类型及其它们相应的 Windows绘图工具,这些图形对象和绘图工具类有:笔、刷 子、字体、位图、调色板、区域。 上述的CGdiObject类根据图像对象句柄及其他,提供 到原始Win32 API的接口。我们决不要直接创建CGdiObject 对象,可从它的派生类之一(如CPen或CFont)创建对象
笔和刷子 在 Windows应用程序开发中画点的方法很简单,我们可以通过调用下列函数 COLORREF CDC: SetPixel( int x, int y, COLORREF crColor) 就可在指定点位置画上指定颜色,同时返回原来的颜色值。我们也可通过调 用函数 COLORREF CDC: GetPixel( int x, int y) 得到指定点的颜色。在 Windows中应该少使用画点的函数,因为这样做执行 效率比较低。 刷子和画笔在 Windows作图中是使用最多的GD对象,本小节在讲解刷子和 画笔使用方法的同时也讲述一些基本作图函数。 在画点或画线时系统使用当前DC中的画笔,所以在创建画笔后必须将其选入 DC才会在绘图时产生效果。画笔可以通过CPen对象来产生,通过调用CPen CreatePen( int n PenStyle, int n width, COLORREF crColor)来创建
笔和刷子 在Windows应用程序开发中画点的方法很简单,我们可以通过调用下列函数 COLORREF CDC::SetPixel( int x, int y, COLORREF crColor) 就可在指定点位置画上指定颜色,同时返回原来的颜色值。我们也可通过调 用函数 COLORREF CDC::GetPixel( int x, int y) 得到指定点的颜色。在Windows中应该少使用画点的函数,因为这样做执行 效率比较低。 刷子和画笔在Windows作图中是使用最多的GDI对象,本小节在讲解刷子和 画笔使用方法的同时也讲述一些基本作图函数。 在画点或画线时系统使用当前DC中的画笔,所以在创建画笔后必须将其选入 DC才会在绘图时产生效果。画笔可以通过CPen对象来产生,通过调用CPen:: CreatePen( int nPenStyle, int nWidth, COLORREF crColor )来创建
字体 CFont类封装了一个 Windows图形设备接口(GD)字体并提供管理字体 的成员函数。为使用一个 CFont对象,可构造一个 CFont对象并用 CreatFont, Create FontIndirect, Create Point Font或( reate PointFontIndirect将一个 Windows字体附加给它,然后用对象的成员函数操纵字体。 Create pointFont和 Create Point FontIndirect常比使用 Create FontIndirect更容易, 因为它们自动将字体高度从点大小变为逻辑单位 在这里我假定读者已经利用 Application Wizard生成了一个SD界面的 程序代码。接下来的你只需要在CVew派生类的 On draw成员函数中加入绘 图代码就可以了。在这里我需要解释一下 On Draw函数的作用, On draw函 数会在窗口需要重绘时自动被调用,传入的参数CDC*pDC对应的就是DC 环境。使用 On draw的优点就在于在你使用打印功能的时候传入 On draw的 DC环境将会是打印机绘图环境,使用打印预览时传入的是一个称为 CPreviewDO的绘图环境,所以你只需要一份代码就可以完成屏幕窗口显 示/打印预览/打印机绘图三重功能。我们可以利用 Windows的设备无关性 和微软为打印预览所编写的上千行代码很容易的完成一个具有所见即所得 的 Windows应用软件
字体 CFont类封装了一个Windows图形设备接口(GDI)字体并提供管理字体 的成员函数。为使用一个CFont对象,可构造一个CFont对象并用CreatFont, CreateFontIndirect , CreatePointFont 或 CreatePointFontIndirect 将 一 个 Windows 字 体 附 加 给 它 , 然 后 用 对 象 的 成 员 函 数 操 纵 字 体 。 CreatePointFont和CreatePointFontIndirect常比使用CreateFontIndirect更容易, 因为它们自动将字体高度从点大小变为逻辑单位。 在这里我假定读者已经利用Application Wizard生成了一个SDI界面的 程序代码。接下来的你只需要在CView派生类的OnDraw成员函数中加入绘 图代码就可以了。在这里我需要解释一下OnDraw函数的作用,OnDraw函 数会在窗口需要重绘时自动被调用,传入的参数CDC* pDC对应的就是DC 环境。使用OnDraw的优点就在于在你使用打印功能的时候传入OnDraw的 DC环境将会是打印机绘图环境,使用打印预览时传入的是一个称为 CPreviewDC的绘图环境,所以你只需要一份代码就可以完成屏幕窗口显 示/打印预览/打印机绘图三重功能。我们可以利用Windows的设备无关性 和微软为打印预览所编写的上千行代码很容易的完成一个具有所见即所得 的Windows应用软件
输出文字一般使用下列两个函数: CDC: BOOL TextOut( int x, int y, const CString& str CDC: int Draw Text( const CString& str, LPRECT IpRect, UINT nFormat 其中,输出文字对 Textout来讲只能输出单行的文字,而 Draw Text可以指定在一个矩形中输出单行或多行文字,并 且可以规定对齐方式和使用何种风格。 nFormat可以是多种 以下标记的组合(利用位或操作)以达到选择输出风格的 目的
输出文字一般使用下列两个函数: l CDC::BOOL TextOut( int x, int y, const CString& str ) l CDC::int DrawText( const CString& str, LPRECT lpRect, UINT nFormat ) 其中,输出文字对TextOut来讲只能输出单行的文字,而 DrawText可以指定在一个矩形中输出单行或多行文字,并 且可以规定对齐方式和使用何种风格。nFormat可以是多种 以下标记的组合(利用位或操作)以达到选择输出风格的 目的