2011-12-18 8 views
3

Graphics.DrawString()メソッドに問題があります。私のUserControlは、モノスペースのフォントをパネル上に描画するために使用しています。また、DrawString()はテキストをこのようにフォーマットしています。私はこれを修正することを期待してStringFormatを使用して、成功せずされています:DrawString()を使用してテキストを正しく描画する

StringFormat sf = new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.FitBlackBox | StringFormatFlags.LineLimit | StringFormatFlags.MeasureTrailingSpaces); 

コードをテキスト描画するための「EEEEEEEE」を描画するときに、例えば

for (int i = 0; i < document.Text.Count; i++) 
       g.DrawString(document.Text[i], Font, Brushes.Black, new PointF(offset - 2, offset + Font.Height * i), sf); 

を、Consolas 9に、今は2つのeが1ピクセルずつ別のものになります。モノスペースのテキストを正しく表示する方法はありますか?

(私の実際の問題:自分のテキストボックスコントロールを最初から演習として、楽しいものとして作っています。実際にはうまくいっていますが、テキストを表示するパネルはマウスのクリックに応じてキャレットを配置できる必要がありますフォントの高さプロパティのため、正しい行を見つけるのは簡単ですが、その行の現在のインデックスを見つけることはできません。非固定幅フォントの場合、キャレットインデックスを決定する方法は想像できませんが、シンボルの幅が固定されているので、それは、なんとかあるべきフォント。だから、多分これを決定するためのより良い方法はありますか?)

敬具、 Jacco

答えて

4

それはモノスペースです。各文字の幅はピクセルの整数ではなく、各文字はおそらく9.9ピクセル幅のようなものです。文字を読みやすいようにするには、それを描画するときに一番近いピクセルにスナップします。そのため、時には2つが近くにあることがあります。

フラグはAntiAliasフラグを使用します。各文字を一番近いピクセルにスナップする - それは灰色の部分だけをぼかすので、間隔は全体的に一貫して見える。ただし、アンチエイリアスは小さなフォントサイズではよく見えません。

また、Graphics.DrawStringの代わりにTextRendererを使用することもできます。 TextRendererはGraphicsクラスのようにGDI +の代わりに古いGDIレンダリングを使用しているため、サブピクセルレンダリングは行われません。すべての文字が9ピクセル幅であるか、すべての文字が10ピクセル幅です。場合によっては、古い技術が優れています。

+0

AntiAliasフラグを使用すると、フォントサイズが12の場合でも、実際に私の目には見えないようになります。 –

+0

ありがとうございます!図面はTextRendererを使用して完全に動作します。しかし、TextRenderer.MeasureString()で測定すると問題が発生します。 TextFormatFlags.NoPaddingをTextFormatFlagsに設定した後でも、 "abcd"のような文字列の測定値は正しくない(25の幅を与え、Consolas 9の28でなければなりません) "不思議なことに" 7の代わりに10を与えます。 –

+0

'graphics.TextRenderingHint'を' TextRender'と同じように異なる値に設定することもできます。私はそれを設定する特定の値を覚えていませんが、わずか5つの選択肢があります。 –

関連する問題