首先在在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); }
下载源代码
访客评论