如何在wxWidgets处理程序OnClose中单击一个按钮?

时间:2017-11-24 08:05:28

标签: c++ events wxwidgets

我在对话框中有一个关闭按钮(右上角)的处理程序,在对话框中有一个加法按钮的处理程序。我的自定义按钮的ID为wxID_CANCEL。处理程序OnClose应该执行处理程序OnButtonCancel。会发生什么:它会关闭对话框和应用程序,因为对话框是在覆盖的wxApp:OnInit中。但是OnButtonCancel没有被执行。

void Dialog_Test::OnClose(wxCloseEvent& event) {
    wxCommandEvent event_button_clicked(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
    event_button_clicked.SetEventObject(this);
    this->ProcessEvent(event_button_clicked);
}

void Dialog_Test::OnButtonCancel(wxCommandEvent& WXUNUSED(event)) {
    wxMessageBox(_("TODO: Dialog_Test::OnButtonCancel")); // <---- not executed
    EndModal(wxID_CANCEL);
}

这里发生了什么?

编辑#1:在wxFrame中,我在OnClose中使用ProcessCommand(wxID_CLOSE_FRAME),但在wxDialog中没有ProcessCommand。

2 个答案:

答案 0 :(得分:0)

我想我找到了这个错误:

// wrong: don't use ProcessEvent of wxDialog
// this->ProcessEvent(event_button_clicked);

// right: use ProcessEvent of the custom wxButton
GetButtonCancel()->GetEventHandler()->ProcessEvent(event_button_clicked);

答案 1 :(得分:0)

如果你按照以下方式处理它,它可能是一个更干净,更灵活的代码:

void MyFrame::btnCancelOnClick(wxCommandEvent & event)
{
    wxCommandEvent CloseEvent;
    CloseEvent.SetEventType(wxEVT_CLOSE_WINDOW);
    CloseEvent.SetEventObject(m_btnCancel);
    wxPostEvent(this, CloseEvent);
}

然后在OnClose事件中

void MyFrame::OnClose(wxCloseEvent & event)
{
    if (event.GetEventObject() == m_btnOK) {}

    else{
        //Do if cancel button is clicked
    }
    event.Skip();
}