我的MFC应用程序生成PDF,现在我正在尝试嵌入TrueType字体,嵌入一个字体,我需要“告诉”PDF上的字体对象Glyph Widths,
我无法获取这些值,我已尝试使用GetCharABCWidthsFloat
和GetCharWidthFloat
并与this answer结合使用,表示我需要使用公式(advance * 1000) / unitsPerEm
(缩放GetCharWidthFloat
的结果以获得进展)。
但我不明白我会如何扩展?是否有返回这些值的winApi函数?
任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
1 em
等于 12 points
see reference
对于MM_TEXT
映射模式,字体高度定义为:
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
//or
lfHeight = round(PointSize * GetDeviceCaps(hDC, LOGPIXELSY) / 72.0f);
例如,对于桌面屏幕,在100%DPI时,GetDeviceCaps(hDC, LOGPIXELSY)
返回96
。在这种情况下,我们有:
1em = 16,在100%DPI下 或
1em = 20,DPI为125% 或
1em = 24,在150%DPI下
double inch_per_pixel_y = (double)dc.GetDeviceCaps(LOGPIXELSY);
int size_em = 1;
int size_from_em = (int)round(size_em * inch_per_pixel_y / 6.0f);
printf("size_from_em %d\n", size_from_em);
size_em = (int)round(size_from_em * 6.0f / inch_per_pixel_y);
printf("size_from_em %d\n", size_em);
请注意,我们在这里失去了很多精确度。也许这就是PDF与因子1000相乘的原因。
使用dc.GetDeviceCaps(LOGPIXELSX)
进行宽度计算。