我正在将一些遗留代码从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);
}
答案 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的“模态和无模式”部分。