entnehme ich aus dem verschiedenen wxWidgets Klassenverweis in der Dokumentation (example), dass die wxWidgets eine GUI im Grunde von wxWindow
erben bauen verwendet. Ich sehe aus den Kommentaren in the source of wxWidgets/window.cpp, dass jede wxWindow
einen Zeiger auf einige GtkWidget hat, die im m_widget
Mitglied des wxWidget-Objekts gespeichert ist. Aus den gleichen Quellcode Kommentare sehe ich auch, dass m_wxwindow
ein Mitglied der wxWindow
Klasse ist, und kann einen Zeiger auf ein Objekt wxPizza
im Falle eines wxWindow
, die eine Client-Bereich zum Zeichnen und Kinder hat halten.Wie verbinde ich wxWidgets, GTK2-Widgets und X11-Fenster?
Ich arbeite an einer Anwendung, die diese Art von Funktionalität erfordert. Ich erweitere eine wxWidgets-Klasse, um mein eigenes Widget zu erstellen, das ein aufklappbares X11-Fenster enthalten muss, und ich bin mir nicht sicher, wie ich das alles verbinden soll und ich habe Probleme, eine Lösung anhand der Dokumentation zu finden.
Als ich meine benutzerdefinierte Widget erschaffe (im Create
-Methode), kann ich sehen, dass m_widget
und m_wxwindow
beide NULL
sind, so von diesem und was ich oben erwähnt habe, entnehme ich, das sind die GtkWidget
Objekte, die ich zu schaffen sein sollte um meinen Kundenbereich zu bilden. Zuerst habe ich folgendes versucht:
m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Welche Art von Arbeiten, aber nicht ganz so wie ich es will. Ich bin in der Lage, die XID
von GtkWidget
zu bekommen und das X11-Fenster verhält sich wie erwartet. Aber das erzeugt ein neues Fenster außerhalb meines Haupt-wxWidgets App-Fensters. Was ich will, ist genau diese Funktionalität außer in meinem Haupt wxWidgets App-Fenster eingebettet. Meine benutzerdefinierte Klasse hat zu einem wxBoxSizer
wie folgt hinzugefügt:
sizer->Add(my_widget, 1, wxEXPAND | wxALL, 0);
Wo Sizer ein wxBoxSizer
und my_widget
ist meine Gewohnheit Widget.
Ich habe dann versucht m_widget
als ein paar verschiedene Arten von GtkWidget
zu schaffen, sondern diese alle führten Fehler in der Laufzeit, wenn gtk_widget_realize
zu verwenden versuchen und versuchen, die XID
zu bekommen.
// These don't work
m_widget = gtk_drawing_area_new();
m_widget = gtk_vbox_new(false, 0);
Dies sind die Fehlermeldungen ich immer bin, wenn ich versuchte, die oben:
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.
Also ich dies ist eine mehrteilige Frage:
- Was ist eine angemessene
GtkWidget
Typ, um dies zu erreichen? Ich muss in der Lage sein, eine ausklappbare X11-Fenster-ID (XID
) zu erhalten und sie in das übergeordnete Widget (wxBoxSizer
) einzubetten. - Muss ich sowohl
m_widget
als auchm_wxwindow
verwenden? Wie richte ich diese ein? - Muss ich irgendetwas anderes tun als
sizer->Add()
anrufen, um dies mit meinemwxBoxSizer
zu verbinden?
Vielen Dank!
UPDATE: Sorry, ich habe vergessen zu erwähnen, das ist für GTK2. Danke @andlabs für das Aufzeigen.
UPDATE 2: @ VZ. empfohlen, dass ich klarstelle, was ich versuche zu tun.
Ich verwende eine Bibliothek, die Zugriff auf ein X11-Fenster benötigt, aber dieses Fenster nicht selbst erstellt. Wenn ich die Bibliothek initialisiere, muss ich ihr ein X11-Fensterhandle übergeben (XID
). Die Bibliothek wird dann in dieses Fenster zeichnen. Ich möchte dieses Fenster in meiner wxWidgets-Anwendung erstellen. Ich versuche, eine wxWidgets-Klasse zu erweitern, so dass ich in der Lage bin, diese X11-Fenster Widgets basierend auf wxSizer
in meiner Anwendung hinzuzufügen.
Ich weiß, dass gtk_window_new()
ist nicht das, was ich suche, weil es ein neues Top-Level-Fenster erstellt, während ich ein Fenster in meiner wxWidgets-Anwendung eingebettet werden möchte. Es ist nur etwas, was ich auf dem Weg versucht habe.
GTK + 2 oder GTK + 3? – andlabs
@ David, warum kümmert es dich? All dies m_widget und m_wxwindow sind ausschließlich wxWidgets intern. Hast du das Zeichenbeispiel von wxWidgets getestet? Oder irgendwelche anderen Proben für diese Angelegenheit? – Igor
Danke für die Nachfrage @andlabs, es ist GTK + 2 – David