Windows 8上的GDI + DrawString()截断字符串

时间:2012-11-27 13:40:39

标签: winapi visual-c++ windows-8 gdi+ gdi

以下代码在Windows 7(和以前版本的Windows)和Windows 8之间显示相同的字符串:

Graphics graphics(ps.hdc);

std::unique_ptr<StringFormat> format(StringFormat::GenericDefault()->Clone());
Font font(L"Segoe UI", static_cast<Gdiplus::REAL>(17.5), FontStyleBold, UnitPixel);     
format->SetTrimming(StringTrimmingNone);
std::wstring name("rt");
RectF rectName;
graphics.MeasureString(name.c_str(), -1, &font, PointF(20, 20), format.get(), &rectName);           

graphics.DrawString(name.c_str(), -1, &font, rectName, format.get(), &SolidBrush(Color()));

graphics.DrawRectangle(&Pen(Color(255, 0, 0)), rectName);

在Windows 7中,我在矩形内部得到字符串'rt',因为它应该出现。在Windows 8中,只显示第一个字母“r”。这似乎只发生在某些字符对上。例如,字符串're'在两个操作系统中都能正确显示。从MeasureString()返回的矩形在Windows 7和Windows 8中看起来都是相同的。这种差异是否有任何解释?

1 个答案:

答案 0 :(得分:1)

众所周知,{p> MeasureString有时会以效率的名义来捏造这些数字。它会做一些猜测,然后填充它填充的RectF,以便[希望]使它足够大,以使DrawString工作。我怀疑在字体渲染方面有些变化,或者系统的提示设置可能不同,当DrawString真正适合RectF中的文本时,这会造成麻烦。

.NET的Measure字符串方法实际上在this MSDN

中记录了这一点
  

MeasureString方法设计用于单个字符串   并包括字符串前后的少量额外空间   允许悬垂的字形。此外,DrawString方法调整   字形指向优化显示质量并可能显示字符串   比MeasureString报告的要窄。

作为一种变通方法,您可以要求MeasureString使用

进行更精确的字形测量
std::unique_ptr<StringFormat> format(StringFormat::GenericTypographic()->Clone());

而不是

std::unique_ptr<StringFormat> format(StringFormat::GenericDefault()->Clone());