模态对话框与非模态对话的几种销毁方法与区别

最近在做win32调对话框,挺郁闷,找了好多文章研究,才发现非常简单。

 

先说下模式对话框调用的原则。

模式对话框,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()关闭对话框。

一定要注意之前的CDialog::(当然,你可以重载你自己对话框的这个虚函数,但是,后面必须调用基类的CDialog::

具体我们再参照深入浅出的风格,来个解刨。 

CDialog::Close()默认调用CDialog::OnCancel() , CDialog::OnCancel()调用CDialog::EndDialog(IDCANCEL);

CDialog::EndDialog调用CDialog::DestroyWindows(),CDialog::DestroyWindows调用CDialog::OnDestroy() ;


CDialog::OnOK()默认先CDialog::UpdateData(),然后再调用CDialog::EndDialog(IDOK).

CDialog::EndDialog调用CDialog::DestroyWindows(), CDialog::DestroyWindows调用CDialog::OnDestroy()   

看来上面你可能就知道了如下的等式

CDialog::Close() == CDialog::OnCancel() == CDialog::EndDialog(IDCANCEL)一样。

CDialog::OnOK() == CDialog::EndDialog(IDOK).

CDialog::EndDialog(IDOK)跟CDialog::EndDialog(IDCANCEL)的区别就是,少了一个CDialog::UpdateData(),也就是CDialog::EndDialog(IDOK),在关闭对话框后,会把对话框上控件关联的变量的值更新为用户最后输入的值。而CDialog::EndDialog(IDCANCEL)就不会更新这个值。

希望自己把模式对话框的关闭讲清楚了。

 

下面说说非模态对话框

调用原则是:
在无模式对话框,重载你自己的OnOK(),就是CMyDialog::OnOK()调用CDialog::DestroyWindows()。注意:不是默认的CDialog::OnOK()来关闭对话框。

重载CMyDialog::OnCancel()调用CDialog::DestroyWindows()。注意:不是调用默认的CDialog::OnCancel(),来关闭对话框。

 

听起来很简单,但是下面提到一个很具体的编程问题。

一般,我们用非模态对话框都是全局的,也就是通过new来创建,是在heap上的,而不是在stack上的。

这样我们当然还要通过delete 来销毁对象,不然可是有内存泄漏的。那么我们什么时候delete这个对象呢?

在msdn上面我们可以看到微软提供的方法是,

我们要重载PostNcDestroy(),即我们要实现CMyDialog::PostNcDestroy(),内容如下

CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }

 

这样的话,我们的类就会Auto-Cleanup了。

HWND hMain = CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG1, hWnd, (DLGPROC)DlgProc);
ShowWindow(hMain, SW_SHOW);
SetTimer(hMain, 10, 5000, NULL);

 

仿造about处理消息改一下就好了。

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch(message)
   {
 case WM_COMMAND:
  if (wParam == IDOK)
  {
   DestroyWindow(hDlg);
   SendMessageW(hWnd, WM_ONOK, NULL, NULL);
   break;
  }
  else if(wParam == IDCANCEL)
  {
   DestroyWindow(hDlg);
  }
 case WM_TIMER:
  if (wParam == 10)
  {
   SendMessageW(hWnd, WM_ONOK, NULL, NULL);
   DestroyWindow(hDlg);
   break;
  }
 return (INT_PTR)FALSE;
}

http://msdn.microsoft.com/en-us/library/5zba4hah.aspx

你可能感兴趣的:(模态对话框与非模态对话的几种销毁方法与区别)