如何正确使用wxID_OK和wxID_CANCEL?

问题描述 投票:1回答:2

有一个图表窗口,右键单击会显示一个弹出菜单,然后在选择时会显示一个窗口:

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::OnDlgManageSeriesDataCloseOK按钮遵循类似的原理。


也许我误解了一些概念,但有几个问题:

1] wxWidgets的事件处理系统是否以不同的方式处理这些ID(wxID_OK或wxID_CANCEL),从而阻止了窗口关闭?

[2)如果在窗口关闭时仍要执行一些操作,使用wxID_OK和wxID_CANCEL的一种好方法是什么?

我在带有VS 2017的Windows 10上使用wxWidgets 3.1.3。

c++ wxwidgets
2个回答
0
投票
按钮ctor中的wxID_ *只允许您在弹出窗口中实现事件处理程序:

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派生。


0
投票
但是,如果您根本不使用wxDialog,这似乎无关紧要,尽管这还不是很清楚。而且,实际上,如果您不想模态显示它,则没有真正的理由使用wxDialog

如果您真的只是创建一个普通的wxFrame并从事件处理程序中为其按钮之一调用Close(),则该操作应独立于您使用的ID起作用。

© www.soinside.com 2019 - 2024. All rights reserved.