Per Pixel Alpha Blend

时间:2014-11-11 18:28:48

标签: c# .net winforms bitmap

很长一段时间以来,我一直在努力完成某种允许PNG图像透明的形式。

我在C#工作,我能够找到一个很好的项目,通过每像素alpha混合和通过将图像更改为位图并使用alpha图层仅显示不透明的部分来实现这一点,这是然后使用UpdateLayeredWindow进行更新。

以下是项目:http://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-C

我能够实现上述项目中的代码,但由于设置的创建参数,表单基本上是不可见的,只显示图像。当我删除创建参数时,不会应用效果。

但我希望能够将此应用到我的表单背景中。对于我的表单,我将表单边框样式设置为none并应用了背景图像。

如何将此技术应用于表单背景并仍然可以添加不受影响的控件?

1 个答案:

答案 0 :(得分:3)

您正在使用分层窗口技术,以便能够拥有具有Alpha透明度的背景。这样做的缺点是无法看到控件。这是因为分层窗口只是一个图像。如果你对它进行控制,你仍然可以获得它们的事件和消息,但实际上看到它们,你将不得不在这个位图上绘制所有控件并使其与控件状态保持同步。乏味的。

虽然没有其他方法可以获得字母形式(至少不是我所知道的好形式)。

如果您只是关心表单的alpha透明 border ,并且表单的客户端/内部部分是可靠的,那么您应该考虑创建第二个&#34 ;内容"窗体,在构成边框的分层窗口上方,并使用分层窗口移动它。因此,你可以结合两全其美。

这里有一个例子:http://www.codeproject.com/Articles/20758/Alpha-Blended-Windows-Forms。 它还讨论了实现这种2-form-fashion时的典型陷阱以及如何避免它们。

Afaik,Office 2013和VS 2013以类似的方式进行(虽然使用类似WPF的动态绘图),注意它们的窗口阴影所有漂亮的错误。

另一种选择,如果你可以选择它:使用WPF。由于控制图由您的图形卡完全呈现,并将其呈现为单个图形缓冲区,因此它可以将此缓冲区转换为分层窗口的位图,从而使控件完美地保持最新状态。我之前从未这样做过,因为我不是WPF程序员,但我已经看到了这一点,并打赌有一些不错的评论者提供了很好的教程链接。