2016-08-07 6 views
0

GUIを構築するために使用されたwxWidgetsが基本的にwxWindowから継承しているドキュメント(example)のさまざまなwxWidgetsクラスリファレンスから集めました。 the source of wxWidgets/window.cppのコメントから、各wxWindowには、wxWidgetオブジェクトのm_widgetメンバーに格納されているGtkWidgetへのポインタがあることがわかります。同じソースコードのコメントから、wxWindowクラスのメンバーであり、wxWindowの場合には、描画および子のクライアント領域を持つwxPizzaオブジェクトへのポインタを保持できることもわかります。wxWidgets、GTK2ウィジェット、およびX11ウィンドウを接続するにはどうすればいいですか?

私はこの種の機能が必要なアプリケーションを開発中です。私はdrawable X11ウィンドウを含む必要がある私自身のウィジェットを作成するためにwxWidgetsクラスを拡張しています。それをすべて接続する方法が本当にわからないし、ドキュメントを使って解決策を見つけるのが難しいです。

私は(Create方法で)私のカスタムウィジェットを作成しています、私はm_widgetm_wxwindowはこのことからして、両方のNULLをしていると私は上記のものを、私はこれらは私が作成しなければならないGtkWidgetオブジェクトで集めることがわかります私のクライアントエリアを形成する。まず、私はこれを試しました:

m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

どのような作品が、私はそれが欲しいものではありません。私はGtkWidgetからXIDを取得することができ、X11ウィンドウは期待通りに動作します。しかし、これは私の主要なwxWidgetsアプリウィンドウの外に新しいウィンドウを作成します。私が望むのは、私の主要なwxWidgetsアプリウィンドウの中に埋め込まれていることを除いて、この正確な機能です。マイカスタムクラスは、このようwxBoxSizerに追加されました:サイザーはwxBoxSizerあるとmy_widgetは私のカスタムウィジェットです

sizer->Add(my_widget, 1, wxEXPAND | wxALL, 0); 

ところ。

私はその後GtkWidgetのいくつかの異なる種類としてm_widgetを作成しようとしたが、gtk_widget_realizeを使用しようとXIDを取得しようとしたとき、これらはすべて、実行時エラーが生じました。

// These don't work 
m_widget = gtk_drawing_area_new(); 
m_widget = gtk_vbox_new(false, 0); 

これらは、私は上記をしようとしたとき、私は取得していますエラーメッセージです:

Gtk: IA__gtk_widget_realize: assertion 'GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed 
Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window 
Check failed: xwindow. 

だから私、これはマルチパートの質問です:

  • 適切である何GtkWidgetこれを達成するために入力しますか?私は描画可能なX11ウィンドウID(XID)を取得し、それを親ウィジェット(wxBoxSizer)に埋め込む必要があります。
  • m_widgetm_wxwindowの両方を使用する必要がありますか?これらをどのように設定するのですか?
  • これをwxBoxSizerに接続するには、sizer->Add()に電話する以外は何もする必要がありますか?

ありがとう!

更新日:申し訳ありませんが、これはGTK2用です。これを指摘してくれてありがとう@andlabs。

更新2: @VZ。私が何をしようとしているのかを明確にすることを勧めました。

私はX11ウィンドウにアクセスする必要があるライブラリを使用していますが、そのウィンドウ自体は作成しません。ライブラリを初期化するときに、X11ウィンドウハンドル(XID)を渡す必要があります。ライブラリがそのウィンドウに描画されます。このウィンドウを作成してwxWidgetsアプリケーションの中に入れたいと思います。私は、アプリケーションでwxSizerに基づいてウィジェットにこれらのX11ウィンドウを追加できるように、wxWidgetsクラスを拡張しようとしています。

gtk_window_new()は、新しいトップレベルウィンドウを作成するため、私のwxWidgetsアプリケーションに埋め込まれたウィンドウが必要なので、私が探しているものではありません。それはちょうど私が途中で試したものです。

+1

GTK + 2またはGTK + 3? – andlabs

+0

@David、なぜあなたは気にしますか?このm_widgetとm_wxwindowはすべて、内部的にwxWidgetsだけです。 wxWidgetsの描画サンプルを試しましたか?それとも他のサンプルでも問題ありませんか? – Igor

+0

@andlabsにおねがいします、それはGTK + 2です – David

答えて

1

正確に何をしようとしているのかを知ることは本当に役に立ちます。 GtkWidgetsについて話していますが、gtk_window_new()コールを表示すると新しい(トップレベル)ウィンドウが作成されます。これは全く異なるもので、wxレベルのwxTopLevelWindowでしか表現できません。

wxWidgetsアプリケーションに既存のGtkWidgetをラップする必要がありますか?その場合は、wxNativeWindowを使用してください。最新バージョンを使用していなくても、コードを簡単に再利用/複製できます。

既存のXWindowをラッピングする必要がありますか?それでwxGTKで簡単にはできないので難しいです。あなたはwxX11を使うことができますが、このポートは良い状態ではないので、あなたのニーズが非常に限られていない限り、おそらく最良のアイディアではありません。おそらく、Xウィンドウを最初にGtkWidgetにラップして上記のように処理するのがベストでしょう。


更新後、既存のウィンドウのXIDが必要なようです。これは、wxWindow::GetHandle()を使用してGtkWidgetを得ることができるGTK +ウィジェットを埋め込んだ後、を使用してGdkWindowを取得し、最後にGDK_WINDOW_XID()を使用してXIDを取得するよりも簡単です。

+0

ありがとう@VZ。私は自分の探しているものを明確にするために質問を更新しました。 wxWidgetsウィジェットでX11ウィンドウを折り返したいのですが、既存のX11ウィンドウではありません。後で使用するウィンドウを作成したいと思います。 – David

+0

答えとしてマークすると、X11ウィンドウをGtkWidgetに埋め込み、次にwxWidgetsアプリケーションにGtkWidgetを埋め込むことになるだろうからです。ありがとう@VZ。 – David

関連する問題