首先在在visual studio2022资源视图中添加两个dialog
分别打开每个dialog并绑定类,需要指定基类为CDialog

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

首先绑定模态对话框事件,进入DialogDlg.cpp,
#include "CMdlDialog.h" // 引入模态对话框绑定的类
// 模态对话框
void CDialogDlg::OnBnClickedButton1()
{
CMdlDialog mDialog;
mDialog.DoModal();
}
添加费模态对话框
#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);
}
下载源代码

fffffasdfasdfasdfasdfas;kdfjlaskl;dfjaskl;dfjakls;dfjkal;sfdjlaks;df als;dfj awkls;dfj asl;dfj aslk;dfjaskl;dfjas;ldf
访客评论