1 em 等于 12 points
see reference
对于MM_TEXT映射模式,字体高度定义为:
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
//or
lfHeight = round(PointSize * GetDeviceCaps(hDC, LOGPIXELSY) / 72.0f);
see LOGFONG documentation
例如,对于桌面屏幕,在 100% DPI 时,GetDeviceCaps(hDC, LOGPIXELSY) 返回 96。在这种情况下,我们有:
1em = 16,100% DPI
或
1em = 20,DPI 为 125%
或
1em = 24,DPI 为 150%
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) 进行宽度计算。