gpt4 book ai didi

c++ - 无模式、无父 wxDialog 仍然总是在 z 顺序的 wxFrame 窗口上方?

转载 作者:太空狗 更新时间:2023-10-29 20:30:15 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

似乎这种行为来自于 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 类,该构造函数调用非虚拟方法 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

关于c++ - 无模式、无父 wxDialog 仍然总是在 z 顺序的 wxFrame 窗口上方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com