gpt4 book ai didi

c# - 为什么 DrawString 在 C# Winforms 中表现出意外行为?

转载 作者:太空狗 更新时间:2023-10-29 21:37:17 25 4
gpt4 key购买 nike

我已经在 C# WinForms 中子类化了一个控件,并且在我的 OnPaint() 处理程序中自定义绘图文本。在我的表单中使用以下代码将字体设置为 Courier New:

FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);

在控件本身中,字符串存储在 realText 中,我使用以下代码将其绘制到屏幕上:

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}

一些随机示例文本的结果如下所示: http://img219.imageshack.us/img219/1778/courier.png

如果放大,您可以看到第一个“as”之间的空间与第二个“as”之间的空间不同(1 像素对 2 像素)。有谁知道可能是什么原因造成的,或者我怎样才能防止它发生?当我用不同的字体绘制时,间距有很多类似的怪异之处,但我认为它们都是同一个问题的结果。

提前感谢您提出任何想法。

最佳答案

我猜这是因为你正在使用 Graphics.DrawString()而不是 TextRenderer.DrawText() .前者使用有点蹩脚和过时的 GDI+ 绘制文本。后者使用更现代的 GDI(在文本渲染方面)。我相信这是之前的答案(WinForms 与 Windows)所指出的区别。

您也可以尝试重载 Graphics.DrawString(),它需要一个 StringFormat对象并指定 StringFormat.GenericTypographic。然而,这确实有点绕过这个问题。如果您使用的是 .NET 2.0 或更高版本,您应该使用 TextRenderer 类而不是蹩脚的 Graphics 类来满足您所有的文本呈现需求。 Graphics.MeasureString()Graphics.DrawString() 的存在严格是为了向后兼容 .NET 1.0 和 1.1。

编辑:哦,是的,您的代码在每个绘制周期中都会泄漏一个 GDI 对象。画笔对象是非托管资源的托管包装器,因此必须显式处理它们。

关于c# - 为什么 DrawString 在 C# Winforms 中表现出意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837565/

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