Delphi 以点为单位将LogFont高度转换为字体大小
我有一个LOGFONT结构。现在我要做的就是从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);
mm\u Text
(通常是这样)并且lfHeight
字段为正值时,它已经给出了以点为单位的高度。当它为负数时,单位为像素。提供了要在它们之间转换的公式:
每英寸有72个点GetDeviceCaps
告诉您给定设备上每英寸的像素数。反转公式以从点获取像素:
PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY);
这里需要认识到的重要一点是,您需要一个设备上下文。字体大小并不独立于它们所显示的媒体而存在。屏幕上字体的像素高度将不同于打印机上字体的像素高度。使用您计划绘制到的任何画布的
Handle
属性。我也觉得这有点混乱。
以下是我学到的一些东西
lfPitchAndFamily
的两个低位以确定字体类型GetTextMetrics
和TEXTMETRIC
结构GetOutlineTextMetrics
和OUTLINETEXTMETRIC
结构。确保结构正确对齐。此外,结构尺寸可变。调用函数一次以获取大小、分配空间,然后再次调用函数以填充结构首先,文档并不是那么清晰或完整。>“当lfHeight字段为正数时”-然后字体映射器提供单元格高度的匹配,即字符高度+内部前导。为了得到点的大小,我们必须从(单元格)高度中减去内部前导,然后按照上面的步骤进行。我认为我的第一个评论有些模糊,有些误导。如果说模糊就不会了;“lfHeight”总是以像素为单位,唯一的区别是正值时为全单元格高度,负值时为绝对值为字符高度。如果这样说,就不会有误导性;由于LOGFONT结构没有“内部前导”信息,因此无法使用正高度计算点大小。必须选择DC的字体,然后使用GetTextMetrics,然后字符高度为tmHeight。
PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY);