《Windows程序设计》之 图形基础学习笔记

在第一次看<Windows程序设计>这本书时,关于GetDeviceCaps得到的关于显示器各种指标的理论我一直比较迷惑,今天又读了一次.有些问题还是不太清楚.但至少有了更多的理解.

下面是我总结的关于GetDeviceCaps得到的几个设备的信息的各种关系:

HORZSIZE和VERTSIZE:这个是显示设备的水平/垂直物理尺寸,计量单位是mm.书上讲开始介绍这两个概念的时候是用的"实际物理尺寸"的术语,但是后面又讲到了它,这两个值在WinNT和16位的Windows中是固定的320*240,在Win98下这两个是根据另外4个信息计算出来.

排版字体的大小:排版字体中,1点(1dpi)=1/72英寸,这个应该是实际度量的大小.

LOGPIXELSX和LOGPIXELSY:这两个参数表示的是"每英寸的像素数",举例来说,Windows默认的小字体和大字体是90dpi和120dpi,也就是说每英寸的像素为96和120.这两个值是逻辑值,不是实际的物理值.另外,书上还讲了字体大小为10点的,实际的像素数的算法,即10*1/70*96=12个像素,也就是说,物理上为10个点的字,在以96(dpi)/英寸的显示器上,实际上点用了13个像素.

HORZRES和VERTRES:这两个是通过设定显示器属性得到的水平和垂直分辩率.例如1024*768.

Win98下HORZSIZE和VERTSIZE的算法:
               HORZSIZE=25.4*HORZRES/LOGPIXELSX
               VERTSIZE=25.4*VERTRES/LOGPIXELSY
也就是说,在Win98下,这两个值是算出来的.

我自己的观点:我感觉书上这个部分讲的有些不明白,讲明白了这些要概念但是并没有用实际的例子来描述它,这样我们就没有学到这些数据在实际的编程工作中的用途.我摘抄一下书中的原句,希望能看到这个文章的朋友举个例子让我消化这些概念.

--------------------------------------------------------以下为书中原文-------------------------------------------------------------------------

用HORZSIZE和VERTSIZE索引从GetDeviceCaps得到的设备能力,在文件上称为「实际屏幕的宽度,单位毫米」及「实际屏幕的高度,单位毫米」。因为这些值是从HORZRES、VERTRES、LOGPIXELSX和LOGPIXELSY值中衍生出来的,所以它们应该称为「逻辑宽度」和「逻辑高度」。公式是:


 


 

常数25.4用于把英寸转变为毫米。

这看起来是种不合逻辑的退步。毕竟,视讯显示器是可以用尺以毫米为单位的大小(至少是近似的)衡量的。但是Windows 98并不关心这个大小。相反,它以使用者选择的显示图素大小和系统字体大小为基础计算以毫米为单位的显示大小。更改显示的图素大小并根据GetDeviceCaps更改度量大小。这有什么意义呢?

这非常有意义。假定有一个17英寸的显示器。实际的显示大小大约是12英寸乘9英寸。假定在最小要求的640×480图素大小下执行Windows。这意味着实际的分辨率是每英寸53点。10点字体(在纸上便于阅读)在屏幕上从A的顶部到q的底部只有7个图素。这样的字体很难看而且不易读。(可问问那些在旧的Color Graphics Adapter上执行Windows的人们。)

现在,把您的计算机接上视讯投影机。投影的视讯显示器是4英尺宽,3英尺高。同样的640×480图素大小现在是大约每英寸13点的分辨率。在这种条件下试图显示10点的字体是很可笑的。

10点字体在视讯显示器上应是可读的,因为它在打印时是肯定可读的。所以10点字体就成为一个重要的参照。当Windows应用程序确保10点屏幕字体为平均大小时,就能够使用8点字体显示较小的文字(仍可读),或用大于10点的字体显示较大的文字。因而,视频分辨率(以每英寸的点数为单位)由10点字体的图素大小来确定是很有意义的。

然而,在Windows NT中,用老的方法定义HORZSIZE和VERTSIZE值。这种方法与Windows的16位版本一致。HORZRES和VERTRES值仍然表示水平和垂直图素的数值,LOGPIXELSX和LOGPIXELSY仍然与在「控制台」的「显示器」程序中选择的字体有关。在Windows 98中,LOGPIXELSX和LOGPIXELSY的典型值是96和120 dpi,这取决于您选择的是小字体还是大字体。

在Windows NT中的区别是HORZSIZE和VERTSIZE值固定表示标准显示器大小。对于普通的显示卡,取得的HORZSIZE和VERTSIZE值分别是320和240毫米。这些值是相同的,与选择的图素大小无关。因此,这些值与用HORZRES、VERTRES、LOGPIXELSX和LOGPIXELSY索引从GetDeviceCaps中得到的值不同。然而,可以用前面的公式计算在Windows 98下的HORZSIZE和VERTSIZE值。

如果程序需要实际的视讯显示大小该怎么办?也许最好的解决方法是用对话框让使用者输入它们。

posted @ 2007-04-28 10:54  吴东雷  阅读(1072)  评论(0编辑  收藏  举报