直到今天,我一直在使用GetTextExtentPoint32来度量要呈现的文本,然后再使用DrawText进行呈现。
由于我现在需要呈现一个多行文本,所以我必须将DrawText与DT_CALCRECT一起使用(因为GetTextExtentPoint32忽略换行符)。
然而,这导致文本呈现不同,主要是通过减少字符间距。例如:

底部呈现是在更改后进行的。我隔离了这个问题,通过在使用来自DrawText的原始输出时调用第一个GetTextExtentPoint32来发现这个问题--问题仍然存在。
下面是调用顺序的缩减:
::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之前似乎是罪魁祸首。
我还应该做些什么?
发布于 2021-06-24 14:55:41
在字体创建过程中,LOGFONT中的字体质量和精度标志如何?你有没有试着看看这会不会有什么区别?
我也不明白最后一句。你是说如果你移除DrawText (.DT_CALC)还是移动后 CreateDIBSection的结果是不同的,没有坏的字符间距?
https://stackoverflow.com/questions/68098947
复制相似问题