有一个图表窗口,右键单击会显示一个弹出菜单,然后在选择时会显示一个窗口:
void CChart::Series_OnPopupMenu(wxCommandEvent& evt)
{
int evtID = evt.GetId();
if (m_dlgManageSeriesData)
return;
if(evtID==ID_ADDNEW)
{
m_dlgManageSeriesData=new dlgManageSeriesData(this);
m_dlgManageSeriesData->Bind(wxEVT_CLOSE_WINDOW, &CChart::OnDlgManageSeriesDataClose, this);
m_dlgManageSeriesData->Show();
}
为了能够跟踪显示的窗口是否关闭:
void CChart::OnDlgManageSeriesDataClose(wxCloseEvent & evt)
{
m_dlgManageSeriesData->Unbind(wxEVT_CLOSE_WINDOW, &CChart::OnDlgManageSeriesDataClose, this);
m_dlgManageSeriesData = nullptr;
evt.Skip();
}
该窗口即dlgManageSeriesData,具有两个按钮:
m_BtnOK = new wxButton(this, wxID_OK, "OK");
m_BtnCancel = new wxButton(this, wxID_CANCEL, "Cancel");
例如,当单击取消按钮时,只需关闭窗口即可:
void dlgManageSeriesData::OnBtnCancelClick(wxCommandEvent & event)
{
Close();
}
在不同情况下很少发生的事情:
1]如果我不尝试使用dlgManageSeriesData::OnBtnCancelClick
手动关闭窗口,则保持wxID_CANCEL并单击Cancel
按钮将其从wxDialog中关闭。 但是,似乎从未以这种方式关闭窗口不会生成wxEVT_CLOSE_WINDOW,因为从未调用过CChart::OnDlgManageSeriesDataClose
。
[2)如果在保持wxID_CANCEL的同时尝试用Close()
关闭窗口,则窗口永远不会关闭。
3)如果我更改按钮的ID并将取消按钮声明为m_BtnCancel = new wxButton(this, wxID_ANY, "Cancel");
,则一切正常,因此,取消按钮关闭了窗口,并调用了CChart::OnDlgManageSeriesDataClose
。 OK
按钮遵循类似的原理。
也许我误解了一些概念,但有几个问题:
1] wxWidgets的事件处理系统是否以不同的方式处理这些ID(wxID_OK或wxID_CANCEL),从而阻止了窗口关闭?
[2)如果在窗口关闭时仍要执行一些操作,使用wxID_OK和wxID_CANCEL的一种好方法是什么?
我在带有VS 2017的Windows 10上使用wxWidgets 3.1.3。
BEGIN_EVENT_TABLE(FooClass, wxDialog)
EVT_BUTTON(wxID_OK, FooClass::OnButtonOkClick)
END_EVENT_TABLE()
您可以使用ID来关闭模式对话框:
void FooClass::OnButtonOkClick(wxCommandEvent& event)
{
EndModal(wxID_OK);
event.Skip(false);
}
然后,调用者将这个值作为对话框ShowModal调用的返回值接收:
...
FooClass dialog(this);
int result = dialog.ShowModal();
if (result == wxID_OK)
{
...
}
如果您的弹出窗口是wxWindow类型,我认为没有这种机制可以返回值。考虑从wxDialog派生。
wxDialog
,这似乎无关紧要,尽管这还不是很清楚。而且,实际上,如果您不想模态显示它,则没有真正的理由使用wxDialog
。如果您真的只是创建一个普通的wxFrame
并从事件处理程序中为其按钮之一调用Close()
,则该操作应独立于您使用的ID起作用。