DrawString()を使用してテキストを正しく描画する

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

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

テキストを描画するコード:

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で、 "eeeeeeee"を描画すると、今度は2つのeが1ピクセルずつ近くなります。モノスペースのテキストを正しく表示する方法はありますか?

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

敬具、 ジャコ

3

1 答え

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

1つの方法は、 AntiAlias フラグを使用してスナップを止めることです各文字を最も近いピクセルに置き換えます。灰色の部分だけをぼかすので、間隔は全体的に一貫して見えます。ただし、アンチエイリアスは小さなフォントサイズではよく見えません。

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

4
追加された
TextRender と同じ方法でテキストを描画させるために、 graphics.TextRenderingHint を異なる値に設定することもできると思います。私はそれを設定する特定の値を覚えていませんが、わずか5つの選択肢があります。
追加された 著者 Bradley Uffner,
AntiAliasフラグは、サイズ12であってもフォントが本当に悪いものに見えます
追加された 著者 Seth Carnegie,
ありがとう!図面はTextRendererを使用して完全に動作します。しかし、TextRenderer.MeasureString()で測定すると問題が発生します。 TextFormatFlags.NoPaddingをTextFormatFlagsに設定した後でも、 "abcd"のような文字列の測定値は正しくない(幅が25、Consolas 9でなければなりません)。
追加された 著者 Jacco Krijnen,