如何指定不同方向的字体高度?

时间:2009-05-30 14:21:43

标签: printing fonts gdi orientation

使用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的角度,我是否要合并LOGPIXELSXLOGPIXELSY?我在考虑这样的事情:

// 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 个答案:

答案 0 :(得分:0)

1)有72点/英寸。 (它曾经是72.27但是被改变了。) 2)以你的方式组合LOGPIXELSX和LOGPIXELSY很好,但是 3)字体映射器在映射字体时不会查看擒纵机构和方向。 LOGPIXELS值仅用作坐标转换的一部分。

http://msdn.microsoft.com/en-us/library/ms969909(loband).aspx

不确定“打印机驱动程序如何工作”,因为该语句可能包含许多可能的驱动程序和打印机。

他们可以用方形像素光栅化,然后拉伸到非方形。他们可以改变字形曲线。他们可以做点别的事。