Как рассчитать / ширину таблицы? - PullRequest
0 голосов
/ 29 мая 2018

Мое приложение MFC создает PDF-файлы, и теперь я пытаюсь встроить шрифты TrueType, чтобы встроить шрифт, который мне нужен, чтобы "сообщить" объекту шрифта в PDF Ширина глифа ,

У меня проблемы с получением этих значений, я уже пытался использовать GetCharABCWidthsFloat и GetCharWidthFloat и комбинировать с этот ответ , который говорит, что мне нужно использовать формулу (advance * 1000) / unitsPerEm (масштабирование результатов GetCharWidthFloat для получения аванса).

Но я не понимаю, как мне это масштабировать?есть ли функция winApi, которая возвращает эти значения?

Любая помощь будет оценена!Спасибо!

1 Ответ

0 голосов
/ 05 июня 2018

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) для расчета ширины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...