c++ - win32 GDI C++ 中垂直文本不会加粗

标签 c++ text winapi gdi

我正在尝试在 win32 GDI api 中绘制垂直文本。 我调用 CreateFont(),角度为 2700,粗体为 900。

logPxlY = ::GetDeviceCaps (c->_hdc, LOGPIXELSY);
_hfont = ::CreateFont (-::MulDiv (point, logPxlY, 72),
    0, angle, weight, 0, FALSE, FALSE, FALSE, 0, 0, 0, 0,
    FIXED_PITCH | FF_MODERN, face);

其中面为“Courier New”,点为 9,角度为 2700,重量为 900。

文本旋转正确,但与正常的 Courier New 渲染相比,它非常微弱。这是因为 truetype 正在很好地打磨普通文本并且不会打扰奇怪的旋转文本或其他东西吗?

感谢您的见解:)

最佳答案

字体映射器有时可能有点奇怪。 700 是粗体,900 应该是“黑色”。但是,您可能有 Courier New Bold 字体文件,因此可以直接使用它,而您可能没有有 Courier New Black 字体文件,因此它将被合成 - 可能来自正常 Courier New 字体而不是 Courier New Bold 字体(不确定为什么会这样,但这就是生活)。

如果您尝试运行各种可能性,就像这样(目前是 MFC 代码,但无论如何这个想法都适用):

CFont fonts[num];

pDC->SetBkMode(TRANSPARENT);
for (int i=0; i<num; i++) {
    fonts[i].CreateFont(10, 0, 2700, 0, i*100, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, OUT_CHARACTER_PRECIS, PROOF_QUALITY, FF_MODERN, L"Courier New");
    pDC->SelectObject(fonts+i);
    pDC->TextOut(20+i*14, 20, L"This is some text");
}

您可能会看到的内容(无论如何我得到的内容)如下所示:

Various weights of Courier New

700 粗细的字体明显比 800 或 900 粗细的字体更粗。这也不是 Courier New 独有的 - 例如,将字体名称更改为 Times New Roman 的相同代码会生成如下输出:

Various weights of Times New Roman

这有点接近,但 700 的粗细仍然明显比 800 或 900 看起来更暗。我不会用屏幕截图来烦你,但当文本水平时会发生相同的效果。

编辑:另一个小细节:虽然它可能没有任何区别,但您当前计算字体大小的方式有点不正确 - 您正在使用 logpixelsy,这在字体水平时才有意义。对于垂直字体,您应该使用 logpixelsx 代替。在典型的屏幕上,它们是相同的,但在打印机上(例如)它们可能有很大不同。

关于c++ - win32 GDI C++ 中垂直文本不会加粗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397005/

相关文章:

python - 从给定另一个值的数组中选择条目

python - __main__.pyinstallerimporterror 无法加载 dynlib/dll "shcore"

c++ - 我可以在 System C(或 Plain Vanilla C++)的运行时设置数据断点吗?

c++ - 从派生类中调用 operator =

macos - CGContextShowTextAtPoint 的字体大小错误

pdf - 使用 Ghostscript 从 PDF 中提取文本 - 未知设备 : txtwrite

c++ - 没有模板的 std::array 迭代器范围?

c++ - 有哪些适合初学者的 DirectX 资源?

c - 如何将数据(结构)作为消息传递给线程。

c# - 为什么最大化/最小化事件导致关闭按钮在禁用后重新启用?