2

Graphics.DrawString を使用して、個々の色を使用して文字を描画したいと考えています。

問題は、DrawString を呼び出すたびに、他の文字に対して (Point または Rectangle を使用して) どこに配置するかを知る必要があることです。

これは、StringFormat を使用して四角形で DrawString を使用するときに発生するカーニングとラッピングを考慮すると、ほぼ可能です。StringFormat は、配置、折り返し、トリミングなどを指定するために重要です。

理想的には、各文字を個別に色付けする方法を DrawString に伝えることができます。もう 1 つのオプションは、StringFormat を使用して四角形内の文字列を測定し、各文字インデックスの X 位置と Y 位置を取得して、独自のブラシでそれぞれを描画できる場合です。

各文字を個別に測定しようとしましたが、文字列内の文字の組み合わせが各文字を個別に測定した幅と同じではないため、うまくいきません。

編集:文字列を取得し、領域配列を取得し、それらの領域を赤と青で交互に塗りつぶし、それらの領域に個々の文字を描画しようとすると、次のようになります。

ここに画像の説明を入力

次のように DrawString を呼び出しています。

g.DrawString(character, font, brush, region.GetBounds(g));

次のことも試しました:

Rectangle bounds = Region.GetBounds(g);
g.DrawString(character, font, brush, new PointF(bounds.Left, bounds.Top));

と、

g.DrawString(character, font, brush, region.GetBounds(g), stringFormat);

同じ結果です。

4

1 に答える 1

2

GDI+ の DrawString は、取得した左オフセットを説明する結果をパディングしています。

GDI を使用して文字列を測定してみてください。幸いなことに、これは実装されており、TextRenderer()オブジェクト f.exを介して .Net から簡単にアクセスできます。

Size sz = TextRenderer.MeasureText(character, 
                                   font, 
                                   new Point(Integer.MaxValue, Integer.MaxValue),
                                   TextFormatFlags.NoPadding);

を調べることもできますTextRenderer.DrawText()

もちろん、いつでもStringFormatインスタンスを変更して、中央揃えを使用DrawStringし、ポイントの代わりに長方形を使用できます。

StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
Rectangle cr = new Rectangle(x, y, w, h); //same as the colored region
g.DrawString(character, font, brush, cr, sf);

お役に立てれば。

于 2012-11-01T01:39:26.840 に答える