1

次のコードは、Windows 7(および以前のバージョンのWindows)とWindows8の間で同じ文字列を異なる方法で表示します。

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()から返される長方形は、Windows7とWindows8の両方で同じように見えます。この違いの説明はありますか?

4

1 に答える 1

1

MeasureString効率の名目で時々数字を曖昧にすることが知られています。推測作業を行ってから、入力したRectFをパディングして、[うまくいけば]DrawStringが機能するのに十分な大きさにします。フォントのレンダリングに関して何かが変わったか、システムのヒント設定が異なっていて、DrawStringが実際にRectFのテキストに収まるときに問題が発生しているのではないかと思います。

.NETのMeasurestringメソッドは、実際にはこの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 に答える