windows程序设计图形基础

上传人:宝路 文档编号:22987290 上传时间:2017-11-29 格式:DOC 页数:63 大小:473.95KB
返回 下载 相关 举报
windows程序设计图形基础_第1页
第1页 / 共63页
windows程序设计图形基础_第2页
第2页 / 共63页
windows程序设计图形基础_第3页
第3页 / 共63页
windows程序设计图形基础_第4页
第4页 / 共63页
windows程序设计图形基础_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《windows程序设计图形基础》由会员分享,可在线阅读,更多相关《windows程序设计图形基础(63页珍藏版)》请在金锄头文库上搜索。

1、图形基础图形设备接口(GDI:Graphics Device Interface)是 Windows 的子系统,它负责在视频显示器和打印机上显示图形。正如您所认为的那样,GDI 是 Windows 非常重要的部分。不只您为 Windows 编写的应用系统在显示视觉信息时使用 GDI,就连 Windows 本身也使用GDI 来显示使用者接口对象,诸如菜单、卷动列、图标和鼠标光标。不幸的是,如果要对 GDI 进行全面的讲述,将需要一整本书当然不是这本书。在本章中,我只是想向您提供画线和填入区域的基本知识,这对于理解下面几章的 GDI 已经足够了。在后面几章中会讲述 GDI 支持的位图、metafi

2、le 以及格式化文字 。GDI 的结构从程序编写者的观点来看,GDI 由几百个函数调用和一些相关的数据类型、宏和结构组成。但是在开始讲述这些函数的细节之前,让我们先从宏观上了解一下 GDI 的整体结构。GDI 原理Windows 98和 Microsoft Windows NT 中的图形主要由 GDI32.DLL 动态链接库输出的函数来处理。在 Windows 98中,这个 GDI32.DLL 实际是利用16位 GDI.EXE 动态链接库来运行许多函数。在 Windows NT 中,GDI.EXE 只用于16位的程序。这些动态链接库调用您安装的视频显示器和任何打印机调用驱动程序中的例程。视频驱

3、动程序存取视频显示器的硬件,打印机驱动程序将 GDI 命令转换为各种打印机能够理解的代码或者命令。显然,不同的视频显示卡和打印机要求不同的设备驱动程序。因为 PC 兼容机种上可以连接许多种不同的视频设备,所以,GDI 的主要目的之一是支持与设备无关的图形。Windows 程序应该能够毫无困难地在 Windows 支持的任意一种图形输出设备上运行,GDI 通过将您的程序和不同输出设备的特性隔离开来的方法来达到这一目的。图形输出设备分为两大类:位映像设备和向量设备。大多数 PC 的输出设备是位映像设备,这意味着它们以图点构成的数组来表示图像,这类设备包括视频显示卡、点阵打印机和激光打印机。向量设备

4、使用线来绘制图像,通常局限于绘图机。许多传统的计算机图形程序设计方式都是完全以向量为主的,这意味着使用向量图形系统的程序与硬件有着一定层次的隔离。输出设备用像素表示图形,但是程序与程序接口之间并不是用像素进行沟通的。您当然可以使用 Windows GDI 作为一个高阶的向量绘制系统,同时也可以将它用于比较低阶的像素操作。从这方面来看,Windows GDI 和传统的图形接口语言之间的关系,就如同 C 和其它程序设计语言之间的关系一样。C 以它在不同操作系统和环境之间的高度可移植性而闻名,然而C 也以允许程序编写者进行低阶系统调用而闻名,这些调用在其它高级语言中通常是不可能的。正如 C 有时被认

5、为是一种 “高级汇编语言”一样,您可以认为 GDI 是图形设备硬件之间的一种高阶界面。您已经看到,Windows 内定使用像素坐标系统。大多数传统的图形语言使用“虚拟” 坐标系,其水平和垂直轴的范围在0到32,767之间。虽然有些图形语言不让您使用像素坐标,但是Windows GDI 允许您使用两种坐标系统之一(甚至依据实际度量衡的坐标系) 。您可以使用虚拟坐标系以便让程序独立于硬件之外,或者也可以使用设备坐标系而完全迎合硬设备提供的环境。某些程序编写者认为一旦开始使用操作像素的程序设计方式,就放弃了设备无关性。我们在 上一章 看到,这不完全是正确的,其中的诀窍是在与设备无关的方式中使用像素。

