Delphi 以点为单位将LogFont高度转换为字体大小

Delphi 以点为单位将LogFont高度转换为字体大小,delphi,fonts,delphi-2007,font-size,Delphi,Fonts,Delphi 2007,Font Size,我有一个LOGFONT结构。现在我要做的就是从LOGFONT高度获取相关的字体大小(以点为单位)。当映射模式为mm\u Text(通常是这样)并且lfHeight字段为正值时,它已经给出了以点为单位的高度。当它为负数时,单位为像素。提供了要在它们之间转换的公式: 每英寸有72个点GetDeviceCaps告诉您给定设备上每英寸的像素数。反转公式以从点获取像素: PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY);

我有一个LOGFONT结构。现在我要做的就是从LOGFONT高度获取相关的字体大小(以点为单位)。

当映射模式为
mm\u Text
(通常是这样)并且
lfHeight
字段为正值时,它已经给出了以点为单位的高度。当它为负数时,单位为像素。提供了要在它们之间转换的公式:

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

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

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

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

  • 检查
    lfPitchAndFamily
    的两个低位以确定字体类型
  • 对于固定间距字体,请使用
    GetTextMetrics
    TEXTMETRIC
    结构
  • 对于可变间距字体(true type等),请使用
    GetOutlineTextMetrics
    OUTLINETEXTMETRIC
    结构。确保结构正确对齐。此外,结构尺寸可变。调用函数一次以获取大小、分配空间,然后再次调用函数以填充结构
  • 从那里,您可以找到正确的上升、下降和其他与尺寸相关的信息
  • 请记住,它们是推荐值,并非所有显示例程都能正确使用它们。例如,我正在寻找一种正确的方法来确定给定文本字符串的对话框静态控件所需的高度。 微软似乎没有遵循他们自己的文档。;)
    首先,文档并不是那么清晰或完整。

    >“当lfHeight字段为正数时”-然后字体映射器提供单元格高度的匹配,即字符高度+内部前导。为了得到点的大小,我们必须从(单元格)高度中减去内部前导,然后按照上面的步骤进行。我认为我的第一个评论有些模糊,有些误导。如果说模糊就不会了;“lfHeight”总是以像素为单位,唯一的区别是正值时为全单元格高度,负值时为绝对值为字符高度。如果这样说,就不会有误导性;由于LOGFONT结构没有“内部前导”信息,因此无法使用正高度计算点大小。必须选择DC的字体,然后使用GetTextMetrics,然后字符高度为tmHeight。
    PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY);