我从文档(example)中的各种wxWidgets类引用中收集到,用于构建GUI的wxWidgets基本上都是从wxWindow
继承的。我在the source of wxWidgets/window.cpp的注释中看到每个wxWindow
都有一个指向某个GtkWidget的指针,该指针存储在wxWidget对象的m_widget
成员中。从相同的源代码注释中我也看到m_wxwindow
是wxWindow
类的成员,并且在wxPizza
的情况下可能包含指向wxWindow
对象的指针有绘图和儿童的客户区。
我正在开发一个需要这种功能的应用程序。我正在扩展一个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);
sizer是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指出这一点。
更新2: @VZ。建议我澄清我想要做的事情。
我正在使用需要访问X11窗口的库,但不会自己创建该窗口。当我初始化库时,我需要传递一个X11窗口句柄(XID
)。然后该库将绘制到该窗口中。我想创建此窗口以在我的wxWidgets应用程序中。我正在尝试扩展一个wxWidgets类,以便我能够在我的应用程序中基于wxSizer
将这些X11窗口添加到窗口小部件。
我知道gtk_window_new()
不是我想要的,因为它创建了一个新的顶级窗口,而我想在我的wxWidgets应用程序中嵌入一个窗口。这只是我一路上尝试的事情。
答案 0 :(得分:1)
知道你究竟想做什么真的很有帮助。您说的是def user_for_select
User.pluck(:name, :id).unshift(['All', 'all'])
end
s,然后显示GtkWidgets
调用,这会创建一个新的(顶级)窗口,这是一个非常不同的窗口,只能在wx级别由gtk_window_new()
表示。
您是否需要在wxWidgets应用程序中包装现有的wxTopLevelWindow
?如果是这样,您应该使用wxNativeWindow。即使您没有使用最新版本,您仍然可以轻松地重复使用/复制其代码。
您需要包装现有的GtkWidget
吗?然后它更难,因为你不能用wxGTK轻松做到这一点。你可以使用wxX11,但这个端口不是很好,所以它可能不是最好的主意,除非你的需求非常有限。最好的方法可能是首先在XWindow
中包装X窗口,然后按上述步骤进行操作。
更新后,您似乎只需要现有窗口的XID。这比嵌入GTK +小部件更简单,因为您可以使用GtkWidget
获取GtkWidget
,然后使用wxWindow::GetHandle()
获取其gtk_widget_get_window()
,最后使用GdkWindow
来得到XID。