3

我的程序打开一个基于 wxFrame 的窗口和多个基于 wxDialog 的无模式和无父窗口。除了基于 wxDialog 的窗口坚持始终位于基于 wxFrame 的窗口之上之外,这一切都运行得很好。

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

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

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

4

1 回答 1

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

顶层.cpp#L594

这些是gtk_window_set_type_hintwxWidgets GTK 代码库中仅有的两个调用,除了在初始屏幕代码中。因此,事后更改“额外”样式位无济于事。(“正确”的解决方案是修补 wxWidgets,以便调整wxTOPLEVEL_EX_DIALOG额外的样式可以对窗口类型提示进行适当的调整。)

如果不运行 wxDialog 类,则不能使用它的构造函数,该构造函数调用非虚拟方法wxDialog::Create,该方法将额外样式设置为wxTOPLEVEL_EX_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
于 2011-09-25T19:08:49.173 回答