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

Posted

技术标签:

【中文标题】如何指定不同方向的字体高度?【英文标题】:How do I specify font height at different orientations? 【发布时间】:2010-10-30 02:39:53 【问题描述】:

使用 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】:

1) 有 72 点/英寸。 (它曾经是 72.27 但已更改。) 2)以您所做的方式结合 LOGPIXELSX 和 LOGPIXELSY 很好,但是 3) 字体映射器在映射字体时不看转义和方向。 LOGPIXELS 值将仅用作坐标变换的一部分。

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

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

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

【讨论】:

感谢字体映射器上文章的链接。不幸的是,在这个问题上还不够具体。假设我使用的打印机垂直每英寸 72 像素,水平每英寸 144 像素。如果我为普通字体指定 lfHeight 为 10,我将得到 10 磅高的文本。但是,如果我指定了 90 度的方向和转义,则不清楚字符是 5 点高还是 10 点。这取决于映射器和/或光栅器在应用 lfHeight 时是否考虑旋转。

以上是关于如何指定不同方向的字体高度?的主要内容,如果未能解决你的问题,请参考以下文章

泰山OFFICE技术讲座:三种文字方向,不同高度+不同对齐的效果对比

ID3DXFont : 文本被拉伸,如何获取字体的宽度和高度?

泰山OFFICE技术讲座:字体高度的深入研究

泰山OFFICE技术讲座:字体高度的深入研究

HTMLBody 拒绝输出我指定的字体大小,总是以不同的大小结束

javascript实现限定高度下文字随不同设备自适应改变字体大小至字数完全展示