我的程序打开一个基于wxFrame的窗口和多个无模式和无父对话的基于wxDialog的窗口。除了基于wxDialog的窗口始终位于基于wxFrame的窗口之外,它一切都很漂亮。
我知道wxDIALOG_NO_PARENT
,我正在使用它。当我关闭wxFrame时,对话框保持打开状态,因此它们肯定没有将wxFrame窗口作为父窗口。
(如果重要的话,我正在使用C ++,wxWidgets 2.8.something,并在Ubuntu Linux上运行。我的程序还没有准备好在任何其他平台上编译,所以我还没有在其他平台上测试它。 )
我希望所有窗口完全独立运行,因此用户可以使用wxFrame窗口以及wxDialog窗口。有人能指出我正确的方向吗?
答案 0 :(得分:6)
似乎这种行为来自于Gnome如何处理具有不同“类型提示”的窗口的差异......它将它们放入自己的z-index分组中:
https://developer.gnome.org/gdk3/stable/gdk3-Windows.html#GdkWindowTypeHint
该对话框是使用GDK_WINDOW_TYPE_HINT_DIALOG
创建的,而您的其他窗口很可能是使用GDK_WINDOW_TYPE_HINT_NORMAL
创建的。做出此决定的点在gtk/toplevel.cpp
,并且由于“额外”样式标志包含wxTOPLEVEL_EX_DIALOG
而被提示:
除了启动画面代码之外,这些是对wxWidgets GTK代码库中gtk_window_set_type_hint
的唯一两次调用。因此,事后改变“额外”风格的位不会有所帮助。 (“正确”的解决方案是修补wxWidgets,以便在额外样式中调整wxTOPLEVEL_EX_DIALOG
可以对窗口类型提示进行适当的调整。)
如果不运行wxDialog类,则不能运行其构造函数,该构造函数调用非虚方法wxDialog::Create
,它将额外样式设置为wxTOPLEVEL_EX_DIALOG
,然后直接进入顶级窗口创建:
所以我想你可以选择尝试这个,如果你还没有显示对话框窗口,那就有用了:
#ifdef __WXGTK__
gtk_window_set_type_hint(
GTK_WINDOW(iShouldBeUsingQtDialog->GetHandle()),
GDK_WINDOW_TYPE_HINT_NORMAL);
#endif
...如果您已经显示了对话框,则需要使用它来使其工作:
#ifdef __WXGTK__
gdk_window_set_type_hint(
iShouldBeUsingQtDialog->GetHandle()->window,
GDK_WINDOW_TYPE_HINT_NORMAL);
#endif
这两种情况都要求您在源代码中添加包含文件:
#ifdef __WXGTK__
#include "gtk/gtkwindow.h"
#endif
...并且您必须更新您的构建以找到GTK包含。在G ++的命令行上,我尝试了这个并且它有效:
pkg-config --cflags --libs gtk+-2.0