【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()  使用更佳,其将获取父类框架句柄。

posted @ 2024-05-30 15:03  VanGoghpeng  阅读(128)  评论(0编辑  收藏  举报