Windows编程主要分为两步:1、消息的处理。2、结果的显示。
消息处理和普通的高级编程大同小异,让我接受比较困难的主要就是这个结果显示。在Windows下各种信息的显示要比我之前接触的HTML等,复杂很多。光是这个设备环境就让我头大了一个星期。下面我要好好讲解一下,Windows的界面显示和图像的处理。
设备环境
设备环境应该指的是一个句柄关联的一个数据结构, 该结构中包含你汇图所在平面的一些参数, 比如影射模式,刷子,画笔等等. 设备环境(DC)是Microsoft公司为了实现设备无关性而引入的一个概念。
Windows 下的“绘制”字符串方法和 Dos 下的截然不同,在 Dos 下,您可以把屏幕想象成 85 x 25 的一个平面,而 Windows 下由于屏幕上同
时有几个应用程序的画面,所以您必须严格遵从规范。Windows 通过把每一个应用程序限制在他的客户区来做到这一点。当然客户区的大小是可变的,您随时可以调整。在您在客户区“绘制”字符串前,您必须从 Windows 那里得到您客户区的大小,确实您无法像在 DOS 下那样随心所欲地在屏幕上任何地方“绘制”,绘制前您必须得到 Windows 的允许,然后 Windows 会告诉您客户区的大小,字体,颜色和其它 GUI 对象的属性。您可以用这些来在客户区“绘制”。
什么是“设备环境”(DC)呢? 它其实是由 Windows 内部维护的一个数据结构。一个“设备环境”和一个特定的设备相连。像打印机和显示器。对于显示器来说,“设备环境”和一个个特定的窗口相连。“设备环境”中的有些属性和绘图有关,像:颜色,字体等。您可以随时改动那些缺省值,之所以保存缺省值是为了方便。您可以把“设备环境”想象成是Windows 为您准备的一个绘图环境,而您可以随时根据需要改变某些缺省属性。也就是说我们要是绘图,也就是操作设备环境里的各种对象,来画出我们想要的效果。Windows中还有一些特殊的DC,如代表位图的设备上下文Memory DC,只有通过它,应用程序才能在位图中绘图。具体说来,设备上下文详尽的指定了诸如显示器、打印机、绘图机及Modem等物理设备的特征,是一个保存绘图界面属性的数据结构。
调色板
调色板的概念必须首先介绍,它在除24位真彩色显示系统的其它系统中都要用到。
尽管多媒体技术的发展令计算机所能显示的色彩越来越绚丽缤纷,但实际上,自然界无限种类的颜色目前仍无法在计算机上完全表达出来。
现在最高级的所谓24位“真彩色”的显示系统也只能显示 既16,777,216种颜色,当然,这已经完全够用了,因为人眼还没有能力区分真彩色系统表现出的颜色与大自然中实际颜色的区别。在这种系统中,每一个像素的值都用红(R)、绿(G)、蓝(B)三色,每色8位共24位来表示,“24位”显示系统的名字也由此而来,所以,其像素值就是要显示的颜色值,显然,此时只需要直接显示就行了,而不需要调色板。但对于目前许多4位(16色)或8位(256色)显示系统来说,其像素值与颜色值并不一一对应,此时,调色板技术被派上了用场。
调色板的定义如下:它是在16色或256色显示系统中,由图像中出现最频繁的16或256种颜色组成的颜色表。它依靠有限种颜色通过组合来实现其它颜色。
若某幅图像是使用调色板的话,那它的像素值就表示颜色在调色板查找表中的索引号,而不是颜色值。
无效区
无效区域就是指需要重画的区域,无效的意思是:当前内容是旧的,过时的。Windows将绘制作为一个低优先级的任务,这样做是适当的,因为将绘制作为高优先级会导致为每个小的显示改变都产生一个绘图消息,这将使绘图消息泛滥。而通过处理所有正在等待的消息,允许应用程序先完成所有未完成的事务,这样使所有无效区域能够被有效的一次性绘制完成
Window显示的设备的属性 主要有:用位图、画刷、字体、画笔、区域
位图
有了调色板的概念,现在我们就可以切入正题、介绍位图了。
我们在使用计算机时要接触到大量的位图,它是指那些由一行行、一列列的像素点所组成的一个二维矩形像素点矩阵,这个矩阵存储了图像信息,组成了一幅幅的图片。可以毫不夸张地说,正是有了大量位图的存在,才使得当今的程序界面变得如此丰富多彩。
Windows位图有两种:DDB和DIB。前者依赖于设备(Device Dependent Bitmap),与MFC6.0中的CBitmap类(CGdiObject类的子类)相对应,
它们在内存中的结构和位置依赖于管理它们的设备驱动程序。
DDB不包含颜色信息,显示图像依赖于系统硬件,这使得它的优点是显示简单、迅速,但也正是由于这一特性,使得此种位图既不能通过磁盘也不能通过Modem将其传到其它计算机中实现共享,因此它的应用范围也就越来越小了。
DIB(Device Independent Bitmap)设备无关位图是一种外部图像格式,它克服了DDB的缺点,可以从一台主机通过网络等媒介传到其它主机上实现
文件共享。DIB之所以独立于设备,是因为它包含了一个名为RGBQUAD的结构,描述了DIB位图对应的逻辑调色板的颜色表,其像素值是该调色板中的颜色索引值,
因此,当一幅DIB传输到另一台计算机上时,该计算机显示它时只需根据这幅DIB的颜色表“按图索骥”就行了,而不必关心是否与当前的硬件配置相吻合。
一些在绘图中经常用到的函数
SelectObject和DeleteObject函数
如果要设置他们到当前设备里,就需要使用SelectObject 函数。但你创建一个属性对象时,windows就会在内存里分配一块内存空间,用来保存属性对象的数据。
所以当你创建显示设备资源时,一定要记得删除它们,否则就会造成内存泄漏。
dc是画布,在画布上画图有一套缺省的工具(画笔,画刷,字体等,每一个画布都得到框架的这一待遇),但你不喜欢,造了一个新的画笔,再入选这套工具集,并把原来的画笔给代替掉了,画完图后你觉得不安,想还原一下,于是就把oldPen再select进去.这是一个多余的好习惯,谨慎得让人发毛.
ExTextOut
ExtTextOut画单行文本往往更快一些。其次,文本并不在矩形里格式化,而是以传入的x、y坐标作为文本绘制的起始坐标。还可以通过wsprintf来设置输出格式。
DrawText
此函数中的DT_CLACRECT参数可以使得函数,只计算矩形大小而不显示矩形中的文字。对于DrawText函数的文字显示,就是要维护一个矩形,文字都是在矩形的相对位置上进行显示的。所以要改变文字的位置,就需要改变矩形窗口的大小。可以对文字设置颜色,但是颜色设置要在,DrawText之前。