专栏导航上一篇第4章[标签 Win32] SysMets3 程序讲解05水平滚动回到目录下一篇无本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。从本节开始我们进入佩措尔德原教材第五章的学习。第五章讲解了 GDI 的基础知识。不是全部的 GDI但本章是 GDI 绘图的主要的基础知识。对于这一章我会对部分内容进行我的个性化阐释。本节内容来自于对佩措尔德原教材的大段抄录。我们开始。一. 第五章开头语微软 Windows 子系统负责在称为图形设备接口Graphics Device Interface简称 GDI的视频显示器和打印机上显示图形。你可以想象GDI 是 Windows 极其重要的一部分。不仅编写在 Windows 上显示信息的应用程序时要使用 GDIWindows 本身也会使用 GDI 显示用户界面的项目比如菜单、滚动条、图标和鼠标指针。可惜的是全面讨论 GDI 需要整本书的篇幅本专栏没办法做到这一点。在本章中将介绍绘制线条和填充区域的基本知识。这是学习后续各章的基础。在后面的关于 Windows API 的章节中将介绍 GDI 支持的位图、图元文件以及文本格式。二. GDI 的结构从程序员的角度来说GDI 由几百个函数以及相关的一些数据类型、宏和结构体组成。但是在开始详细讲解这些函数之前首先从总体上领略一下 GDI 的结构。三. GDI 的原理在 Windows 98 和 Windows NT 中图形显示主要由动态链接库 GDI32.DLL 中导出的函数处理。在 Windows 98 中许多函数是 GDI32.DLL 利用 16 位的 GDI.EXE动态链接库来实现的。在 Windows NT 中GDI.EXE 仅用于 16 位程序。这些动态链接库会调用你安装的视频显示器和打印机的设备驱动程序中的一些函数。视频驱动程序会直接访问视频显示器的硬件而打印机驱动程序则将 GDI 命令转化为各种打印机所能理解的代码或者命令。所以不同的显示适配器和打印机需要使用不同的设备驱动程序。各种各样的显示设备都可以与 PC 兼容机连接。因此GDI 的一个主要目的就是支持与设备无关的图形。Windows 程序应当毫无问题地在 Windows 所支持的任何图形设备上输出。GDI 提供了一种特殊的机制来彻底隔离应用程序和不同输出设备的特性这样就可以支持与设备无关的图形。图形输出设备被分为两大类光栅设备raster device和矢量设备vector device。大多数 PC 输出设备是光栅设备这也就意味着它们将图像表示成以点的形式构成的矩阵。该类输出设备有视频显示适配器、点阵打印机和激光打印机。矢量设备则使用线条来绘制图像通常指绘图机。大多数传统的计算机图形程序古董书中提到的类型完全以矢量为主。输出设备以像素来表示图形但程序并不以像素的形式来调用输出设备的接口函数。这就意味着一个使用矢量图形系统的程序会与硬件有着一定程度的隔离。所以说你可以把 Windows GDI 作为一个高层的矢量绘制系统来使用也可以使用它来进行相对底层的像素操作。从这个方面看Windows GDI 与传统图形接口语言之间的关系类似于 C 与其他编程语言的关系。C 的闻名之处在于它在不同操作系统和环境之间的高度可移植性。还有就是允许程序员执行底层系统函数这是其他高级语言做不到的。就如同 C 常被当成 “高级汇编语言” 一样你可以把 GDI 当成图形设备硬件的一种高层接口。如前所述Windows 默认使用以像素为单位的坐标系统。大多数传统的图形语言都使用一个 “虚拟” 坐标系统它的横轴和纵轴的范围是 0 ~ 32767 。尽管一些图形语言并不允许使用像素坐标但是 Windows GDI 允许使用任何一种坐标系统可以使用其他依据物理测量得到的坐标系统所以你可以使用虚拟坐标系统来保证程序与硬件独立也可以使用设备坐标系统来完全迎合硬件的需求。一些程序员认为以像素的形式进行程序设计时即意味着放弃了设备设备独立性。从第四章可知这并不完全正确。关键在于要以设备独立的方式来使用像素这需要设备接口语言为程序提供一种机制来查询设备的硬件特性以便程序作出合适的调整。例如在 SysMets 程序中我们使用标准字体字符的像素大小在屏幕上安排字符。这种方法允许程序根据不同的显示适配器来调整分辨率、文本大小以及纵横比。你可以在本章中看到确定显示区域大小的其他一些方法。在早期很多用户使用单色显示器来运行 Windows。而在现在基本上电脑用户使用的都是彩色显示器。然而支持灰度色调仍然是操作系统与 API 函数需要考虑的问题。因此GDI 的一个设计要求就是在为这种显示器编写程序时不必担心色彩问题。也就是说Windows 可以将色彩自动转换为灰度色调。在 Windows 98 时代Windows 98 使用的视频显示器具有不同的色彩能力16 色256 色和真彩色。当前使用的显示器基本上都是真彩色吧我此刻写文章时所使用的显示器就不再支持 16 色和 256 色了。然而如果你需要去编写嵌入式程序上位机程序那么16 色和 256 色你可能仍然要去处理的。尽管喷墨打印机给大众带来了低成本的彩色打印但是很多用户仍喜欢使用他们的黑白激光打印机因为输出图像的质量更高。程序可以不必区分使用的是哪类打印机当然如果程序可以确定在特定显示设备上有多少色彩是可用的那就可以更好地利用硬件的功能。在不同的计算机上运行 C 语言程序时总会有一些细小的移植性问题同样地在设计 Windows 程序时多少也会带入一些设备依赖性。这就是不与硬件完全隔离而必须承受的代价。你还应该知道 Windows GDI 的一些局限性。比如尽管你可以在显示器上移动图形对象但是 GDI 总体上来说只是一个静态显示系统对动画的支持很有限。如果你需要为游戏编写复杂的动画应当学习一下 DirectX它提供了必要的动画支持。专栏导航上一篇第4章[标签 Win32] SysMets3 程序讲解05水平滚动回到目录下一篇无