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

Hea*_*eek 3 c++ gtk wxwidgets z-order

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

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

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

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

Hos*_*ork 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

这些是gtk_window_set_type_hintwxWidgets GTK代码库中唯一的两次调用,除了启动画面代码.因此,事后改变"额外"风格的位不会有所帮助.("正确"的解决方案是修补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
Run Code Online (Sandbox Code Playgroud)

...如果您已经显示了对话框,则需要使用它来使其工作:

#ifdef __WXGTK__
gdk_window_set_type_hint(
    iShouldBeUsingQtDialog->GetHandle()->window,
    GDK_WINDOW_TYPE_HINT_NORMAL);
#endif
Run Code Online (Sandbox Code Playgroud)

这两种情况都要求您在源代码中添加包含文件:

#ifdef __WXGTK__
#include "gtk/gtkwindow.h"
#endif
Run Code Online (Sandbox Code Playgroud)

...并且您必须更新您的构建以找到GTK包含.在G ++的命令行上我尝试了这个并且它有效:

pkg-config --cflags --libs gtk+-2.0
Run Code Online (Sandbox Code Playgroud)