18

C++でGDI+を使用しています。(この問題はC#にも存在する可能性があります)。

Graphics :: MeasureString()またはGraphics :: DrawString()を呼び出すと、文字列の左右に空白が埋め込まれることに気付きました。

たとえば、Courierフォント(イタリックではありません!)を使用していて、「P」を測定すると90になりますが、「PP」では150になります。モノスペースフォントでは、「PP」の幅がちょうど2倍になると思います。 。

私の質問は、これは意図された、または文書化された動作ですか、そしてこれを無効にするにはどうすればよいですか?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
4

5 に答える 5

12

これは仕様によるものであり、この方法では実際のグリフを使用して幅を測定しないため、オーバーハングの場合に少しパディングを追加します。

より正確な情報が必要な場合は、MSDNで別の方法を使用することをお勧めします。

レイアウト内の隣接する文字列に適したメトリックを取得するには(たとえば、フォーマットされたテキストを実装する場合)、MeasureCharacterRangesメソッドまたはStringFormatを受け取るMeasureStringメソッドの1つを使用して、 GenericTypographicを渡します。また、グラフィックのTextRenderingHintAntiAliasであることを確認してください。

于 2008-09-23T02:10:50.747 に答える
6

それは設計によるものですが、受け入れられた回答のリンクは実際には完全ではありません。問題は、実際に使用したいのがピクセル (int) である場合に、これらすべてのメソッドで float を使用することです。

TextRenderer クラスはこの目的のために意図されており、実際のサイズで機能します。これを使用するウォークスルーについては、 msdnのこのリンクを参照してください。

于 2008-11-12T08:28:42.080 に答える
5

追加StringFormat.GenericTypographicすると問題が解決します:

graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);

に同じ属性を適用しますDrawString

于 2011-12-15T06:20:08.137 に答える
1

このkbの記事に基づいて、ヒントに接続しているように聞こえます。GDIPlusとGDIで描画したときにテキストが異なるように見える理由

于 2008-09-23T02:13:46.823 に答える
0

TextRenderer は、フォントのサイズを取得するのに最適でした。しかし、描画ループでは、TextRenderer.DrawText を使用すると、graphics.DrawString() に比べて非常に遅くなりました。

文字列の幅が問題になるため、TextRenderer.MeasureText と graphics.DrawString を組み合わせて使用​​する方がはるかに優れています。

于 2008-12-04T21:24:48.257 に答える