非模态对话框销毁有关问题
非模态对话框销毁问题
非模态对话框的创建
if(pSerialPortDlg==NULL)
{
pSerialPortDlg = new CCSerialPortServerDlg();//父窗口中有定义
pSerialPortDlg->Create(IDD_DIALOG_SOCKET,this);
pSerialPortDlg->ShowWindow(SW_SHOW);
}
else
pSerialPortDlg->SetActiveWindow();
我是在一个主对话框中调用一个非模态对话框,关键是销毁时怎样吧父类对话框中的指针pSerialPortDlg置为NULL,如果不置为Null,下次将无法调用该非模态对话框,只有这样才能使下次能正常调用该非模态对话框
------解决方案--------------------
非模态对话框的创建
if(pSerialPortDlg==NULL)
{
pSerialPortDlg = new CCSerialPortServerDlg();//父窗口中有定义
pSerialPortDlg->Create(IDD_DIALOG_SOCKET,this);
pSerialPortDlg->ShowWindow(SW_SHOW);
}
else
pSerialPortDlg->SetActiveWindow();
我是在一个主对话框中调用一个非模态对话框,关键是销毁时怎样吧父类对话框中的指针pSerialPortDlg置为NULL,如果不置为Null,下次将无法调用该非模态对话框,只有这样才能使下次能正常调用该非模态对话框
------解决方案--------------------
- C/C++ code
myDlg::OnCancel() { OnDestroy(); } myDlg::OnDestroy() { delete this; this = NULL; }
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
MS的指示:非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。
还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。
所以你可以如下做:
1.在你自己的窗口类CCSerialPortServerDlg中重载OnCanel和PostNcDestroy.
2.在OnCancel中:
- C/C++ code
void CCSerialPortServerDlg::OnCancel() { // TODO: 在此添加专用代码和/或调用基类 ((父窗口类型*)(this->GetParent())->pSerialPortDlg=NULL;//把这个父窗口中new出来的清0 DestroyWindow(); }
------解决方案--------------------
销毁:
pSerialPortDlg->DestroyWindow();
delete pSerialPortDlg;
pSerialPortDlg=NULL;