2015-07-25 5 views
1

В настоящее время я создаю эмулятор терминала на C++ с libgtkmm и libvte.Как получить прозрачный виджет в непрозрачном окне?

Моя цель состоит в том, чтобы иметь прозрачный виджет терминала и непрозрачное окно в другом месте; но я ничего не мог найти о прозрачности виджета.

Я попытался

GdkRGBA background = {0., 0., 0., .5}; 
vte_terminal_set_color_background(VTE_TERMINAL(terminal), &background); 

и/или

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

, например, но это не работает. Я думаю, что это трюк с поверхностями Gdk, но я не могу понять, что.

Я ищу объяснения, документы, ключи и т.д ...

Спасибо!

EDIT:

Я хочу видеть на рабочем столе ниже виджета (как если бы помутнение 0 в окне). Но если я изменить непрозрачность окна:

this->set_opacity(0.5); 

все окно модифицируется, а не только зона виджета ...

Я хочу, чтобы это выглядит следующим образом:

Here is an example

+0

Вы когда-нибудь находили ответ для этого? Я пытаюсь сделать что-то подобное. – Debianita

ответ

1

Я слишком привык делать все через Поляну. Поэтому я начну с этого. У меня не было никаких проблем, что делает любой виджет прозрачным со свойством «непрозрачности»:

<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. Draw *w3 на *grid с непрозрачностью *w3
  2. Draw *grid на *box с непрозрачностью *grid
  3. Draw *box на *window с непрозрачностью *box
  4. Draw *window на экране с непрозрачностью *window

Имейте в виду, что последовательность вызовов функции рисования на самом деле противоположна этому, родитель несет ответственность за рисование дочернего элемента.

Поэтому непрозрачность каждого объекта также влияет на то, как его дети выглядят в конечном выходе. Если вы window->set_opacity(1.0);, то ничего, что вы сделаете в детях, позволит вам увидеть обои, так как окно уже в пути. Но если вы используете window->set_opacity(0.0), чтобы сделать его прозрачным, вы вообще не увидите никаких детей, так как они не нарисованы на экране напрямую, а должны пройти через родителя.

Насколько я знаю, нет способа выйти из этой иерархии с точки зрения ребенка. Я вижу очень теоретическую возможность, что вы можете нарезать рисунок окна, возможно, предоставив свою собственную функцию, а затем каким-то образом не нарисуйте некоторые из собственных пикселей, но возьмите, что делает функция рисования ребенка, и поместите его туда, где есть.

+0

Прошу прощения, я плохо объяснил, что хочу: когда мы используем '' ' someWidget-> set_opacity (0.5); '' ' Мы видим белый фон (или какой бы то ни было цвет) окна« ниже »виджета, но я хочу увидеть рабочий стол под виджетами (как если бы в окне было непрозрачность 0).И если я изменяю непрозрачность окна: '' ' this-> set_opacity (0.5); '' ' все окно модифицировано, а не только зона виджета ... – Boiethios

+0

@Morovaille Я отредактировал свой ответ. Я не скажу, что это действительно невозможно. Но в это время это то, с чем я не сталкивался. Это определенно не может быть сделано set_opacity, но, возможно, кто-нибудь умнее меня может сказать о другом способе, которым вы можете это сделать. – v010dya

+0

@Morovaille взгляните на propagate_draw, это может быть способ позволить вам подключить способ, которым дети рисуются на экране. – v010dya

 Смежные вопросы

  • Нет связанных вопросов^_^