2010-05-31 114 views

回答

11

当映射模式为mm_Text(通常是),并且lfHeight字段为正数时,它已经给出了以点为单位的高度。当它是负值时,单位是像素。 MSDN for LogFont给你公式它们之间的转换:

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); 

每英寸有72点。 GetDeviceCaps告诉您给定设备上每英寸的像素数。反转公式以从点获取像素:

PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY); 

这里要实现的重要一点是您需要设备上下文。字体大小不独立于其出现的媒体而存在。屏幕上字体的像素高度将与打印机上字体的像素高度不同。使用您计划绘制的任何画布的Handle属性。

+3

>“当lfHeight字段为正值时” - 然后字体映射器为单元格高度提供匹配,即字符高度+内部引导。要获得点的大小,必须从(单元格)高度中减去内部前导,然后按照上述步骤操作。 – 2010-05-31 15:58:56

+2

我认为我的第一条评论有点模糊,有点误导。如果说,模糊不会; “lfHeight”总是以像素为单位,唯一的区别是当它是完整的单元格高度,当它的绝对值是字符高度时。如果说有误导性;由于LOGFONT结构没有“内部领先”信息,所以无法通过正面高度计算点的大小。必须选择字体到DC然后使用GetTextMetrics,然后字符高度为tmHeight-tmInternalLeading。 – 2010-06-01 21:41:14

1

我觉得这也有点混乱。 以下是我学到的一些东西。 ;)

  1. 检查lfPitchAndFamily的两个低位以确定字体类型。
  2. 对于固定间距字体,请使用GetTextMetricsTEXTMETRIC结构。
  3. 对于可变间距字体(真实类型等),请使用GetOutlineTextMetricsOUTLINETEXTMETRIC结构。确保你的结构正确对齐。此外,结构是可变大小的。调用一次函数来获得大小,分配空间,然后再次调用函数来填充结构。
  4. 从那里,你可以找到适当的上升,下降和其他尺寸相关的信息。

请记住,它们是推荐值,并非所有显示例程都能正确使用它们。例如,我正在计算确定给定字符串文本的对话框静态控制所需高度的正确方法。 似乎并没有Microsoft遵循他们自己的文档。 ;) 不是说文档是全部清楚或完整的,首先。

相关问题