[英]How to have a transparent widget in a non transparent window?
我目前正在使用libgtkmm和libvte在C ++中创建终端仿真器。
我的目的是在其他地方有一个透明的终端小部件和一个不透明的窗口; 但是我找不到关于小部件透明度的任何信息。
我试过了
GdkRGBA background = {0., 0., 0., .5};
vte_terminal_set_color_background(VTE_TERMINAL(terminal), &background);
和/或
set_opacity(.5); // set opacity of the container
例如,但它不起作用。 我想这是使用Gdk曲面的技巧,但是我无法弄清楚。
我正在寻找解释,文档,线索等...
谢谢 !
编辑:
我想查看小部件下方的桌面(好像窗口中的不透明度为0)。 但是,如果我修改窗口的不透明度:
this->set_opacity(0.5);
整个窗口被修改,而不仅仅是窗口小部件的区域...
我希望它看起来像这样:
我已经习惯了通过Glade做所有事情。 所以我将从那开始。 我可以通过'opacity'属性使任何小部件透明:
<object class='GtkWhatever' id='Whatever'>
<property name="opacity">0.29999999999999999</property>
<child>
...
</child>
<child>
...
</child>
</object>
这样,所有孩子都变得透明,这是有道理的。
然后,我尝试使用set_opacity
,最可能的错误原因是您完全按照编写的方式调用了它,这当然会设置从中调用它的对象的不透明度,并且通常是应用程序窗口。
您需要在要使其透明的对象上调用它(其所有子对象将因此变为透明)。
所以你有了:
class MyWindow : public Gtk::ApplicationWindow
{
private Gtk::Widget *someWidget;
};
让我们假设您很好地创建了这个someWidget
并将其添加到窗口中。 然后,您可以执行以下操作:
someWidget->set_opacity(0.5);
我尝试过时它在这里起作用,因此它也应该为您工作。 如果没有,请提供更多细节,我将尽力提供帮助。
在您发表评论后,我发现我误解了您想要的东西。
不透明度实际上并不能以您想要的方式起作用。 您不能降低父级在子级中的不透明度,只能控制父级以及if的所有子级中的不透明度。
因此,假设您有:
Gtk::ApplicationWindow *window
Gtk::Box *box
Gtk::Menu *menu
Gtk::Grid *grid
Gtk::Widget *w1
Gtk::Widget *w2
Gtk::Widget *w3
Gtk::Widget *w4
Gtk::Button *button
w3的显示方式可以看成是:
*w3
的不透明度将*w3
绘制到*grid
*grid
的不透明度将*grid
绘制到*box
上 *box
的不透明度将*box
绘制到*window
上 *window
的不透明度将*window
绘制到屏幕上 请记住,绘制函数的调用顺序实际上与此相反,父级负责绘制子级。
因此,每个对象的不透明度也会影响其子对象在最终输出中的外观。 如果您通过window->set_opacity(1.0);
,那么您的孩子将无法做的任何事情都可以让您看到壁纸,因为窗口已经挡住了。 但是,如果使用window->set_opacity(0.0)
使其透明,则您将根本看不到任何子级,因为它们不是直接在屏幕上绘制的,而是必须经过父级。
据我所知,从孩子的角度来看,没有办法打破这种等级制度。 我可以看到一些非常理论上的可能性,您可以通过提供自己的功能来切入窗口图形,然后以某种方式根本不绘制自己的像素,而是采用child的绘制功能并将其原样放置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.