1

GDI を使用してテキスト ボックスからテキストを描画しています。ただし、GDIで描画しているのと同じ量のスペースを反映するようにテキストボックスを作成しようとしています。したがって、GDI の幅の X 量については、テキスト ボックス内の文字列の長さがこの幅を超えないようにしたいと考えています。

GDI で文字列を描画するには、次を使用しています。

Font font = new Font("Lucidia Console", 8, GraphicsUnit.Point);
StringFormat sf = (StringFormat)StringFormat.GenericTypographic.Clone();
g.DrawString(textFromTextbox, font, Brush, layoutRect, sf);

テキストボックスに関しては、文字が入力されると文字列を測定します。

Font font = new Font("Lucidia Console", 8, GraphicsUnit.Point);
Size lineSize = TextRenderer.MeasureText(textbox.Text, font);
Size charSize = TextRenderer.MeasureText(e.KeyChar.ToString(), font);

if( charSize + lineSize > MAX_LINE_SIZE )
 //Other stuff;

Lucidia Console 8ptをフォントとして使用したテキストボックス自体もあります。

そのため、問題は、GDIで描画している幅と同じ幅のX幅のテキストボックスを作成することになります。

グリフ、em サイズとピクセルの比率、およびその他のトピックについてあらゆる種類の議論に出くわしましたが、解決策はほとんどありません。

何か案は?

4

2 に答える 2

1

g.DrawStringは、GDI+を使用して画面にテキストを描画します。

TextRenderer.MeasureTextはGDIを使用します。

これらは2つの異なるテキストレンダリングモデルであるため、目的の結果は得られません。

Graphics.DrawStringと互換性のあるGraphics.MeasureStringメソッドがありますが、一貫して動作するようになったことはありません。それはあなたのニーズには十分かもしれませんが、試してみる価値があります。

また、CodeProjectに関する記事があり、正確なサイズを取得するために、テキストをビットマップに描画し、ビットマップから測定値を取得しました。詳細は覚えていませんが、見つけるのは難しいことではありません。この記事は、.netのみのコードでコントロールのようなテキストボックスを作成することに関するものでした。

もう1つの方法は、TextRenderer.DrawTextを使用してテキストをレンダリングすることです。これは実際に機能し、TextRenderer.MeasureTextとうまく一致します。あなたがたくさんの測定をしているなら、それはちょっと遅いかもしれませんが。

于 2010-04-08T20:38:16.703 に答える
0

インスタンスにあるMeasureStringメソッドを使用できSystem.Drawing.Graphicsます。

于 2009-11-03T21:52:29.653 に答える