6、这要求图形接口语言为程序提供一些方法来确定设备的硬件特征,并进行适当的调节。例如,在 SYSMETS 程序中,我们根据标准系统字体字符的像素大小来确定屏幕上的文字间距,这种方法允许程序针对分辨率、文字大小和方向比例各不相同的显示卡进行相应的调节。您将在本章看到一些用于确定显示尺寸的其它方法。早期,许多使用者在单色显示器上运行 Windows。即使是几年前,笔记本计算机也还只有灰阶显示。为此,GDI 的设计保证了您可以在编写一个程序时不必太担心色彩问题也就是说,Windows 可以将色彩转换为灰阶显示。甚至在今天,Windows 98使用的视频显示已经具有了不同的色彩能力(16色、256色、 “

7、high-Color”以及 “true-color”) 。虽然,彩色喷墨打印机的成本已经很低了,但是大多数使用者仍然坚持使用黑白打印机。盲目地使用这些设备是可以的,但是您的程序也应该能决定在某种显示设备上有多少色彩可以使用,从而最佳利用硬件功能。当然,就如同您编写 C 程序时,为了使它在其它计算机上运行而遇到一些微妙的移植性问题一样,您也可能不小心让设备依赖性溜进您的 Windows 程序,这就是不与硬件完全隔离的代价。您还应该知道 Windows GDI 的局限。虽然可以在显示器上到处移动图形对象,但GDI 通常是一个静态的显示系统,只有有限的动画支持。如果需要为游戏编写复杂的动画,就应该研

8、究一下 Microsoft DirectX,它提供了您需要的支持。GDI 函数调用组成 GDI 的几百个函数调用可以分为几大类: 取得(或者建立)和释放(或者清除)设备内容的函数 我们在前面的章节中已经看到过,您在绘图时需要设备内容代号。GetDC 和 RealseDC 函数让您在非 WM_PAINT 的消息处理期间来做到这一点,而 BeginPaint 和 EndPaint 函数(虽然在技术上它们是USER 模块而不是 GDI 模块的一部分)在进行绘图的 WM_PAINT 消息处理期间使用。我们马上还会介绍有关设备内容的其它一些函数。 取得有关设备内容信息的函数 再以 第四章中 SYSMET

9、S 程序 为例,我们使用GetTextMetrics 函数来取得有关设备内容中目前所选字体的尺寸信息。在本章后面,我们将看到一个取得非常广泛的设备内容信息的 DEVCAPS1程序 。 绘图函数 显然,在所有前提条件都得以满足之后,这些函数是真正重要的部分。在 上一章 中,我们使用 TextOut 函数在窗口的显示区域显示一些文字。我们将看到,其它GDI 函数还可以让您画线、填入区域。在 第十四章 和 第十五章 还会看到如何建立位图图像。 设定和取得设备内容参数的函数 设备内容的“属性”决定有关绘图函数如何工作的细节。例如,用 SetTextColor 来指定 TextOut(或者其它文字输出函

10、数)所绘制的文字色彩。在 第四章中 SYSMETS 程序 中,我们使用 SetTextAlign 来告诉 GDI:TextOut 函数中的字符串的开始位置应该在字符串的右边而不是内定的左边。设备内容的所有属性都有默认值,取得设备内容时这些默认值就设定好了。对于所有的 Set 函数,都有相应的 Get 函数,以允许您取得目前设备内容属性。 使用 GDI 对象的函数 GDI 在这里变得有点混乱。首先举一个例子:内定时使用 GDI绘制的所有直线都是实线并具有一个标准的宽度。您可能希望绘制更细的直线,或者是由一系列的点或短划线组成的直线。这种线的宽度和这种线的画笔样式不是设备内容的属性,而是一个“逻辑

11、画笔” 的特征。您可以通过在 CreatePen、 CreatePenIndirect 或ExtCreatePen 函数中指定这些特征来建立一个逻辑画笔,这些函数传回一个逻辑画笔的代号(虽然这些函数被认为是 GDI 的一部分,但是和大多数 GDI 函数调用不一样,它们不要求设备内容的代号) 。要使用这个画笔,就要将画笔代号选进设备内容。我们认为,设备内容中目前选中的画笔就是设备内容的一个属性。这样,您画任何线都使用这个画笔,然后,您可以取消设备内容中的画笔选择,并清除画笔对象。清除画笔对象是必要的,因为画笔定义占用了分配的内存空间。除了画笔以外,GDI 对象还用于建立填入封闭区域的画刷、字体、

