如何在不同的方位指定字体高度?
-
06-09-2019 - |
题
以创建与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字体映射器和打印机驱动程序是如何工作的。
没有正确的解决方案
其他提示
1)有72个点/英寸。 (它使用的是72.27但被改变)。 2)在你的方式结合LOGPIXELSX和LOGPIXELSY是好的,但 3)映射字体时,字体映射不看擒纵和方向。该LOGPIXELS值将只被用作坐标变换的一部分。
http://msdn.microsoft.com/en-我们/库/ ms969909(loband)的.aspx
不知道的是如何“打印机驱动程序的工作”,因为声明可能包括许多可能的驱动器和打印机。
它们可以具有正方形的像素光栅化,然后延伸到非正方形。他们可以改变字形曲线。他们可以做别的事情。
不隶属于 StackOverflow