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

问题描述:

的常用方法来创建与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字体映射器和打印机驱动程序是如何工作的。

+0

你真的在这样的打印机上试过这段代码吗?你会想测试你得到的任何解决方案,对吧? – 2009-09-21 22:38:28

+0

结果因打印机而异,所以推测驱动程序是越野车。我想知道它是如何工作的。 – 2010-07-20 16:31:09

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

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

不能确定如何“打印机驱动程序的工作”,因为声明可能包括许多可能的驱动器和打印机。

它们可以用方形像素进行光栅化,然后拉伸到非方形。他们可以转换字形曲线。他们可以做别的事情。