如何在非透明窗口中使用透明窗口小部件?

时间:2015-07-25 08:25:51

标签: c++ gtkmm vte

我目前正在使用libgtkmm和libvte在C ++中创建一个终端模拟器。

我的目的是在其他地方设置一个透明的终端小部件和一个不透明的窗口;但我找不到任何关于小部件透明度的内容。

我试过

set_opacity(.5); // set opacity of the container

和/或

this->set_opacity(0.5);
例如,

但它不起作用。我想这对Gdk表面很有用,但我无法弄清楚是什么。

我正在寻找解释,文档,线索等......

谢谢!

编辑:

我想在窗口小部件下方看到桌面(就好像窗口中的不透明度为0)。但是,如果我修改窗口的不透明度:

find . -depth -print0 | 
   xargs -0 perl-rename -n 's~([^/]+)$~\L$1~;s~(?:.*/|\G)\K(\S+)\s+(?![^/]*/)~$1_~g'

修改整个窗口,而不仅仅是窗口小部件的区域......

我希望它看起来像这样:

Here is an example

1 个答案:

答案 0 :(得分:1)

我太习惯通过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的显示方式可以看作:

  1. 使用*w3
  2. 的不透明度将*grid绘制到*w3
  3. 使用*grid
  4. 的不透明度将*box绘制到*grid
  5. 使用*box
  6. 的不透明度将*window绘制到*box
  7. 使用*window
  8. 的不透明度将*window绘制到屏幕上

    请记住,绘图功能的调用顺序实际上与此相反,父项负责绘制孩子。

    因此,每个对象的不透明度也会影响其子项在最终输出中的显示方式。如果你window->set_opacity(1.0);,那么你在孩子身上所做的一切都不会让你看到壁纸,因为窗口已经挡住了。但是如果你window->set_opacity(0.0)使它透明,那么你根本就不会看到任何孩子,因为它们不是直接在屏幕上绘制的,而是必须经过父母。

    据我所知,从孩子的角度来看,没有办法打破这种等级制度。我可以看到一些非常理论上的可能性,你可以切入窗口绘图,也许是通过提供你自己的函数,然后以某种方式不能绘制一些自己的像素,但是采取孩子的绘制功能并将其放在那里。