【发布时间】:2014-08-07 08:28:28
【问题描述】:
我需要一种快速的方法来在支持透明度的屏幕上绘制叠加层。我做了很多搜索,发现了一个潜在的解决方案(它有自己的问题)和另一个不符合我要求的解决方案;特别是透明度支持。
我先从后者开始,然后再谈前者。
解决方案 1
使用带有 TransparencyKey 的无边界表单,这是我发现的最推荐的解决方案之一,也是最没有帮助的解决方案。
此解决方案的工作原理是创建一个新表单,使其无边框,将背景设置为 Colour.White 并将 TransparencyKey 设置为相同的颜色,使其为全屏和最顶部,并可能设置一些其他选项让它对鼠标和键盘不可见。
这个解决方案的问题是它不支持透明度;它只会“剔除”与TransparencyKey 完全相同的颜色完全相同,因此即使是最细微的差异也会显示出在屏幕上显示半透明对象的想法。
解决方案 2
使用 P/Invoke 和 GDI+ 获取 (GetDC & Graphics.FromHdc)、实际绘制到桌面,然后释放 (ReleaseDC) 桌面。
它的功能非常好,但不幸的是存在一些问题。
首先;调用一次显然只会绘制一次,因此如果屏幕在绘制后完全刷新它会消失,我不明白如何解决这个问题,如果这是最好的解决方案,我肯定需要帮助问题。
其次; GDI+ 使用半透明画笔和FillRectangle 的方法非常慢,老实说我不能责怪它,但我要求它做得非常快; GDI+ 显然无法满足的要求。
总结;我需要一种在具有透明度支持的屏幕上绘制叠加层的方法,如果第二种方法是我应该使用的方法,我怎样才能用半透明画笔绘制得足够快,这不是问题,我将如何更新它屏幕刷新后它不会消失,如果这不是我应该使用的方法,请指定我应该使用的方法。
【问题讨论】:
-
使用 WPF 怎么样?
-
@WeylandYutani 你是什么意思?我对 WPF 有相当基本的了解。
-
WPF 是解决方案 1(全屏窗口、最顶层等)的另一种方式,但与 winforms 不同,您可以使用 alpha 组件作为窗口背景,使其完全或部分透明。此链接非常旧,但显示了可以做什么laurenlavoie.com/avalon/148。此外,您应该能够绘制精灵而不仅仅是平坦的单色背景(虽然我还没有这样做)
标签: c# .net overlay .net-2.0 gdi+