如何在.NET中使用半透明PNG制作透明窗体?

如何在.NET中使用半透明PNG制作透明窗体?,.net,transparency,.net,Transparency,我正在尝试制作一个小恶作剧程序,通过在其上绘制一个PNG覆盖图来模拟“破碎的屏幕”。我正在尝试使用Windows窗体(因为这是我最熟悉的),但到目前为止,运气不好。我可以通过TransparencyKey/BackgroundColor技巧使表单透明,但可以预见,当需要绘制PNG时,它会崩溃。还有其他想法吗 更新: 为了澄清这一点,我希望: 但目前我只知道: 更新2:我通过谷歌搜索获得了覆盖图: 我不确定您到底想要什么,但是,您可以绘制完全不透明的PNG,然后将表单的不透明度属性设置为%75

我正在尝试制作一个小恶作剧程序,通过在其上绘制一个PNG覆盖图来模拟“破碎的屏幕”。我正在尝试使用Windows窗体(因为这是我最熟悉的),但到目前为止,运气不好。我可以通过
TransparencyKey
/
BackgroundColor
技巧使表单透明,但可以预见,当需要绘制PNG时,它会崩溃。还有其他想法吗

更新:

为了澄清这一点,我希望:

但目前我只知道:

更新2:我通过谷歌搜索获得了覆盖图:


我不确定您到底想要什么,但是,您可以绘制完全不透明的PNG,然后将表单的不透明度属性设置为%75(例如)

编辑:如果上面的答案不是您想要的,您可以创建一个背景透明的PictureBox,将其dock设置为fill,而不要将该控件放在前面。当你想显示图像时,你会把它带到最前面。然后通过以下方式设置图像的不透明度(如果需要):

现在,您可以将PictureBox的图像设置为新的半透明图像

编辑2:这里有一个很好的技巧

使窗体不可见,并使用计时器,其中参考资料中的“a”是您的图像:

    Dim x As Graphics = Graphics.FromHwnd(IntPtr.Zero)
    x.DrawImage(My.Resources.a, 0, 0)

你可以在屏幕上画画而不需要表格。但是,您需要连续绘制,因为任何其他绘制都可能会打破您的错觉。

PNG的区域范围从完全透明到完全不透明,以及介于两者之间的任何区域。您似乎不了解这个问题。问题是TransparencyKey只允许一种颜色在整个表单中是透明的(以及它的所有PictureBox’s和whatnotelse)。但是我需要一整套半透明的颜色。换句话说,使用透明键,我只能在我想要的时候得到它。我知道这个技巧,并尝试使用它,就像10年前一样,结果发现它有一个严重的缺点——通常软件会在移动或滚动窗口时缓存窗口的内容,然后缓存我的覆盖。结果并不理想。这是一个选项,没错,但我认为,随着Windows XP及以上版本的伟大新技术壮举(我实际上想在WinXP机器上运行它),应该有一个更整洁的解决方案。你能提供真实的图像以便其他人可以自己尝试吗?@LarsTech-更新了这个问题。PNG不能有任何透明度。它对窗体的背景色透明,即透明键。这就是为什么你看到绿色,它不再匹配的关键。把钥匙做成接近白色的东西,它看起来会更好,但并不完美。另一种方法是制作背景截图,现在只要背景是静态的,它就是完美的。@HansPassant-真的没有办法产生这种效果吗?我不喜欢Windows窗体-WPF也是一个选项。我对它不熟悉,但仍然是。我在某个地方读到过,它提供了这样一个选项(尽管它应该使用下面的标准WinAPI,所以至少在理论上它在WinForms中也是可能的)。这可能是你看不到很多其他应用程序在主窗口中显示弹孔的原因。
    Dim x As Graphics = Graphics.FromHwnd(IntPtr.Zero)
    x.DrawImage(My.Resources.a, 0, 0)