我正在使用 Mono 开发一个多平台程序,它需要 Form Opacity 支持。基本上就是使窗口半透明的能力。在 Windows 中,通过将 Window.Form.Opacity 属性设置为 0.5,此功能可以正常工作。但在 Ubuntu 14.04 中,它无法开箱即用。我想我正在运行 Unity 和 Compiz,无论默认 Ubuntu 设置附带什么。
根据 Mono FAQ,应该支持这一点:
我怎样才能使我的窗口 alpha 混合?(透明)
只要底层窗口系统支持透明度,Mono 的 Winform 实现就会支持其窗口上的透明度。
对于 Unix/X11 用户,这意味着他们必须在其服务器上启用 COMPOSITE 扩展,并且必须运行合成管理器,例如 xcompmgr。
GenToo Linux Wiki 对如何设置 Xorg 服务器以实现透明度支持进行了很好的描述。
http://www.mono-project.com/docs/faq/winforms/
他们指向的链接已失效。
我是 Linux 新手,不太确定我是否了解启动和运行合成窗口管理器所涉及的所有部分。此外,我不是已经有一个 (compiz?) 了吗?
我应该怎样尝试才能使我的 Winform 不透明度发挥作用?
编辑:我的测试程序基本上是一个带有滚动条的表单(从 0 到 100),它有一个事件处理程序,用于根据滚动条的值设置表单的不透明度。这是它的核心:
private void trackBar1_Scroll(object sender, EventArgs e)
{
double opacity = ((double)trackBar1.Value) / 100;
this.Opacity = opacity;
}
在 Windows 上运行良好。
答案1
您确实已经拥有了您需要的一切compiz
。
设置时应该在窗口上 Window.Form.Opacity
设置X窗口属性;_NET_WM_WINDOW_OPACITY
为了测试 ubuntu 部分是否有效,请尝试使用此低级命令(单击窗口)手动将不透明度设置为 0.5:
$ xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 0x7fffffff
然后恢复到完全不透明:
$ xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 0xffffffff
设置可能失败的一种原因Window.Form.Opacity
是它选择了错误的(但密切相关的)窗口,并在那里设置属性。
根据您的评论,这个想法是正确的。添加:
我怀疑这是其他软件中也存在的非常具体的错误:选择使其透明的窗口是通过一些启发式方法找到的,这些启发式方法基于窗口装饰器的 X 窗口和应用程序如何关联/嵌套等。但随着重新设置 WM 的引入,该领域发生了很大变化 - 很高兴启发式方法仍然有效。据我所知,这是一个启发式方法失败的情况,因此一些附近的不可见窗口将变得透明......
查看此错误以进一步了解问题:transset 无法更改 _NET_WM_WINDOW_OPACITY 属性