Обычный способ создания шрифта с помощью GDI - это использование желаемого размера точки и вертикального разрешения (DPI) целевого устройства, например:
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);
Предполагая режим отображения MM_TEXT
по умолчанию, он преобразует point_size в высоту пикселя для нужного устройства. (Это общее приближение. На самом деле в дюйме 72,27 точки, а не 72). (Знак минус означает, что я хочу указать действительную высоту символа, а не высоту ячейки.)
Если я хочу создать боковой шрифт - то есть с ориентацией и отклонением 90 градусов - я использую LOGPIXELSX
вместо LOGPIXELSY
? Для некоторых принтеров, на которые я нацеливаюсь, разрешение по горизонтали и вертикали различается.
Как правило, если я хочу получить угол theta
, могу ли я объединить LOGPIXELSX
и LOGPIXELSY
? Я думаю о чем-то вроде этого:
// Given theta in degrees (e.g., theta = 45.0) ...
double theta_radians = theta * 2.0 * pi / 360.0;
int dpi = static_cast<int>(GetDeviceCaps(hdc, LOGPIXELSX) * sin(theta_radians) +
GetDeviceCaps(hdc, LOGPIXELSY) * cos(theta_radians) +
0.5);
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, dpi, 72);
// Set escapement and orientation to theta in tenths of a degree.
lf.lfEscapement = lf.lfOrientation = static_cast<LONG>(theta * 10.0 + 0.5);
...
Это имеет для меня интуитивно понятный смысл, но мне интересно, действительно ли так работают средства отображения шрифтов GDI и драйверы принтеров.