【C++】【MFC】模态和非模态对话框
1、模态对话框, 开启后限制操作父窗口
void CMFCApplication1Dlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CDlgExeC exec; exec.DoModal(); }
调用DoModal即可完成。
其中DoModal完成了对话框的创建和销毁,并且自带了消息循环,这代表对话框对象可以在栈中创建,无需通过new在堆,自由存储区域创建,其次DoModal将返回对应控件ID的整数值,即点击OK则返回1,点击CANCEL则返回2,最后,因为DoModal因为自带了消息循环,所以如果是在InitInstance中创建,则
2、非模态对话框,开启后对任意窗口都无限制
void CMFCApplication1Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CDlgs s = new CDlgs; s.Create(IDD_SHOW); s.ShowWindow(SW_SHOW); }
针对非模态对话框,上述回调函数会出现窗口一闪而过,其因为函数的结束而介绍对话框,所以需要将定义转写至对应头文件当中,且创建窗口转写至OnInitDialog方法内,因为窗口只需要创建一次即可,每一次点击只需要展示窗口。
对话框的退出:
1 void CMyDlg::OnOK() { 2 ::DestroyWindow(m_hWnd); 3 } 4 5 void CMyDlg::OnCancel() { 6 DestroyWindow(); 7 }
非模态的退出如果不自定义上述代码,点击后,会调用父类进行处理,父类则是直接调用 EndDialog 方法来关闭,但是对于非模态只能隐藏界面,而无法真正的关闭程序进程。
最后,模态和非模态的区别,仅仅是因为一个方法导致的 EnableWindow()
BOOL EnableWindow(
BOOL bEnable = TRUE
);
Parameter:
指定特定窗口是否将启用或禁用。 如果此参数是 TRUE,窗口将启用。 如果此参数是 FALSE,窗口将被禁用
所以完全可以自定义模态对话框,在非模态的基础上,一旦打开一个新的 Dialog ,则传入 False 即可禁用父类的活动,关闭时再开启,从而达到模态的效果,
配合 GetParentFrame() 使用更佳,其将获取父类框架句柄。