Skip to content

模态框与非模态框

模态框与非模态框都是一种对话框,不同的是:

  • 模态框打开后,若不关闭,不可对其父对话框进行操作
  • 模态框打开后,若不关闭,可以对其父对话框进行操作

首先创建两个按钮用来打开着两个模态框,并给这两个按钮添加点击事件

image-20250620151600033

1.模态框

1.1 添加对话框资源

右键资源=》添加=》资源=》选择Dialog=》创建

打开资源视图可以看到我们新建的对话框,在此我把ID重命名为IDD_MODAL

image-20250620151851861

1.2 添加对话框类

右键对话框=》添加类,并且把两个复选框勾上

image-20250620152633093

1.3 修改文件

创建好之后可以看到资源管理器中出现了CModal

CModal.h引入resource.h

pch.h报错,可以删除pch.h

DECLARE_DISPATCH_MAP(),DECLARE_INTERFACE_MAP()没吊用也可以删掉

1.4 添加打开事件

给一开始注册的按钮点击事件添加一下代码

同时要引入CModal.h的头文件

c++
#include "CModal.h"

void CMainDlg::OnBnClickedButton4()
{
	CModal modal;
	modal.DoModal();
}

调用对话框的DoModal即可打开弹窗

打开后,若不关闭,对其父窗口进行操作,发现是不可操作的

2.非模态框

1.1 添加对话框资源

同样新增资源,添加对话框,在此我把非模态框ID命名为IDD_MODULAR

image-20250620154017870

1.2 添加对话框类

image-20250620154225776

1.3 修改文件

创建好之后可以看到资源管理器中出现了CModular

CModal.h引入resource.h

pch.h报错,可以删除pch.h

DECLARE_DISPATCH_MAP(),DECLARE_INTERFACE_MAP()没吊用也可以删掉

1.4 创建对话框

在父对话框中引入该非模态框头文件,并创建一个变量

在父对话框的cpp文件中,构造函数中使用Create创建模态框控件,在按钮点击方法中使用ShowWindow显示窗口

c++
#pragma once
#include "CModular.h"
class CMFCMODALDlg : public CDialogEx
{
public:
	CMFCMODALDlg(CWnd* pParent = nullptr);	// 标准构造函数
	CModular modular;
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
};
c++
#include "CModular.h"

CMFCMODALDlg::CMFCMODALDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFC_MODAL_DIALOG, pParent)
{
	modular.Create(IDD_MODULAR);
}

void CMFCMODALDlg::OnBnClickedButton2()
{
	modular.ShowWindow(SW_SHOW);
}

MIT Licensed