我從文檔(example)中的各種wxWidgets類引用中收集到,wxWidgets用於構建GUI的基本上從wxWindow
繼承。我從the source of wxWidgets/window.cpp的評論中看到,每個wxWindow
都有一個指向存儲在wxWidget對象的m_widget
成員中的某個GtkWidget的指針。從相同的源代碼註釋我也看到,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);
哪種作品,但不是很像我想要的。我能夠從GtkWidget
獲得XID
,並且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窗口ID(XID
)並將其嵌入到父窗口小部件(wxBoxSizer
)中。 - 我需要同時使用
m_widget
和m_wxwindow
嗎?我如何設置這些? - 除了撥打
sizer->Add()
以外,我還需要做其他事情嗎?爲了將其與wxBoxSizer
連接起來?
謝謝!
更新:對不起,我忘了提及,這是GTK2。感謝@andlabs指出了這一點。
UPDATE 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