模态对话框与非模态对话框

MFC中的模态对话框与非模态对话框

  • 模态对话框
    • 模态对话框创建
    • 模态对话框的关闭顺序
  • 非模态对话框
  • 模态对话框创建
    • 非模态对话框关闭顺序
  • 注意:

模态对话框

模态对话框创建

MyDialog mydlg;
mydlg.DoModal()

当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。

模态对话框的关闭顺序

OnClose:按关闭符号X后,响应WM_CLOSE消息
OnKillFocus:窗口即将失去输入焦点,响应WM_KILLFOCUS消息
OnDestroy:窗口即将被销毁时,响应WM_DESTROY消息
OnNcDestroy:窗口被销毁或,响应WM_NCDESTROY消息
PostNcDestroy:由onNcDesyroy调用,是Cwnd虚函数

非模态对话框

模态对话框创建

MyDialog *mydlg = new MyDialog;
mydlg->Create(IDD_DIALOG1,this);
mydlg->ShowWindow(SW_SHOW);

非模态对话框关闭顺序

OnClose:按关闭符号X后,响应WM_CLOSE消息
OnDestroy:窗口即将被销毁时,响应WM_DESTROY消息
OnNcDestroy:窗口被销毁或,响应WM_NCDESTROY消息
PostNcDestroy:由onNcDesyroy调用,Cwnd函数
为了销毁对话框指针,可以在对话框类中重载PostNcDestroy,添加delete this。

void MyDialog::PostNcDestroy()
{
    CDialogEx::PostNcDestroy();
    delete this;
}

注意:

Onclose函数结束后实际上又调用了Oncannel,Oncannel中调用的是EndDialog(),该函数用于关闭模态对话框。其工作原理为:enddialog是用来结束domodal的循环使用的,domodal内部结束后有destroywindow的调用。但是对于非模态对话框,因其没有domodal循环,故就不会自动调用destroywindow函数,也就没有后续的ondestroy等操作,所以非模态对话框要重载oncannel函数,直接执行destroywindow。

你可能感兴趣的:(MFC)