关于TEXTMETRIC的一些奇怪之处

时间:2012-02-01 13:35:52

标签: windows winapi

我正在读书

  

Programming.Windows.5th.Edition,Charles Petzold

当我在做图4-5时。 SYSMETS1.C,我遇到了以下代码:

cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;

并且书中有解释,

  

SYSMETS1还在静态变量cxCaps中保存大写字母的平均宽度。对于固定间距字体,cxCaps将等于cxChar。对于可变宽度字体,cxCaps设置为cxChar的150%。 TEXTMETRIC结构中tmPitchAndFamily字段的低位对于可变宽度字体为1,对于固定间距字体为0。 SYSMETS1使用该位从cxChar计算cxCaps。

既然cxCaps设置为cxChar的150%,我认为它应该是

cxCaps =(tm.tmPitchAndFamily& 1? 3.0 2.0 )* cxChar / 2;

你能帮我解释一下吗?谢谢!

2 个答案:

答案 0 :(得分:2)

cxCharcxCaps有哪些类型?如果cxCharfloatdouble,则没有问题,因为乘法的结果将在除以2之前转换为该类型,结果将为1.0或1.5 。但是cxCaps也应该是浮点类型,因此它可以保存浮点值。

修改

我检查了这本书的代码,发现它们都是int。而且我发现不需要浮点变量 例如,假设cxCahr为20.如果tm.tmPitchAndFamily & 1导致1,那么表达式将为

cxCaps = 3 * cxChar / 2;

cxCaps将为30。如果结果为0,'cxCaps'将为'20'。一切都很好。如果cxChar是一个奇数,那么丢失的值将是0.5,这很容易被忽略。

答案 1 :(得分:0)

它正在尝试计算整数结果,以像素表示。有效计算为(3 * cxChar) / 2,而不是3 * (cxChar / 2)。大概是后者让你停下来。

对于比例字体,它将向下舍入,但永远不会超过单个像素。这无关紧要,因为无论如何这个值只是一个猜测,实际宽度对于比例字体中的每个字形都是不同的。

对于可读性没有得分,你可以像这样重写:

bool proportional = tm.tmPitchAndFamily & TMPF_FIXED_PITCH;
if (proportional) cxCaps = (3 * cxChar) / 2;
else cxCaps = cxChar;

注意标志的名称是多少,也许是Petzold这样写的原因。