【问题标题】:Anti-aliasing text in Windows FormsWindows 窗体中的抗锯齿文本
【发布时间】:2019-02-10 09:28:27
【问题描述】:

我有一个 WinForms 表单,并希望使它的所有文本(例如标签、按钮)都消除锯齿。这让我发疯了,因为我在谷歌上找不到任何东西,这要么意味着它太明显了,要么我太离谱了。

我最好的想法是在我的主窗体中覆盖 OnPaint,但这似乎并没有改变任何东西。

protected override void OnPaint(PaintEventArgs e) {
    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    base.OnPaint(e);
}

救命!

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    听起来您不想像 ClearType 使用的亚像素渲染那样进行抗锯齿。更具体地说,您可能想查看TextRenderingHint Enumeration 成员 ClearTypeGridFit。

    【讨论】:

      【解决方案2】:

      这是因为您所做的只会影响直接在表单上绘制的文本。我猜你必须在用户控件中重写 OnPaint 子类标签、按钮等。

      【讨论】:

      • 我想我只是假设在绘制自身之后,Form 会将相同的 Graphics 实例传递给它的子控件来绘制自己,因此通过在绘制任何内容之前设置 TextRenderingHint,它会贯彻。但基本上你是说每个控件都用自己的 Graphics 实例绘制,所以没有办法在全局范围内执行此操作,除非对我使用的每个控件进行子类化?
      • 很确定表单和包含的控件不共享相同的图形上下文。
      【解决方案3】:

      如果我没记错的话,抗锯齿仅在您在答案中描述的设置抗锯齿模式后,在 Graphics 对象上调用 DrawString 时才有效。

      标准 WinForms 控件不使用此方法,因此简单的覆盖不起作用。

      【讨论】:

      • 实际上,像 hvjackson 那样重写 OnPaint 对表单所做的,但是对于子类化 Button 类的用户控件有一些效果。
      • 我猜这一切都取决于控件如何绘制自己。
      【解决方案4】:

      我知道这是一个非常古老的问题,但由于有些人(包括我自己)仍在使用 WinForms,但我想我会在这里添加一些有用的信息。

      除了将 TextRenderingHint 设置为 AntiAlias 之外,将 Graphics.CompositingQuality 设置为 HighQuality 对 WinForms 中抗锯齿文本的质量有重大影响。我至少使用过这个技巧来生成自定义的高质量标签和其他表单控件。我发现没有它,WinForms 产生的质量对于现代 UI 来说并不能真正达到标准,结果质量明显低于我在 Photoshot/Designer 中的模型。使用此设置,文本看起来更流畅、更清晰。

      我如何在标签上实现此功能的示例:

      public class AntiAliasingLabel : Label
      {
          protected override void OnPaint(PaintEventArgs e)
          {
              e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
              e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
              e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), 0, 0);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多