如何用透明色填充桌面?

时间:2011-06-14 19:41:36

标签: c# winforms winapi

我使用此代码用颜色填充桌面。

IntPtr desktop = GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(desktop);
g.FillRectangle(new SolidBrush(Color.FromArgb(60, 255, 0, 0), Screen.PrimaryScreen.Bounds);      
ReleaseDC(IntPtr.Zero, desktop);

这很好,但速度很慢。 如果我用非透明颜色Color.FromArgb(255,255,0,0)填充桌面,它的工作速度非常快。 如何提高透明彩色绘图的速度?

2 个答案:

答案 0 :(得分:2)

GDI +(System.Drawing使用的)全部用软件实现,并且因速度而闻名。

你可能会以不同的方式解决问题。尝试使用BorderStyle = None创建一个Form,调整它以填充整个屏幕,并将其BackColor设置为红色,将其Opacity设置为0.25(近似于alpha = 60)。

答案 1 :(得分:1)

使用GDI +做任何涉及完全透明的事情总是很慢。这是因为透明度涉及大量的乘法和除法以混合像素颜色,而绘制不透明的颜色只是覆盖旧像素的问题。它的处理器密集程度更高。

Joe White的方法是个不错的选择。具有背景色和低不透明度的最大化形式可以很好地工作,并且速度更快。但请记住,使用表单还需要担心一些其他问题:

  • 表单会阻止点击桌面图标
  • 用户可以最小化表单,删除红色 - 即使它不在任务栏中,Windows键+ D也会将其最小化(当然,只需编写代码即可重新显示表单) )
  • 表单可能会在其他表单的顶部结束,给它们一个红色调(您可以将表单设置为 但是要低于所有其他形式,这将解决这个问题)

它不是那么慢,但是在使用表单而不是直接绘制到桌面时还有其他一些事情需要担心。

这实际上取决于为什么你想要将桌面着色为红色 - 根据你想要实现的目标,可能还有其他更简单的方法:

  • 您可以将桌面壁纸着色为红色 - 它不会影响图标,但不会出现任何性能问题
  • 如果您不关心桌面互动,可以截取屏幕截图,将其着色为红色,然后以最大化的形式显示。
  • 如果您认为自己不需要经常重新绘制它,那么您当前的方法会很好

另外,不要忘记有些人有多个显示器设置。如果要覆盖所有显示,则需要为每个显示器创建一个表单。