我对使用wxWidgets进行GUI编程相对较新。最近,我一直感到沮丧的是,对话框上下文中事件传播的默认行为是不自动将事件传播回父级。文档说"可能有太多对话框事件需要跟踪"。我正在为事件使用事件表,而不是 Connect()....然而,无论如何。
我在对话框中有一堆单选按钮,这些按钮会在wxPanel顶部弹出。 当用户选择单选按钮时,我希望有关选择哪个按钮的信息传播回 wxPanel。 此按钮的选择决定了已加载到 wxPanel 中的图像会发生什么情况。
a) 我已经通过在我的对话框类中拥有一个公共按钮标识符成员来规避这个传播问题,该成员在用户单击单选按钮时设置,然后我可以稍后从我的面板类访问。但。。。
b) 为什么这如此棘手? 我想我们经常会遇到这样的情况:对话框要求用户输入,然后在父窗口中进行处理。 我是否以错误的方式思考了这个程序设计? 例如,我现在是否已经以最好的方式这样做了?
谢谢大家。
你看过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 和要连接在一起的方法来调用任何类上的任何方法。
"请注意,宏的第二个参数(例如MyFrame::OnButton1)必须始终是BEGIN_EVENT_TABLE的第一个参数中指定的类的成员 http://wiki.wxwidgets.org/Events#Event_Tables。
因此,如果要在控件 D 上发生事件 E 时调用类 C 的方法 M,请编写
BEGIN_EVENT_TABLE( C ... )
E ( D C:M )
(顺便说一句,使用 wxWidgets v2.9 和 bind() 方法被认为比事件表更可取。既然你似乎对事件表感到困惑,为什么不跳过学习它们,直接进入 v2.9?)
wxDialog
传播到另一个通常完全不同的顶级窗口在实践中被证明是非常混乱和意外的,所以虽然它在某些时候确实像这样工作,但它在很久以前就改变了。如今,如果您真的想从父窗口中的对话框获取事件,则需要在创建对话框后显式清除wxWS_EX_BLOCK_EVENTS
样式,
dlg.SetExtraStyle(dlg.GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS);