非模态对话框销毁有关问题

非模态对话框销毁问题
非模态对话框的创建
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;
}

------解决方案--------------------
探讨
C/C++ code

myDlg::OnCancel()
{
OnDestroy();
}
myDlg::OnDestroy()
{
delete this;
this = NULL;
}

------解决方案--------------------
探讨

非模态对话框的销毁:
CCSerialPortServerDlg* pSerialPortDlg = new 。。。
。。。
。。
不需要的时候
pSerialPortDlg->DestroyWindow();
delete pSerialPortDlg;
pSerialPortDlg = NULL;
或者你参看MSDN上的非模态对话框的销毁方法
When you implem……

------解决方案--------------------
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;