2011-09-25 19 views
2

我的程序打開一個基於wxFrame的窗口和多個無模式和無父母的基於wxDialog的窗口。除了基於wxDialog的Windows始終位於基於wxFrame的窗口之外,它一切都很好用。無模式,無父母的wxDialog仍然總是在z順序上方的wxFrame窗口之上?

我知道wxDIALOG_NO_PARENT,我正在使用它。關閉wxFrame時,對話框保持打開狀態,所以它們肯定沒有wxFrame窗口作爲父項。我的程序還沒有準備好在任何其他平臺上編譯,所以我還沒有在其他平臺上測試過它,但是我沒有在其他平臺上編譯, )

我想所有窗戶完全獨立操作,所以用戶可以使用wxFrame窗口以及wxDialog窗口。任何人都可以將我指向正確的方向嗎?

回答

6

看來,這種行爲來自於差異侏儒如何處理不同的「類型提示」窗口......這使他們變成自己的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 
+0

謝謝。這是一次勇敢的努力,但徒勞無功:沒有一個窗戶有這種選擇。 :-( –

+0

Forsooth,福克沒有徒勞地編碼。更新! – HostileFork

+0

好主...我沒有*期待任何人去爲這個微不足道的事情努力。即使它不起作用,我也會將此標記爲可接受的結果,但我很高興地向您報告,確實如此 - 您已經確定了這一點。 :-D謝謝! –

相關問題