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();
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。