如何理解《Windows程序设计》第5章图形设计中“设备的大小”中下面的一段文字:
------------------------------------------------------------------------------------------------
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的值。
图5-3显示大字体。这是依据每英寸120点的分辨率。同样,它是10点字体,10/72乘以120点,每英寸等于16图素,即是tmHeight减tmInternalLeading的值。12点行距等于20图素,即是tmHeight的值。(像第四章一样,再次强调所显示的是实际的度量大小,因此您可以理解
它工作的方式。不要在您的程序中对此写作程序。)
在Windows程序中,您可以使用GetDeviceCaps函数取得使用者在「控制台」的「显示器」程序中选择的以每英寸的点数为单位的假定分辨率。
要得到这些值(如果视讯显示器不具有正方形图素,在理论上这些值是不同的),可以使用索引LOGPIXELSX和LOGPIXELSY。LOGPIXELS指逻辑图素,它的基本意思是「以每英寸的图素数为单位的非实际分辨率」。
------------------------------------------------------------------------------------------------
首先我们必须指出,这其中有些错误的地方(不知道是翻译错误还是印刷错误,这就不得而知了),更正后(逗号的位置不一样了)的文字如下:
------------------------------------------------------------------------------------------------
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的值。
图5-3显示大字体。这是依据每英寸120点的分辨率。同样,它是10点字体,10/72乘以120点每英寸,等于16图素,即是tmHeight减tmInternalLeading的值。12点行距等于20图素,即是tmHeight的值。(像第四章一样,再次强调所显示的是实际的度量大小,因此您可以理解
它工作的方式。不要在您的程序中对此写作程序。)
在Windows程序中,您可以使用GetDeviceCaps函数取得使用者在「控制台」的「显示器」程序中选择的以每英寸的点数为单位的假定分辨率。
要得到这些值(如果视讯显示器不具有正方形图素,在理论上这些值是不同的),可以使用索引LOGPIXELSX和LOGPIXELSY。LOGPIXELS指逻辑图素,它的基本意思是「以每英寸的图素数为单位的非实际分辨率」。
------------------------------------------------------------------------------------------------
可是上面的这段文字仍然令人费解啊,为什么呢?疑问如下:
"不考虑是大字体还是小字体,也不考虑所选择的视频图素大小-固定假设为10点字体", "10点即是10/72英寸"
通过上面两句话,我们可以得出这样的结论: 无论大字体还是小字体,都为10点字体,即是10/72英寸.
既然物理尺寸都是10/72英寸,也就是说大小相同了,怎么可以区分大小字体呢????????????????????
于是我们可以这样反推回来想,既然分为大小字体,也就是说他们是在同一分辨率下,字体的的像素值是不一样大的,也就是物理尺寸肯定是不一样大的.大字体比小字体要大(大字体>小字体).
同时我们看到作者得出来的最后结果是:
小字体: 13图素
大字体: 16图素
为了符合我们上面反推出来的结论(大字体>小字体),那么这里的两个像素值肯定是在同一分辨率的两个像素值.
------------------------------------------------------------------------------------------------
为了理解上面的说法,我们必须先搞清楚几个概念.
1.什么是像素?
(简单的说,我们通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素” (Pixel)。
像素分为CCD像素和有效像素,现在市场上的数码相机标示的大部分是CCD的像素而不是有效像素。 )
而我的理解无非也就这么简单, 像素本质上就是一个感光元件在显示屏上的映射.反正在显示屏上他就是一个小方点.
2. 分辨率又是什么呢?
分辨率和像素是密不可分的.
分辨率就是在单位长度(显示屏上通常指1英寸)中,所表达或撷取的像素数目.
显示器分辨率,就是Windows桌面的大小。常见的设定有640x480、800x600、1024x768…等。
那么我们可以得出这样一个结论: 同一显示器,分辨率设定得越高,像素的大小(指SIZE)就应该越小.(像素的个数肯定就越多,这里指数量,比如说多少多少万像素,就是指数量)
举个例子来说明:假设1英寸里只有10个像素,那么像素的大小就应该是1/10英寸(分辨率低的情况); 那么如果1英寸里有1000个像素,那么像素的大小就应该是1/1000英寸(分辨率高的情况). 上面的结论已经非常明显了.
------------------------------------------------------------------------------------------------
那么我们继续讨论作者的文字
关于小字体的描述:
"再看看图5-2。那是小字体,它依据的显示分辨率为每英寸96点。我说过它是10点字体。10点即是10/72英寸,如果乘以96点,每英寸大概就为13图素。"
按照我的理解就是: 显示分辨率为每英寸96点,那么一个像素的大小就应该为1/96英寸,因为1英寸里面有96个像素点(这是根据分辨率的概念得出来的).
我们假设小字体有numSmall个像素点,那么就有这样的结论了: 1/96英寸*numSmall = 10/72英寸, 于是我们得出numSmall = 13.
也就是说,小字体由13个像素点(每个像素点的大小为1/96英寸)组成.
可是关于大字体的描述:
"图5-3显示大字体。这是依据每英寸120点的分辨率。同样,它是10点字体,10/72乘以120点每英寸,等于16图素"
按照我的理解就是: 显示分辨率为每英寸120点,那么一个像素的大小就应该为1/120英寸,原因同上(因为1英寸里面有120个像素点).
我们假设大字体有numLarger个像素点,那么就有这样的结论了: 1/120英寸*numLarger= 10/72英寸, 于是我们得出numLarger = 16.
也就是说,大字体由16个像素点(每个像素点的大小为1/120英寸)组成.
------------------------------------------------------------------------------------------------
根据上面所有的结论,我们可以肯定下面的观点是正确的:
1.大字体和小字体显示在显示屏上的物理大小是不一样的,大字体>小字体.(这是很正常的,这也是人的正常逻辑思维)
2.大字体和小字体是在同一分辨率下显示在显示屏上的.(因为我们在切换大小字体的时候,并没有去重新设定显示器的分辨率,所以他是不变的)
3.大字体和小字体的"10点即是10/72英寸", 这并不是大小字体的真正大小.它只是一个衡量值.
(真正的大小是, 假设在显示分辨率为每英寸96点的时候, 小字体的大小为1/96英寸*13=10/72英寸,而大字体的大小应该为1/96英寸*16)
于是我们理解作者上面文字的意思是: 10点即是10/72英寸,只是一个参照值,用来计算真正的大小字体.
而大小字体的区分却在于根据"10点即是10/72英寸",以及一个假设的分辨率,通常是大于小字体所用的分辨率(作者的例子是小字体用了每英寸96点的分辨率,大字体用了每英寸120点的分辨率),就可以计算出大字体在同一分辨率下的像素值(16).
小字体: 1/96英寸*numSmall = 10/72英寸
(每英寸96点的分辨率为显示器的实际分辨率,10/72英寸永远都是固定不变的一个值.)
大字体: 1/120英寸*numLarger = 10/72英寸
(每英寸120点的分辨率只是一个假定的实际分辨率,用来计算出numLarger的大小,10/72英寸永远都是固定不变的一个值.)
------------------------------------------------------------------------------------------------
当时在网上搜索了很多资料,都没有找出满意的解答,于是我经过自己的思考就得出了上面的结论。
其实我理解以后,这就是这么一回事吧。请大家多多在此讨论,发表自己的观点和理解,共同进步。
如果我有什么理解错误之处,还请大家多多赐教。 谢谢大家!
本文出自 “将弛直奔” 博客,请务必保留此出处http://cnmtjp.blog.51cto.com/204390/39591