1 em
равно 12 points
см. Ссылку
Для режима отображения MM_TEXT
высота шрифта определяется как:
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
//or
lfHeight = round(PointSize * GetDeviceCaps(hDC, LOGPIXELSY) / 72.0f);
см. LOGFONG
документацию
Например, для экрана рабочего стола, при 100% DPI, GetDeviceCaps(hDC, LOGPIXELSY)
возвращает 96
.В этом случае мы имеем:
1em = 16, при 100% DPI
или
1em = 20, при 125% DPI
или
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)
для расчета ширины.