标题:Win32程序 对大字体和小字体的疑惑
只看楼主
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
结帖率:87.5%
已结贴  问题点数:59 回复次数:7 
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.式子所得到的大/小字体像素值为实际的显示分辨率下的像素值;

因为我认为书中所说的“假设的显示分辨率”和显示屏所采用的实际的显示分辨率是不同的,之所以使用“假设的显示分辨率”,是为了方便得到不同的像素值。所以我的推测能够解释在相同的实际显示分辨率下,得到大小字体像素值是不一样的。这样,在显示屏上,就能够分辨出大小字体的不同。

但是,想到这里第一个让我感到疑惑的是:这里为什么要使用一个“假设的显示分辨率”来得到不同的大小字体像素值呢?直接设置大小字体为不同的像素值不是更好吗?如果需要适应在不同显示分辨率下的屏幕,也只需要更改各自的像素值就可以了。所以我想知道这样做的理由。
第二个疑惑是:我在看了第二段描红的文字后,感觉作者的说法看起来和第一段所说的自相矛盾了:先前说是为大小字体采用不同的“假设的显示分辨率”,但是而后又说所显示的像素值是根据实际的显示分辨率来确定的。这就让我对“假设的显示分辨率”和“实际的显示分辨率”这两者感到混淆了。

以上是我感到不解的地方,还望大家帮忙解惑,我所有的分数都给奉上,万分感谢!!!

搜索更多相关主题的帖子: 控制台 Windows 
2015-03-23 23:26
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
得分:0 
图怎么不见了?
重发:
图5-2


图5-3


公式


坚持----------------------------------唯一的道路
shit ! ! !
2015-03-23 23:29
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:15 
等TonyDeng吧
2015-03-24 07:38
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:15 
不用这么复杂吧,系统有像素到具体尺寸转换的API。
2015-03-24 10:23
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
得分:0 
以下是引用xzlxzlxzl在2015-3-24 10:23:47的发言:

不用这么复杂吧,系统有像素到具体尺寸转换的API。

恩,但是我想知道这么做的理由...

坚持----------------------------------唯一的道路
shit ! ! !
2015-03-24 14:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:29 
這是統一不同規格設備之間顯示尺寸的,同樣的代碼大小,顯示出來的字體物理尺寸會相同。

授人以渔,不授人以鱼。
2015-03-24 18:18
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
得分:0 
以下是引用TonyDeng在2015-3-24 18:18:45的发言:

這是統一不同規格設備之間顯示尺寸的,同樣的代碼大小,顯示出來的字體物理尺寸會相同。

同样的代码大小,是什么意思?

如果显示出来的字体物理尺寸相同,那么区分大小字体还有什么意义?难道这并不是用来区分大小字体的方法...

没看明白...能够说地再详细一点吗?

坚持----------------------------------唯一的道路
shit ! ! !
2015-03-25 00:06
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
得分:0 
你理解的像素和微软理解的像素有点不一样。你理解的像素,是指显示的图像,在没有冗余状态下,点对点的数值。这是像素的一种理想情况,实际上的像素,因屏幕尺寸和制造工艺有着很大的不同,一个1920x1200高解像度的设备上,将满屏设置为 640x480 分辨率,实际每个显示点(像素)占用了多个相邻显示点(像素)。操作系统首先要对这些设备进行无差别抽象,抽象的结果,就是使用独立于任何设备的一个度量单位(或者采取某种固定的换算因子,如 DPI)。

这个时候,像素就有了特定意义的属性。比如,在高分辨率设备上(1920x1200),我设置整体满屏显像分辨率是 640x480,如果我要显示 10x10 像素,在这样故意设置在低分辨率下的高解像度设备,光点依旧点对点显示,将输出很小的一个色块,那肯定不是我们希望的,系统必须对这种输出做出矫正,这个矫正值,就是 DPI,综合 DPI 来看,一个像素在这样的设备上,可能需要占用的是4个或者更多个显示点(见楼主贴图上的公式)。

设备被抽象后,我们只要知道像素这个东西,就可以保证不论任何分辨率的设备,我们都可以显示占比面积相同的图案来(其他工作都交给系统去做了)。那么反过来,当在同一个显像设备上,不改变全屏分辨率的情况下,系统如果改变了内部 DPI 因子,会导致什么后果?嗯,对了,当 DPI 改大的时候,实际分辨率没有扩大的情况下,显示的图像的占比就会变大。
2015-04-13 13:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443002-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028708 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved