2016-08-07 15 views
0

我從文檔(example)中的各種wxWidgets類引用中收集到,wxWidgets用於構建GUI的基本上從wxWindow繼承。我從the source of wxWidgets/window.cpp的評論中看到,每個wxWindow都有一個指向存儲在wxWidget對象的m_widget成員中的某個GtkWidget的指針。從相同的源代碼註釋我也看到,m_wxwindowwxWindow類的成員,並且可能持有指向wxPizza對象的指針,如果是wxWindow,它具有用於繪製和子級的客戶區。如何連接wxWidgets,GTK2小部件和X11窗口?

我正在研究需要這種功能的應用程序。我正在擴展一個wxWidgets類來創建我自己的窗口小部件,該窗口小部件需要包含一個可繪製的X11窗口,而且我不確定如何將它連接起來,並且無法使用文檔查找解決方案。

當我創建我的自定義窗口小部件(在Create方法),我可以看到m_widgetm_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); 

凡分級機是wxBoxSizermy_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_widgetm_wxwindow嗎?我如何設置這些?
  • 除了撥打sizer->Add()以外,我還需要做其他事情嗎?爲了將其與wxBoxSizer連接起來?

謝謝!

更新:對不起,我忘了提及,這是GTK2。感謝@andlabs指出了這一點。

UPDATE 2: @VZ。建議我澄清我想要做的事情。

我正在使用需要訪問X11窗口的庫,但並未創建該窗口本身。當我初始化庫時,我需要傳遞一個X11窗口句柄(XID)。圖書館將隨後進入該窗口。我想創建這個窗口在我的wxWidgets應用程序中。我試圖擴展一個wxWidgets類,以便我可以將這些X11窗口添加到我的應用程序中基於wxSizer的窗口小部件中。

我知道gtk_window_new()不是我正在尋找的,因爲它創建了一個新的頂層窗口,而我想要一個嵌入到我的wxWidgets應用程序中的窗口。這只是我一路上試過的東西。

+1

GTK + 2或GTK + 3? – andlabs

+0

@大衛,你爲什麼在意?所有這些m_widget和m_wxwindow都是wxWidgets的內部專有。你嘗試過wxWidgets的繪圖樣本嗎?或者其他任何樣品? – Igor

+0

感謝您提問@andlabs,它是GTK + 2 – David

回答

1

這將是真正有幫助的知道你到底想要做什麼。你會談到GtkWidgets s,但隨後會顯示gtk_window_new()呼叫,它將創建一個新的(頂級)窗口,這是一個非常不同的事情,只能在wx級別上由wxTopLevelWindow表示。

您是否需要在wxWidgets應用程序中打包現有的GtkWidget?如果是這樣,你應該只使用wxNativeWindow。即使您不使用最新版本,您仍然可以輕鬆地重複使用/複製其代碼。

您是否需要包裝現有的XWindow?然後它更加困難,因爲你不能用wxGTK輕鬆做到這一點。你可以使用wxX11,但這個端口狀態不好,所以它可能不是最好的主意,除非你的需求非常有限。最好的可能是首先將X窗口包裝在GtkWidget中,然後按照上述步驟操作。


更新後,似乎只需要現有窗口的XID。這比嵌入GTK +小部件更簡單,因爲您可以使用wxWindow::GetHandle()獲得GtkWidget,然後使用gtk_widget_get_window()獲取其GdkWindow,最後使用GDK_WINDOW_XID()獲取XID。

+0

謝謝@VZ。我已經更新了我的問題,以澄清我在找什麼。我想在一個wxWidgets小部件中包裝一個X11窗口,但它不是一個現有的X11窗口 - 我想創建一個稍後使用的窗口。 – David

+0

標記爲答案,因爲我將沿着嘗試在GtkWidget中嵌入X11窗口的路徑,然後將GtkWidget嵌入到wxWidgets應用程序中。謝謝@VZ。 – David

相關問題