模态对话框和非模态对话框

出现的问题:
在MFC单文档Ribbon界面添加按钮,点击打开对话框,对话框打开关闭后,再打开中断

1、在单文档程序中添加模态对话框:
a. 资源视图/Dialog 右键插入Dialog
b. 类视图/项目名右键类向导,添加新对话框类(基类CDialogEx)
c. 资源视图/Ribbon添加类别、面板以及按钮,右键按钮添加事件处理程序,类列表选择CMainFrame(教程)
d. 在事件响应函数OnBeginDialog()(按钮ID为BeginDialog)添加

CUDPCliDDlg clidlg;
clidlg.DoModal();

2、非模态对话框动态创建:

    OnBeginDialog()
    {
        CUDPCliDDlg * pClidlg= new CUDPCliDDlg(); //给指针分配内存
        pClidlg->Create(IDD_CLIENT); //创建一个非模态对话框  
        pClidlg->ShowWindow(SW_SHOWNORMAL); 
    }
    void CUDPCliDDlg::PostNcDestroy()
    {
        // TODO: 在此添加专用代码和/或调用基类
        delete this;
        CDialogEx::PostNcDestroy();
    }
    void CUDPCliDDlg::OnCancel()
    {
        // TODO: 在此添加专用代码和/或调用基类
        DestroyWindow();
        //CDialogEx::OnCancel();
    }

1、模态对话框,调用DoModal函数显示对话框时,程序会暂停执行,知道模态对话框关闭之后才继续执行。即,当模态对话框显示时,局部变量dlg对象的生命周期并未结束。

2、非模态对话框,创建非模态对话框时,如果把对话框对象定义为局部变量dlg,程序依次执行,OnBeginDialog()执行完毕,则dlg释放。因此,两种方法:将对话框对象定义为成员变量;定义为指针(局部),在堆上分配内存。释放内存:前者在析构函数中delete,后者在Dlg类中重载PostNcDestroy,delete this;

单击【OK】,模态对话框对象被销毁,而非模态对话框并未销毁,只是隐藏了。

在非模态对话框中单击OK,程序调用基类的OnOK函数调用EndDialog函数,此函数用于终止模态对话框、隐藏非模态对话框(不销毁)。因此,如果有IDOK(IDCANCEL),则重写基类OnOK(OnCancel),在OnOK中调用DestroyWindow来销毁对话框,同时注释掉基类的OnOK(OnCancel)。

你可能感兴趣的:(MFC,windows)