【发布时间】:2021-09-06 22:57:18
【问题描述】:
直到今天,在使用 DrawText 渲染之前,我一直使用 GetTextExtentPoint32 来测量要渲染的文本。
由于我现在需要渲染多行文本,我必须使用 DrawText 和 DT_CALCRECT(因为 GetTextExtentPoint32 忽略换行符)。
但是,这会导致文本呈现不同,主要是通过减少字符间距。例如:
底部渲染是更改后的。
我已经隔离了问题,只需在使用GetTextExtentPoint32 的原始输出时调用第一个DrawText - 问题仍然存在。
以下是调用顺序的缩减:
::GetTextExtentPoint32(...); // Result is used
::DrawText(... DT_CALCRECT); // Result is unused
BITMAPINFOHEADER bih = { size values from GetTextExtentPoint32 };
hBitMap = ::CreateDIBSection(... (BITMAPINFO*)&bih, ...);
::SelectObject (hdc, hBitMap);
::DrawText(...); // Render the text
注意,我是否删除第二行中的DT_CALCRECT 并不重要。对DrawText 之前 CreateDIBSection 的调用似乎是罪魁祸首。
我还应该尝试什么?
【问题讨论】:
-
如果这是我认为的错误,那么这是一个错误,其中某些内部浮点定位状态保留在 GDI 中的某处。在某些情况下(尤其是工具提示),同样的错误也会导致带有 .NET 框架的 GDI+ 中出现错误的字符间距。几年前我找到了确切的问题,并在一些文章中找到了提示,但不幸的是我不记得细节了。
-
试图筛选一些旧程序;不确定,但您可以通过在 DC 中选择不同的 HFONT 来解决此问题,然后选择回您实际想要绘制的字体,可能就在“真实”
DrawText调用之前。