【问题标题】:Converting LogFont height to Font size in points将 LogFont 高度转换为以磅为单位的字体大小
【发布时间】:2011-02-26 00:19:28
【问题描述】:

我有一个 LOGFONT 结构。现在我想做的就是从 LOGFONT 高度获取相关的字体大小。

【问题讨论】:

    标签: delphi fonts delphi-2007 font-size


    【解决方案1】:

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

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

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

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

    这里要意识到的重要一点是您需要一个设备上下文。字体大小并不独立于它们出现的媒体。屏幕上字体的像素高度与打印机上字体的像素高度不同。使用您计划绘制到的任何画布的Handle 属性。

    【讨论】:

    • > "when the lfHeight field is positive" - 然后字体映射器为单元格高度提供匹配,即字符高度+内部前导。要获得点大小,必须从(单元格)高度中减去内部前导,然后按上述方法进行。
    • 我认为我的第一条评论有些含糊,有些误导。如果说的话就不会含糊; “lfHeight”总是以像素为单位,唯一的区别是当为正时它是完整的单元格高度,当它为负时它的绝对值是字符高度。如果说不会有误导性;由于 LOGFONT 结构没有“内部前导”信息,因此无法计算具有正 lfHeight 的点大小。必须将字体选择到 DC,然后使用 GetTextMetrics,然后字符高度为 tmHeight-tmInternalLeading。
    【解决方案2】:

    我也觉得这有点令人困惑。 以下是我学到的一些东西。 ;)

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

    请记住,它们是推荐值,并非所有显示例程都能正确使用它们。例如,我正在寻找一种正确的方法来确定给定文本字符串的对话框静态控件所需的高度。 微软似乎没有遵循他们自己的文档。 ;) 并不是说文档一开始就那么清楚或完整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2018-10-08
      • 2023-03-14
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多