使用 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 字体映射器和打印机驱动程序的工作方式。