CDialog 非模态对话框的创建和销毁

非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。

 

还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。

 

了解了理论过后,下面我们就可以用代码实现一下非模态对话框的创建和销毁过程:

//建立

//主框架中:

CTestDlg *pDlg=new CTestDlg;

pDlg->Create(IDD_TESTDLG,this);

pDlg->ShowWindow(SW_SHOW);

 

//对话框中:

void CTestDlg::OnCancel()

{

DestroyWindow();

}

 

void CTestDlg::PostNcDestroy()

{

CDialog::PostNcDestroy();

delete this;

}

 

PS:

提示1在非模态对话框的OnCancel函数中可以不调用CWnd::DestroyWindow,取而代之的是调用CWnd::ShowWindow(SW_HIDE)来隐藏对话框.在下次打开对话框时就不必调用Create了,只需调用CWnd::ShowWindow(SW_SHOW)来显示对话框.这样做的好处在于对话框中的数据可以保存下来,供以后使用.由于拥有者窗口在被关闭时会调用DestroyWindow删除每一个所属窗口,故只要非模态对话框是自动清除的,程序员就不必担心对话框对象的删除问题.(当需要释放资源时,可以重载WM_DESTORY)

 

PS:

{

对话框数据交换:

    为了和控件交换数据可以定义一个变量与某一个控件关联。

    为了控制控件可以定义一个对象与一个控件相关联。

    注意:一个控件只能和一个对象,一个变量相联,多了会产生错误。

    UpdateData(TRUE);     //控件的值刷新至关联的变量

    UpdateData(FALSE);    //变量的值刷新至控件

    CDialogOnInitDialog中,系统调用UpdataData(FALSE);

    CDialog::OnOk中系统调用UpdateData(TRUE);

}

你可能感兴趣的:(CDialog 非模态对话框的创建和销毁)