12、位图以及 GDI 的其它一些方面。GDI 基本图形您在屏幕或打印机上显示的图形型态本身可以被分为几类,通常被称为“基本图形”,它们是: 直线和曲线 线条是所有向量图形绘制系统的基础。GDI 支持直线、矩形、椭圆(包括椭圆的子集,也就是我们所说的“圆”) 、椭圆圆周上的部分曲线即所谓的“弧” 以及贝塞尔曲线(Bezier spline) ,我们将在本章中分别对它们进行介绍。所有更复杂的曲线可由折线(polyline)代替,折线通过一组非常短的直线来定义一条曲线。线条用设备内容中选中的目前画笔绘制。 填入区域 当一系列直线或者曲线封闭了一个区域时,该区域可以使用目前 GDI 画刷对象进行填图。这个

13、画刷可以是实心色彩、图案(可以是一系列的水平、垂直或者对角标记)或者是在区域内垂直或者水平重复的位图图像。 位图 位图是位的矩形数组,这些位对应于显示设备上的像素,它们是位映像图形的基础工具。位图通常用于在视频显示器或者打印机上显示复杂(一般都是真实的)图像。位图还可以用于显示必须快速绘制的小图像(诸如图标、鼠标光标以及在应用工具条中出现的按钮等) 。GDI 支持两种型态的位图旧式的(虽然还非常有用) “设备相关”位图,是 GDI 对象;和新的(如 Windows 3.0的) “设备无关”位图(或者 DIB) ,可以储存在磁盘文件中。 第十四章 和 第十五章 讨论位图。 文字 文字的数学味道不

14、像计算机图形的其它方面那样浓。文字和几百年的传统印刷术有关,它被许多印刷工人看作为一门艺术。因此,文字通常不仅是所有的计算机图形系统中最复杂的部分,而且(如果识字还是社会基本要求的话)也是最重要的部分。用于定义 GDI 字体对象和取得字体信息的数据结构是 Windows 中最庞大的部分之一。从Windows 3.1开始, GDI 开始支持 TrueType 字体,该字体是在填入轮廓线基础上建立的,这样的填入轮廓线可由其它 GDI 函数处理。依据兼容性和储存大小的考虑,Windows 98继续支持旧式的点阵字体。我会在 第十七章 讨论字体。其它部分GDI 的其它部分无法这么容易地分类,它们是:

15、映像模式和变换 虽然内定以像素为单位进行绘图,但是您并非局限于此。GDI 映像模式允许您以英寸(或者甚至以几分之一英寸) 、毫米或者任何您想使用的单位来绘图(Windows NT 还支持传统的以三乘三矩阵表示的 “坐标变换”, 这允许倾斜和旋转图形对象。不幸的是,在 Windows 98中不支持坐标变换) 。 Metafile Metafile 是以二进制形式储存的 GDI 命令集合。Metafile 主要用于通过剪贴板传输向量图形。 第十八章 会讨论 metafile。 绘图区域 绘图区域是形状任意的复杂区域,通常定义为较简单的绘图区域组合。在GDI 内部,绘图区域除了储存为最初用来定义绘图

16、区域的线条组合以外,还以一系列扫描线的形式储存。您可以将绘图区域用于绘制轮廓、填入图形和剪裁。 路径 路径是 GDI 内部储存的直线和曲线的集合。路径可以用于绘图、填入图形和剪裁,还可以转换为绘图区域。 剪裁 绘图可以限制在显示区域的某一部分中,这就是所谓的剪裁。剪裁区域是不是矩形都可以,剪裁通常是通过区域或者路径来定义的。 调色盘 自订调色盘通常限于显示 256色的显示器。Windows 仅保留这些色彩之中的20种以供系统使用,您可以改变其它236种色彩,以准确显示按位图形式储存的真实图像。第十六章 会讨论调色盘。 打印 虽然本章限于讨论视频显示,但是您在本章中所学到的全部知识都适用于打印。第十三章 会讨论打印。设备内容在开始绘图之前,让我们比 第四章 更精确地讨论一下设备内容。当您想在一个图形输出设备(诸如屏幕或者打印机)上绘图时,您首先必须获得一个设备内容(或者 DC)的代号。将代号传回给程序时,Windows 就给了您使用设备的权限。然后您

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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