wxWidgets PostNcDestroy等效

时间:2016-11-01 14:26:04

标签: c++ wxwidgets

我正在将一些遗留代码从MFC转换为wxWidgets。 我转换的菜单系统使用静态工厂方法创建对话框,postNcDestroy删除this指针并执行其他清理。

在wxWidgets中进行此清理的最佳方法是什么?

通过添加

,类定义非常标准CDialogEx
//some static vars
static bool m_bOpen;
...

//factory method
static void Showdlg(CCustomDlg* pParent);
virtual void PostNcDestroy() { m_bOpen = false; ... delete this; }

实施是

void CCustomDlg::Showdlg(CCustomDlg* pParent)
{
    m_bOpen = true;
...
    CCustomDlg*pDlg = new CCustomDlg(pParent);
    pDlg->Create(pParent);
    pDlg->ShowWindow(SW_SHOW);
}

1 个答案:

答案 0 :(得分:2)

我不确定为什么你需要m_bOpen变量,但我认为你有理由。大致相当的wxWidgets东西将类似于以下内容。声明:

class CCustomDlg : public wxDialog
{
    private:
        static bool m_bOpen;

    public:
        CCustomDlg( wxWindow* parent, 
            wxWindowID id = wxID_ANY, 
            const wxString& title = wxEmptyString, 
            const wxPoint& pos = wxDefaultPosition, 
            const wxSize& size = wxDefaultSize, 
            long style = wxDEFAULT_DIALOG_STYLE );
        ~CCustomDlg();
};

实现:

bool CCustomDlg::m_bOpen=false;

CCustomDlg::CCustomDlg( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
    m_bOpen=true;
...
}

CCustomDlg::~CCustomDlg()
{
    m_bOpen=false;
}

然后,您可以按如下方式创建对话框的模态版本(假设从主应用程序表单的代码中调用此代码):

CCustomDlg dlg(this);
dlg.ShowModal();

当dlg对象超出范围时,wxWidgets将处理对话框的所有清理。您还可以检查ShowModal()的返回值,以查看按下确定按钮时是wxID_OK,按下取消按钮时是wxID_CANCEL,还是您在代码中调用EndModal()时为自己提供的其他值CCustomDlg。

如果你想要一个非模态版本的对话框,事情会有点棘手。在这种情况下,您将使用new创建一个指向对话框的指针,调用Show()而不是ShowModal(),然后需要在不再需要该对话框的适当时间调用Destroy()。有关详细信息,请参阅this page的“模态和无模式”部分。