首先在在visual studio2022资源视图中添加两个dialog

分别打开每个dialog并绑定类,需要指定基类为CDialog

1.png


在主界面中添加两个按钮,并分别给按钮绑定click事件(或者双击按钮)

3.png


首先绑定模态对话框事件,进入DialogDlg.cpp,

#include "CMdlDialog.h" // 引入模态对话框绑定的类

// 模态对话框
void CDialogDlg::OnBnClickedButton1()
{
	CMdlDialog mDialog;
	mDialog.DoModal();
}

4.png


添加费模态对话框

#include "CNModDialog.h"

void CDialogDlg::OnBnClickedButton2()
{
	CNModDialog nmodDialog;
	nmodDialog.Create(IDD_DIALOG2);
	nmodDialog.CenterWindow();
	nmodDialog.ShowWindow(SW_SHOWNORMAL);
}

运行后打开非模态对话框,会一闪而过,或者根本看不到任何效果。

这是怎么回事呢?原来CNModDialog不能保持,是局部变量,执行完成后就会释放,所以我们需要想办法

将弹出的非模态对话框这个实例对象作为主对话框类的成员DialogDlg.h

#include "CNModDialog.h"

public:
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton1();
private:
	CNModDialog nmodDialog;

绑定事件里面可以将“CNModDialog nmodDialog”去掉,但是新的问题出来了,

第二次点击打开非模态对话框时,会报错,这是因为Create只能创建一次,不能多次创建

所以我们可以将create放入OnInitDialog中初始化

BOOL CDialogDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	nmodDialog.Create(IDD_DIALOG2); // 主要是这里

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

最后事件绑定方法中变成

// CNModDialog nmodDialog; // 可以写到头文件DialogDlg.h中,添加成员
void CDialogDlg::OnBnClickedButton2()
{
	// CNModDialog nmodDialog; // 写在这里对话框会一闪而过
	// 创建窗口,只能创建一次,多次创建就会报错,所以需要保证create只调用一次
	// 所以可以写到上面初始化函数方法OnInitDialog中
	// nmodDialog.Create(IDD_DIALOG2);
	nmodDialog.CenterWindow();
	nmodDialog.ShowWindow(SW_SHOWNORMAL);
}

5.png


下载源代码

Dialog.rar