0

wxWidgets を使用した GUI プログラミングは比較的初心者です。最近、ダイアログ ボックスのコンテキストでのイベント伝播の既定の動作が、イベントを親に自動的に伝播しないことに不満を感じていました。ドキュメンテーションには、「追跡するにはダイアログ ボックス イベントが多すぎる可能性があります」などと書かれています。Connect()ではなく、イベントにイベントテーブルを使用しています...とにかく。

wxPanelの上にポップアップするダイアログにラジオボタンがたくさんあります。ユーザーがラジオ ボタンを選択すると、どのボタンが選択されているかに関する情報が wxPanel に反映されます。このボタンの選択によって、wxPanel に読み込まれた画像に何が起こるかが決まります。

a) ユーザーがラジオ ボタンをクリックすると設定され、後でパネル クラスからアクセスできるように、ダイアログ クラスにパブリック ボタン識別子メンバーを設定することで、この伝播の問題を既に回避しています。しかし...

b) なぜこれはとてもトリッキーだったのですか? ダイアログボックスがユーザー入力を要求し、それが親ウィンドウで処理されるという状況がよくあると思います。このプログラム設計について間違った方法で考えていますか? たとえば、私はすでに最善の方法でそれを行っていますか?

皆さんありがとう。

4

2 に答える 2

0

通常は完全に異なる別のトップレベルウィンドウへのイベントの伝播はwxDialog、実際には非常に混乱し、予想外であることが判明しました。現在、親ウィンドウのダイアログからイベントを本当に取得したい場合は、ダイアログをwxWS_EX_BLOCK_EVENTS作成した後に、次のようなものを使用して明示的にスタイルをクリアする必要があります

dlg.SetExtraStyle(dlg.GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS);
于 2013-11-05T23:57:18.623 に答える
0

wxWidgets ディストリビューションに付属のサンプル プログラムはご覧になりましたか? さまざまなことを行う方法を示す多くの例があります

たとえば、コントロール サンプルには次のイベント テーブルがあります。

BEGIN_EVENT_TABLE(MyPanel, wxPanel)
EVT_IDLE      (                         MyPanel::OnIdle)
EVT_BOOKCTRL_PAGE_CHANGING(ID_BOOK,     MyPanel::OnPageChanging)
EVT_BOOKCTRL_PAGE_CHANGED(ID_BOOK,      MyPanel::OnPageChanged)
EVT_LISTBOX   (ID_LISTBOX,              MyPanel::OnListBox)
EVT_LISTBOX   (ID_LISTBOX_SORTED,       MyPanel::OnListBox)
EVT_LISTBOX_DCLICK(ID_LISTBOX,          MyPanel::OnListBoxDoubleClick)
EVT_BUTTON    (ID_LISTBOX_SEL_NUM,      MyPanel::OnListBoxButtons)
EVT_BUTTON    (ID_LISTBOX_SEL_STR,      MyPanel::OnListBoxButtons)
EVT_BUTTON    (ID_LISTBOX_CLEAR,        MyPanel::OnListBoxButtons)
EVT_BUTTON    (ID_LISTBOX_APPEND,       MyPanel::OnListBoxButtons)
EVT_BUTTON    (ID_LISTBOX_DELETE,       MyPanel::OnListBoxButtons)
EVT_BUTTON    (ID_LISTBOX_FONT,         MyPanel::OnListBoxButtons)

...

これは、ユーザーが ID_LISTBOX_CLEAR ボタンなどをクリックすると、パネル メソッド MyPanel::OnListBoxButtons() が呼び出されることを示しています。

一般に、接続するイベント、コントロール ID、およびメソッドを指定することにより、任意のクラスの任意のメソッドを呼び出すことができます。

「マクロの 2 番目の引数 (例: MyFrame::OnButton1) は、常に BEGIN_EVENT_TABLE の最初の引数で指定されたクラスのメンバーでなければならないことに注意してください。」http://wiki.wxwidgets.org/Events#Event_Tables

したがって、コントロール D でイベント E が発生したときにクラス C のメソッド M を呼び出したい場合は、次のように記述します。

BEGIN_EVENT_TABLE( C ... )
E ( D C:M )

(ところで、bind() メソッドで wxWidgets v2.9 を使用することは、イベント テーブルよりも好ましいと考えられています。イベント テーブルについて混乱しているように見えるので、イベント テーブルについて学ぶことをスキップして、直接 v2.9 に移行してみませんか?)

于 2013-11-05T17:16:42.730 に答える