mfc模态对话框和非模态对话框注意点
XxxDlg* dlg = NULL;
dlg = new XxxDlg(this);
dlg->Create(IDD_DIALOG_XXX);
dlg->ShowWindow(SW_SHOW);
2,模拟对话框是阻塞的
显示模式对话框:
CDialogDemo dlg;
dlg.DoModal();
3,退出对话框
第一种:点X
OnClose()->OnCancel()->DestroyWindow()->OnDestroy()
第二种:按回车
OnOK()->DestroyWindow()–>OnDestroy()
第三种:按ESC
OnCancel()->DestroyWindow()–>OnDestroy()
4,注意点
1)OnCancel()和OnOK()内部调用的是EndDialog() 这个函数是针对销毁模态对话框调用的,如果是非模态对话框,要改成手动调用DestroyWindow()
2)非模态对话框必须重载的函数就是PostNcDestroy,是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针
3)非模态对话框不手动调用DestroyWindow(),这个的时候 窗口也会消失 但是没有销毁 也就是还存在内存中,直到主窗口被关闭 才会响应该对话框的WM_DESTROY消息处理函数OnDestroy(即退出调用过程是:对话框构造-OnCancel-界面消息,直到主窗口关闭,ondestroy,印象没不会调用析构[只有手动destroywindow的消息delete this才会调用析构])
4)在一个模态对话框中,想要再创建一个对话框的情况:
4.1)创建的是模态对话框,会阻塞父对话框的消息不响应
4.2)通过发消息创建一个对话框,消息处理函数要尽快立即退出,否则主模态对话框会卡死
4.3)创建一个线程,线程里面用模态和非模态创建对话框均无法正常显示出来,只能线程发消息给主模态,主模态消息立即创建非模态窗口
4.4)动态库创建对话框,状态记得切换