Win32程序 对大字体和小字体的疑惑
看到了图形基础这一章,对所说的大小字体有疑惑:摘录的文字如下:
/*-------------------------------------------------------------------------------------------------------------------------------------------------------
Windows系统字体-不考虑是大字体还是小字体,也不考虑所选择的视频图素大小-固定假设为10点字体和12点行距。这听起来很奇怪,如果字体都是10点,为什么还把它们称为大字体和小字体呢?
解答是:当您在「控制台」的「显示」程序上选择小字体或大字体时,实际上是选择了一个假定的视讯显示分辨率,单位是每英寸的点数 。当选择小字体时,即要Windows假定视讯显示分辨率为每英寸96点。当选择大字体时,即要Windows假定视讯显示分辨率为每英寸120点。
看看图5-2。那是小字体,它依据的显示分辨率为每英寸96点。我说过它是10点字体。10点即是10/72英寸,如果乘以96点每英寸,大概就为13图素。这即是tmHeight减去tmInternalLeading的值。行距是12点,或12/72英寸,它乘以96点,每英寸就为16图素。这即是tmHeight的值。[local]3[/local]图5-2
图5-3显示大字体。这是依据每英寸120点的分辨率。同样,它是10点字体,10/72乘以120点每英寸,等于16图素,即是tmHeight减tmInternalLeading的值。12点行距等于20图素,即是tmHeight的值。(像第四章一样,再次强调所显示的是实际的度量大小,因此您可以理解它工作的方式。不要在您的程序中对此写作程序。)[local]5[/local]图5-3
在Windows程序中,您可以使用GetDeviceCaps函数取得使用者在「控制台」的「显示器」程序中选择的以每英寸的点数为单位的假定分辨率。要得到这些值(如果视讯显示器不具有正方形图素,在理论上这些值是不同的),可以使用索引LOGPIXELSX和LOGPIXELSY。LOGPIXELS指逻辑图素,它的基本意思是「以每英寸的图素数为单位的非实际分辨率」。
用HORZSIZE和VERTSIZE索引从GetDeviceCaps得到的设备能力,在文件上称为「实际屏幕的宽度,单位毫米」及「实际屏幕的高度,单位毫米」。因为这些值是从HORZRES、VERTRES、LOGPIXELSX和LOGPIXELSY值中衍生出来的,所以它们应该称为「逻辑宽度」和「逻辑高度」。公式是:[local]1[/local]
常数25.4用于把英寸转变为毫米。
这看起来是种不合逻辑的退步。毕竟,视讯显示器是可以用尺以毫米为单位的大小(至少是近似的)衡量的。但是Windows 98并不关心这个大小。相反,它以使用者选择的显示图素大小和系统字体大小为基础计算以毫米为单位的显示大小。更改显示的图素大小并根据GetDeviceCaps更改度量大小。这有什么意义呢?
这非常有意义。假定有一个17英寸的显示器。实际的显示大小大约是12英寸乘9英寸。假定在最小要求的640×480图素大小下执行Windows。这意味着实际的分辨率是每英寸53点。10点字体(在纸上便于阅读)在屏幕上从A的顶部到q的底部只有7个图素。这样的字体很难看而且不易读。(可问问那些在旧的Color Graphics Adapter上执行Windows的人们。)
-------------------------------------------------------------------------------------------------------------------------------------------------------*/
认为让我迷惑的地方已经加红。
首先说清楚我的思路:
基于大小字体在通以显示分辨率的显示屏上显示的像素大小是不一样的,所以我从第一段描红的文字推测:
计算大字体、小字体在显示屏上显示的像素大小可以按照这样的式子来计算:
小字体点值 x 假设的显示分辨率 = 小字体像素值
大字体点值 x 假设的显示分辨率 = 大字体像素值
其中
1.大小字体点值是固定的,都为 10 x (1/72 inch/point) = 10/72 inch;
2.当选用大字体时,假设的显示分辨率为 120 dot/inch,选用小字体时,假设的显示分辨率为 96 dot/inch;
3.式子所得到的大/小字体像素值为实际的显示分辨率下的像素值;
因为我认为书中所说的“假设的显示分辨率”和显示屏所采用的实际的显示分辨率是不同的,之所以使用“假设的显示分辨率”,是为了方便得到不同的像素值。所以我的推测能够解释在相同的实际显示分辨率下,得到大小字体像素值是不一样的。这样,在显示屏上,就能够分辨出大小字体的不同。
但是,想到这里第一个让我感到疑惑的是:这里为什么要使用一个“假设的显示分辨率”来得到不同的大小字体像素值呢?直接设置大小字体为不同的像素值不是更好吗?如果需要适应在不同显示分辨率下的屏幕,也只需要更改各自的像素值就可以了。所以我想知道这样做的理由。
第二个疑惑是:我在看了第二段描红的文字后,感觉作者的说法看起来和第一段所说的自相矛盾了:先前说是为大小字体采用不同的“假设的显示分辨率”,但是而后又说所显示的像素值是根据实际的显示分辨率来确定的。这就让我对“假设的显示分辨率”和“实际的显示分辨率”这两者感到混淆了。
以上是我感到不解的地方,还望大家帮忙解惑,我所有的分数都给奉上,万分感谢!!!