Я собираюсь из различных ссылок класса wxWidgets в документации (example), что wxWidgets, используемые для построения графического интерфейса, в основном наследуются от wxWindow
. Я вижу из комментариев в the source of wxWidgets/window.cpp, что каждый wxWindow
имеет указатель на некоторый GtkWidget, который хранится в элементе wxWidget m_widget
. Из тех же комментариев исходного кода я также вижу, что m_wxwindow
является членом класса wxWindow
и может содержать указатель на объект wxPizza
в случае wxWindow
, который имеет клиентскую область для рисования и детей.Как подключить wxWidgets, виджеты GTK2 и окна X11?
Я работаю над приложением, для которого требуется такая функциональность. Я расширяю класс wxWidgets для создания своего собственного виджета, который должен содержать графическое окно X11, и я не уверен, как его подключить, и у меня возникли проблемы с поиском решения с использованием документации.
Когда я создаю свой собственный виджет (в методе Create
), я могу видеть, что m_widget
и m_wxwindow
являются как NULL
, так от этого и что я уже упоминал выше, я собираю эти GtkWidget
объекты, которые я должен быть создание для формирования моей клиентской области. Во-первых, я пробовал это:
m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Какой вид работ, но не совсем как я хочу. Я могу получить XID
от GtkWidget
, а окно X11 ведет себя так, как ожидалось. Но это создает новое окно за пределами моего основного окна приложения wxWidgets. То, что я хочу, это точная функциональность, кроме встроенного в основное окно приложения wxWidgets. Мой пользовательский класс был добавлен к wxBoxSizer
как это:
sizer->Add(my_widget, 1, wxEXPAND | wxALL, 0);
Где Сайзер является wxBoxSizer
и my_widget
мой пользовательский виджет.
Затем я попытался создать m_widget
как несколько различных типов GtkWidget
, но все они привели к ошибкам времени выполнения при попытке использовать gtk_widget_realize
и пытается получить XID
.
// These don't work
m_widget = gtk_drawing_area_new();
m_widget = gtk_vbox_new(false, 0);
Это сообщение об ошибке я получаю, когда я попытался выше:
Gtk: IA__gtk_widget_realize: assertion 'GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window
Check failed: xwindow.
Так что это из нескольких частей вопрос: с
- Что является подходящим
GtkWidget
типа, чтобы добиться этого? Мне нужно иметь возможность получить идентификатор окна X11 (XID
) и встроить его в родительский виджет (wxBoxSizer
). - Нужно ли использовать как
m_widget
, так иm_wxwindow
? Как мне их настроить? - Нужно ли что-либо делать, кроме звонка
sizer->Add()
, чтобы связать это с моимwxBoxSizer
?
Спасибо!
ОБНОВЛЕНИЕ: Извините, что забыл упомянуть, это для GTK2. Спасибо @andlabs за это.
ОБНОВЛЕНИЕ 2: @VZ. рекомендовал, чтобы я уточнил, что я пытаюсь сделать.
Я использую библиотеку, которая нуждается в доступе к окну X11, но сама не создает это окно. Когда я инициализирую библиотеку, мне нужно передать ей дескриптор окна X11 (XID
). Затем библиотека будет рисовать в это окно. Я хочу создать это окно внутри приложения wxWidgets. Я пытаюсь расширить класс wxWidgets, чтобы я смог добавить эти окна X11 в виджеты на основе wxSizer
в своем приложении.
Я знаю, что gtk_window_new()
не то, что я ищу, потому что он создает новое окно верхнего уровня, в то время как я хочу окно, встроенное в мое приложение wxWidgets. Это то, что я пробовал на этом пути.
GTK + 2 или GTK + 3? – andlabs
@ Давид, почему тебя это волнует? Все эти m_widget и m_wxwindow являются исключительно wxWidgets внутренними. Вы попробовали образец чертежа wxWidgets? Или любые другие образцы в этом отношении? – Igor
Спасибо за запрос @andlabs, это GTK + 2 – David