1

以下代码在 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 中似乎是相同的。对这种差异有什么解释吗?

4

1 回答 1

1

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

.NET 的 Measure string 方法实际上在此 MSDN中记录了这一点:

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

作为一种解决方法,您可以使用 MeasureString 进行一些更精确的字形测量

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

代替

std::unique_ptr<StringFormat> format(StringFormat::GenericDefault()->Clone());
于 2012-11-27T14:57:50.773 回答