我正在尝试在 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");
}
您可能会看到的内容(无论如何我得到的内容)如下所示:
700 粗细的字体明显比 800 或 900 粗细的字体更粗。这也不是 Courier New 独有的 - 例如,将字体名称更改为 Times New Roman 的相同代码会生成如下输出:
这有点接近,但 700 的粗细仍然明显比 800 或 900 看起来更暗。我不会用屏幕截图来烦你,但当文本水平时会发生相同的效果。
编辑:另一个小细节:虽然它可能没有任何区别,但您当前计算字体大小的方式有点不正确 - 您正在使用 logpixelsy,这在字体水平时才有意义。对于垂直字体,您应该使用 logpixelsx 代替。在典型的屏幕上,它们是相同的,但在打印机上(例如)它们可能有很大不同。
关于c++ - win32 GDI C++ 中垂直文本不会加粗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397005/