2009-05-16 16 views
0

大きな境界ボックスに文字列を描画し、StringFormatを使用して文字列を適切に配置します。しかし、文字列の実際の(X、Y)位置は、一度描画されると(MeasureStringで指定されたサイズだけではなく)必要です。WinForms(C#)を使用して文字列を描画した後の文字列の配置

私は以下のコードを使用しています:

CharacterRange[] ranges = { new CharacterRange(0, this.Text.Length) }; 
format.SetMeasurableCharacterRanges(ranges); 

//Measure character range 
Region[] region = g.MeasureCharacterRanges(this.Text, this.Font, layoutRect, format); 
RectangleF boundsF = region[0].GetBounds(g); 
bounds = new Rectangle((int)boundsF.Left, (int)boundsF.Top, 
         (int)boundsF.Width, (int)boundsF.Height); 

をそれはとても欠落している宣言を無視するコードセグメントです。ポイントは、上のコードが与えた長方形が正しいサイズではなく、文字列の最後の文字が削除され、文字列の最初の行だけが描画されていることです。

誰でも知っているのでしょうか、それとももっと良い方法でしょうか?

おかげ

答えて

2

テキストの測定に正しい形式を使用していることを確認してください。あなたはソースコード全体を含んでいないので、あなたがいるかどうかわかりません。

使用できる「標準」形式の値は、 StringFormat.GenericTypographicStringFormat.GenericDefaultです。メモリが使用されている場合、選択されたデフォルトの値は通常GenericDefaultですが、UIをレンダリングするときに必要な値はGenericTypographicです。

したがって、new StringFormat()の代わりにStringFormat.GenericTypographic.Clone()を実行します。これで余白/間隔が修正され、Graphicsサーフェスでレンダリングされたものと一致する測定結果が得られます。

私が通常使用する戦略は、StringFormatという単一のインスタンスを作成し、それをテキストレンダリングと測定に使用して、ラインアップを確実にすることです。StringFormatを省略する方法はありません。欲しいです。

これが役に立ちます。それでも問題が解決しない場合は、より完全なコードスニペットを投稿して、テキストをどのようにペイントしているかを確認してください。

1

使用:このメソッドへの追加のオーバーロードがあることを

TextBox tb = new TextBox { Text = "Test", Multiline = true }; 
Size size = System.Windows.Forms.TextRenderer.MeasureText(tb.Text, tb.Font); 
Point location = new Point(//Is this what you were looking for? 
    tb.Location.X + size.Width, 
    tb.Location.Y + size.Height); 

注意、チェックしてみてください。

+0

応じTextRendererで再び測定し、サイズと位置を調整しています。 – Shimmy

0

私は間違いなく同じStringFormatオブジェクトを使用して、テキストを測定し描画します。

私は何をやってしまったことは、私は上記のコードを使用して、私はよく覚えている場合は、このような追加機能があるのDataGridViewCellに、また

関連する問題