c# - 每像素 Alpha 混合

标签 c# .net winforms bitmap

很长一段时间以来,我一直在尝试实现某种允许 PNG 图像透明的形式。

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

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

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

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

如何将此技术应用于我的表单背景,并且仍然能够添加不受影响的控件?

最佳答案

您正在使用分层窗口技术来获得具有 alpha 透明度的背景。这样做的缺点是无法看到其上的控件。那是因为分层窗口只是一个图像。如果将控件放在上面,您仍然会收到它们的事件和消息,但要真正看到它们,您必须在此位图上绘制所有控件并使其与控件状态保持最新。乏味。

虽然没有其他方法可以得到 alpha 形式(至少我知道不是一个好的方法)。

如果您只关心表单的 alpha 透明边框,并且表单的客户端/内部部分是实心的,那么您应该考虑创建第二个“内容”表单,位于构成边框的分层窗口上方,并随分层窗口一起移动。因此,您可以结合两全其美。

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

Afaik,Office 2013 和 VS 2013 以类似的方式做到这一点(尽管使用类似 WPF 的动力绘图),请注意它们的窗口阴影具有的所有不错的错误。

另一个选择(如果可以的话):使用 WPF。由于控件绘图完全由显卡渲染,显卡将其渲染到单个图形缓冲区,因此它可以将此类缓冲区转换为分层窗口的位图,从而使其与控件完美保持同步。虽然我从来没有这样做过,因为我不是 WPF 程序员,但我已经看到了这一点,并且打赌有一些不错的评论者提供了优秀教程的链接。

关于c# - 每像素 Alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26871869/

相关文章:

c# - 打开网络浏览器,自动完成表单组件并提交

c# - 执行处理程序的子请求时出错(仅部署在服务器上的应用程序)

c# - C# 新手 - 链接标签和函数的问题

c# - 如何在 C#/Silverlight 中绑定(bind) DatePicker 的 "date"?

c# - 正则表达式中的 Unicode 字符

c# - 检查值是否是 C# 中一组值中的一个的最简单方法?

c# - 我的 Windows 窗体按钮设置为宽度 0,而它应该是全宽

c# - 数据绑定(bind)和控制

c# - 如何使用通配符删除字符串的特定部分?

c# - XNA游戏性能