透明.NET表单中的抗锯齿文本

时间:2009-10-20 20:02:35

标签: c# .net winforms

我有一个C#应用程序,用于显示当前时间 透明的.NET表单。表格没有控件也没有边框。 其属性TransparencyKey设置为Form的背景颜色 “浅灰色”使其透明 因此用户只能看到文本(当前时间)。

文本在PaintEventHandler中绘制:

private void Display_Paint( object sender, PaintEventArgs e )
{
    Graphics formGraphics = e.Graphics;

    Font myFont = new Font( "Microsoft Sans Serif", 24, FontStyle.Bold );

    formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    //formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;

    formGraphics.DrawString( "00:00:00", myFont, Brushes.Green, 0.0F, 0.0F );

    myFont.Dispose();
}

由于抗锯齿,文本“00:00:00”显示时磨损了 表格是在黑暗的背景下。对于浅色背景,文字是o.k。

此图显示了问题和好的情况:

text shows fringes due to anti-aliasing for dark background
(来源:habermann-net.de

显然,Windows确实以适合的方式呈现文本 形成自己的背景颜色,而不是它适合的颜色 透明表格背后的背景。

是否有可能让Windows背后的背景 在渲染文本时考虑到表单以便我得到 摆脱边缘?

一个“解决方案”可能是通过设置TextRenderingHint来关闭抗锯齿 因此。但到目前为止,这不是我首选的“解决方案”。

系统:
Windows XP,SP 3,.NET 3.5,VS 2008

2 个答案:

答案 0 :(得分:1)

几个月前我问similar question

我最终做的是有两个选择:

  1. 通过暂时将其不透明度设置为0来复制应用程序后面的背景,然后在其上绘制抗锯齿文本。如果窗口及其下的窗口不经常移动,这种方法很有效。
  2. 使用layered window。比TransparencyKey工作得更好,但仍然适用于非抗锯齿文本。 (只是避免使用ClearType字体,你会没事的)

答案 1 :(得分:-1)

在您的Display_Paint方法中,试试这个:

this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint,
      true);
this.UpdateStyles();