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 和要连接在一起的方法来调用任何类的任何方法。

“请注意,宏的第二个参数(例如 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 回答