mfc模态对话框和非模态对话框注意点

1,非模态不是堵塞 最好用NEW对象或者一个全局变量

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)动态库创建对话框,状态记得切换

 

posted @ 2024-01-22 14:42  晨光静默  阅读(75)  评论(0编辑  收藏  举报