浅谈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。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值