无模式,无父对话的wxDialog仍然总是在z-order的wxFrame窗口之上?

时间:2011-09-25 13:31:34

标签: c++ gtk wxwidgets z-order

我的程序打开一个基于wxFrame的窗口和多个无模式和无父对话的基于wxDialog的窗口。除了基于wxDialog的窗口始终位于基于wxFrame的窗口之外,它一切都很漂亮。

我知道wxDIALOG_NO_PARENT,我正在使用它。当我关闭wxFrame时,对话框保持打开状态,因此它们肯定没有将wxFrame窗口作为父窗口。

(如果重要的话,我正在使用C ++,wxWidgets 2.8.something,并在Ubuntu Linux上运行。我的程序还没有准备好在任何其他平台上编译,所以我还没有在其他平台上测试它。 )

我希望所有窗口完全独立运行,因此用户可以使用wxFrame窗口以及wxDialog窗口。有人能指出我正确的方向吗?

1 个答案:

答案 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而被提示:

toplevel.cpp#L594

除了启动画面代码之外,这些是对wxWidgets GTK代码库中gtk_window_set_type_hint的唯一两次调用。因此,事后改变“额外”风格的位不会有所帮助。 (“正确”的解决方案是修补wxWidgets,以便在额外样式中调整wxTOPLEVEL_EX_DIALOG可以对窗口类型提示进行适当的调整。)

如果不运行wxDialog类,则不能运行其构造函数,该构造函数调用非虚方法wxDialog::Create,它将额外样式设置为wxTOPLEVEL_EX_DIALOG,然后直接进入顶级窗口创建:

dialog.cpp#L54

所以我想你可以选择尝试这个,如果你还没有显示对话框窗口,那就有用了:

#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