以下代码在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中看起来都是相同的。这种差异是否有任何解释?
答案 0 :(得分:1)
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());