Безмодельный wxDialog без родителей все еще всегда выше окна wxFrame в z-порядке? - PullRequest
3 голосов
/ 25 сентября 2011

Моя программа открывает окно на основе wxFrame и несколько немодальных и без родительских окон на основе wxDialog. Все это прекрасно работает, за исключением того, что окна на основе wxDialog настаивают на том, чтобы всегда быть поверх окна на основе wxFrame.

Я знаю о wxDIALOG_NO_PARENT, и я им пользуюсь. Диалоги остаются открытыми, когда я закрываю wxFrame, поэтому у них определенно нет окна wxFrame в качестве родителя.

(Если это имеет значение, я использую C ++, wxWidgets 2.8 и запускаю его на Ubuntu Linux. Моя программа не готова для компиляции на любой другой платформе, поэтому я еще не тестировал ее на других. )

Я хочу, чтобы все окна работали совершенно независимо, поэтому пользователь может использовать как окно wxFrame, так и окна wxDialog. Кто-нибудь может указать мне правильное направление?

1 Ответ

6 голосов
/ 25 сентября 2011

Кажется, что это происходит из-за разницы в том, как 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_hint в кодовой базе wxWidgets 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

... и если вы уже показали это диалоговое окно, вам нужно использовать его для его работы:

#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
...