我在对话框中有一个关闭按钮(右上角)的处理程序,在对话框中有一个加法按钮的处理程序。我的自定义按钮的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。
答案 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();
}