2012-02-02 6 views
3

私は基本的に私がお互いの下に異なる文字列を描画することを可能にするコントロールを作成しようとしています。 しかし、文字列の幅はコントロールの幅より大きくてはなりません。 この問題を解決するために、私はRectangleFオブジェクトをGraphics.DrawStringメソッドに渡すことを考えていました。それは渡された矩形の幅よりも広い文字列をラップします。文字列が大きすぎると文字列全体を見ることができないという問題は解決しますが、別の問題があります。私はこのラップされた文字列を測定する

Graphics g = e.Graphics; // Paint event 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, 12), someRectangleF); 

ような何かをしようとした場合の問題は、someTextが包まれてしまった場合、三行目は、このように、それは不可能/ハード読み取られるようになって、最初のテキストの上でテキストをペイントすることになります。

私はこの問題の解決策を探していましたが、いくつかの興味深いリンクが見つかりました。ただし、各文字の幅などを測定するforループの使用が含まれていました。 これを行う簡単な方法はありますか?

+0

TextBlockをWrappingで使用することを検討しましたか?構築しようとしているコントロールはListViewのように見えます。なぜカスタムコントロールですか? – Paparazzi

+0

ListViewの使用を検討しました。しかし、私のコントロールは、私のプログラムが印刷できるタイムテーブルを表しています。そして印刷されたListViewは本当に良く見えないので、私自身のコントロールを作成しようとしています。ああ、申し訳ありませんが、私はWinFormsを使用していることに言及するのを忘れました。私は私の質問を編集しました。 – haiyyu

答えて

5

Graphics.MeasureStringメソッドを使用して文字列の寸法を取得し、それに応じて次の文字列を描画できますか?

SizeF size = g.MeasureString(someText, someFont, someRectangleF.Size.Width); 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, size.Height), someRectangleF); 
+0

悲しいことに、私はそれを試みました。 MeasureStringはワードラップをサポートしていません。 – haiyyu

+5

ドキュメントを引用するために使用されています。「widthパラメータは、返されるSizeF構造体の幅コンポーネントの最大値を指定します(幅)。widthパラメータが文字列の実際の幅より小さい場合、返されるWidthコンポーネントは指定された幅に収まる最大文字数を表す値。返されるHeightコンポーネントは、文字列全体に対応するために、文字ラップを含む文字列を表示できる値に調整されます。 http://msdn.microsoft.com/en-us/library/9bt8ty58.aspx –

+0

ああ、私は参照してください。私は実際にそのページを読んできました、私はそれを誤解していたに違いありません。ありがとう! – haiyyu