使用DrawString()正确绘制文本

本文关键字:绘制 文本 DrawString 使用 | 更新日期: 2023-09-27 18:18:08

我有一个问题与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"时,两个e会时不时地靠近另一个1像素。是否有一种方法来显示文本正确,等宽?

我的实际问题是:我正在从头开始创建自己的文本框控件,作为练习和乐趣。它实际上运行得很好,但是显示文本的面板应该能够根据鼠标单击的位置来定位插入符号。找到正确的行很容易,因为字体的高度属性。然而,在该行中查找当前索引却不是这样。对于非等宽字体,我无法想象确定插入符号索引的方法,但对于等宽字体,它应该是可行的,因为符号的宽度是固定的。所以,也许有更好的方法来确定这个?)

亲切的问候,Jacco

使用DrawString()正确绘制文本

等宽绘图。只是每个字符的宽度不是整数像素——每个字符可能是9.9像素宽。(为了保持字符清晰,它在绘制时将每个字符捕捉到最近的像素,这就是为什么有时你会看到两个字符靠得更近。)

一个选择是使用AntiAlias标志,这将停止尝试捕捉每个字符到最近的像素——它只是灰度模糊的边缘,所以间距看起来相对一致的整体。然而,反斜体在小字体上看起来不太好。

或者你可以使用TextRenderer代替Graphics.DrawString。TextRenderer使用旧的GDI渲染(而不是像图形类那样的GDI+),所以它根本不做亚像素渲染——要么每个字符是9像素宽,要么每个字符是10像素宽。有时候,老技术更好。