浅谈VC中CDialog的创建,存活与销毁。

VC中Dialog的有两种:模态(model)和非模态(modelless)

1)模态Dialog通过构造函数CDialog去创建的,销毁是有系统销毁(Dialog对象不是new出来),当然new出来的类对象必须手动去delete

CDialog( );

CDialog(
LPCTSTR lpszTemplateName,
CWnd* pParentWnd = NULL);

CDialog(
UINT nIDTemplate,
CWnd* pParentWnd = NULL ); 

CDialog *m_pdlg = new CDialog(IDD_DLGADDR, this);//DD_DLGADDR资源Id
m_pdlg->DoModal();
delete m_pdlg;//CDialog类指针的释放。
class CToolDlg : public CDialog
{
// Construction
public:
CToolDlg(CWnd* pParent = NULL):CDialog(CToolDlg::IDD, pParent)  // standard constructor
       {}
       enum { IDD = IDD_DLGADDR };
}

CToolDlg dlg;
dlg.DoModal();


2)非模态Dialog通过CDialog创建空的类对象,然后调用Create函数;销毁时要重载Dialog中  OnCancel和PostNcDestroy函数

 
  
CMyDialog* pDialog;

void CMyWnd::OnSomeAction()
{
   //pDialog initialized to NULL in the constructor of CMyWnd class
   pDialog = new CMyDialog();
   //Check if new succeeded and we got a valid pointer to a dialog object
   if(pDialog != NULL)
   {
      BOOL ret = pDialog->Create(IDD_MYDIALOG,this);
      if(!ret)   //Create failed.
         AfxMessageBox("Error creating Dialog");
      pDialog->ShowWindow(SW_SHOW);
   }
   else
      AfxMessageBox("Error Creating Dialog Object");
}
 
  
void CMyDialog::OnCancel()
{
     DestroyWindow();//窗口的销毁
     //CDialog::OnCancel();//屏蔽基类的OnCancel,因为基类的OnCancel调用了EndDialog函数,这是模态Dialog的。
}
void CMyDialog::PostNcDestroy()
{
    CDialog::PostNcDestroy();
    delete this;//类对象的销毁
}

体会:模态Dialog,当DoModa()l函数执行中才会有窗口句柄m_hWnd的存在,DoModel函数执行完,系统就会释放窗口句柄m_hWnd,(类对象不一定此刻释放,但毕竟还是系统来完成);非模态Dialog,当Create后窗口句柄m_hWnd就存在,在需要的时候show出窗口。它的句柄销毁依靠程序员调用函数DestroyWindow()来完成,类对象销毁必须手动delete。


你可能感兴趣的:(C/C++)