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

toplevel.cpp#L594

gtk_window_set_type_hintスプラッシュ スクリーンのコードを除いて、wxWidgets GTK コードベースでの呼び出しはこれら 2 つだけです。したがって、事後に「余分な」スタイルビットを変更しても役に立ちません。(「正しい」解決策は、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
于 2011-09-25T19:08:49.173 に答える