14.1.2 Windows图形设备界面
实际上并没有把数据写到屏幕上。所有到显示屏的输出都是图形,而不管它是直线、圆还是文本。Windows坚持使用图形设备界面(Graphical Device Interface,GDI)定义这种输出。GDI支持在对图形输出编程(www.cppentry.com)时不依赖于显示它的硬件,这意味着程序不进行任何修改,就可以在具有不同显示硬件的不同机器上运行。GDI还支持打印机和绘图仪,所以,将数据输出到打印机和绘图仪时涉及的机制实际上与在屏幕上显示信息时一样。
1. 使用设备上下文
在图形输出设备(如显示屏)上进行绘图操作时,必须使用设备上下文。设备上下文是一种Windows数据结构,它包含的信息允许Windows将输出请求转换成对正在使用的特定物理输出设备的动作。输出请求采用与设备无关的GDI函数调用形式。MFC类CDC封装了一个设备上下文,所以对该类型的对象调用函数,就可以执行所有的绘图操作。把一个指向CDC对象的指针提供给视图类对象的OnDraw()成员函数,就可以在该视图表示的客户区中绘图。要将输出发送到其他图形设备时,也使用设备上下文。
设备上下文提供了一种称为映射模式的可选坐标系统,它将被自动转换成客户区坐标。通过调用CDC对象的函数,还可以更改许多影响到设备环境的输出的参数,这样的参数称为属性。可以更改的属性有绘图颜色、背景色、绘图使用的线宽以及文本输出的字体等。
2. 映射模式
设备上下文中的每种映射模式都由一个ID标识,其方式与标识Windows消息类似。每个ID都有前缀MM_,表明它定义了映射模式。Windows提供的映射模式如表14-1所示。
表 14-1
|
映 射 模 式 |
说 明 |
|
MM_TEXT |
逻辑单位是一个设备像素,在窗口工作区
中,x轴的正方向从左到右,y轴的正方向从上到下 |
|
MM_LOENGLISH |
逻辑单位是0.01英寸,在工作区中,x轴的
正方向从左到右,y轴的正方向从上到下 |
|
MM_HIENGLISH |
逻辑单位是0.001英寸,x轴和y轴的方向
与MM_LOENGLISH相同 |
|
MM_LOMETRIC |
逻辑单位是0.1毫米,x轴和y轴的方向与
MM_LOENGLISH相同 |
|
MM_HIMETRIC |
逻辑单位是0.01毫米,x轴和y轴的方向与
MM_LOENGLISH相同 |
|
MM_ISOTROPIC |
逻辑单位是任意长度,但是在x轴和y轴上
是相同的。x轴和y轴的方向与MM_ LOENGLISH相同 |
|
MM_ANISOTROPIC |
这种模式类似于MM_ISOTROPIC,但是它允
许x轴上逻辑单位的长度不同于y轴上逻辑单位的长度 |
|
MM_TWIPS |
逻辑单位是TWIP,其中TWIP是一个点的0.05,
而一个点是1/72英寸。所以TWIP相当于1/1440英
寸,即6.9×10-4英寸。(点是衡量字体的单位)。
x轴和y轴的方向与MM_LOENGLISH相同 |
本书不打算使用所有这些映射模式。但是,本书将使用那些可用模式的良好典型,所以需要使用其他映射模式时,将不会遇到任何问题。
MM_TEXT是设备上下文的默认映射模式。如果需要使用一种不同的映射模式,就必须设法修改它。需要注意的是,在MM_TEXT模式中,y轴的正方向与您在高中学习坐标几何时相反,如图14-1所示。
默认情况下,在每种映射模式中,位于工作区左上角的点的坐标都是(0,0),但是也可以把原点移动到其他位置。例如,以图形形式显示数据的应用程序把原点移动到工作区的中心,将更容易绘制数据。还可以相对于(0,0)来定义形状,再将原点移动到要绘制的形状的位置。这意味着形状无论在什么地方,都可以用相同的代码绘制。
当原点在MM_TEXT模式中位于左上角时,距左边框50个像素、距工作区顶部100个像素的点的坐标是(50,100)。当然,因为单位是像素,屏幕上这个点与工作区左上角的距离就取决于显示器的分辨率。如果把显示器的分辨率设置为1280×1024,那么与设置为1024×768的分辨率相比,这个点将离工作区左上角比较近,因为像素比较小。对于在这种映射模式中绘制的一个对象来说,它在分辨率为1280×1024时的尺寸要比分辨率为1024×768时的尺寸小。注意,在所有映射模式中,显示器的DPI设置都将影响显示。默认设置采用96 DPI,所以,如果把显示器的DPI设置成另外一个值,那么这将影响图形的外观。坐标始终是32位有符号整数,整个图的最大物理尺寸因坐标单位的物理长度而异,坐标单位的物理长度是由映射模式确定的。
在除MM_TEXT之外的其余所有映射模式中,x轴和y轴的方向都一样,但是它们与MM_TEXT模式中的不一样。MM_TEXT模式中的y轴的方向相反。MM_LOENGLISH模式的坐标轴如图14-2所示。虽然y轴的正方向与您在高中时学习的一致(在屏幕上向上移动时y值增加),但是MM_LOENGLISH模式仍然有点古怪,因为其中的原点位于工作区的左上角,所以对于可视工作区内的点来说,它们的y值始终是负数。

在MM_LOENGLISH映射模式中,x轴和y轴上的单位都是0.01英寸,所以位置(50,-100)处的点到左边框的距离是半英寸,到工作区顶部的距离是1英寸。无论显示器的分辨率是多少,对象在工作区中的大小都一样。如果在MM_LOENGLISH模式中画了一个x值为负数或y值为正数的对象,那么它将位于工作区之外,因而看不见。调用CDC类(该类封装了设备上下文,稍后讨论)的SetViewportOrg()成员,可以移动原点的位置。