gpt4 book ai didi

c# - 将大量单个字符绘制到 WinForms 控件

转载 作者:行者123 更新时间:2023-11-30 13:00:38 25 4
gpt4 key购买 nike

我有一个自定义的 WinForms 控件,它可以被描述为某种终端控件(比如包含 Putty 的控件)。据此,控件应该显示很多字符,每个字符都有不同的颜色和背景颜色(最坏的情况)。

目前我正在使用(有点过时的)Graphics.MeasureString 方法来确定固定大小字体中单个字符的大小,这样我就可以计算字符在具体的行和列。然后我使用 Graphics.DrawString 绘制字符。为了优化性能,我创建了一个 BufferedGraphics 并根据字符的属性对字符进行分组,以便通过一次 DrawString 调用绘制具有相同颜色的连续字符。 (因为每个字符一个 DrawString 调用真的很慢。)

现在的问题是 DrawString 计算的字符宽度显然与 MeasureString 略有不同。当我一次绘制完整的线条时,得到的文本宽度与我使用单个字符的宽度乘以该行的字符数计算得出的结果不同。它只有一两个像素(或可能更少),但您可以清楚地看到它 - 特别是因为我使用了抗锯齿功能,所以您甚至可以看到只有半个像素的差异。

下面的示例代码在窗体的图形上绘制了一个长字符串a,后跟字符'B'。然后它只在通过测量 a 计算出的位置上绘制一个 'B'

var f = new Form {
Width = 1200,
Height = 500,
Font = new Font("Consolas", 11, FontStyle.Regular)
};

f.Paint += delegate(object sender, PaintEventArgs e) {
var a = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
var size = e.Graphics.MeasureString(a, f.Font, new PointF(0, 0), StringFormat.GenericTypographic);

using (var black = new SolidBrush(Color.Black))
{
e.Graphics.DrawString(a + "B", f.Font, black, 0, 0, StringFormat.GenericTypographic);
e.Graphics.DrawString("B", f.Font, black, size.Width, 20, StringFormat.GenericTypographic);
}
};

f.Show();

如果您仔细观察,您会发现第二个 B 大约多了一个像素 - 至少在我的显示设置下(100% dpi 比例,启用 ClearType)。虽然一个像素并不多,但当您使用 unicode 字符 U+2500U+257F 绘制线条时,如果字符没有完全对齐,它看起来会非常难看。

我也不能使用 TextRenderer 类,因为它的 MeasureString 方法返回整数值,但是 DrawString 当然不会绘制每个字符在全像素位置上(将其与使用行/列和测量的整数字符大小计算的位置对齐需要什么)。

所以我的问题是:是否有任何(有效的)方法来绘制与使用字符大小计算的相应位置完全对齐的字符串?


P.S. MeasureString 包含 200 个字符的字符串返回的返回值正好是 MeasureString 包含单个字符串的返回值的 200 倍.

最佳答案

我在测量 Graphics 中的字符串时遇到了一些类似的问题。我使用了 SizeInPoints,这是 Font 类的一个属性,并将它乘以我在字符串中的字符数……我不知道它是否有帮助。如果不是,它可能是像素的“舍入”问题......然后我会尝试放大字体大小(可能是 10 倍),测量它然后在使用大小为背景着色时再次将它除以 10。我希望它有所帮助。祝你好运!问候!

关于c# - 将大量单个字符绘制到 WinForms 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21931610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com