模态对话框和非模态对话框
Windows对话框分为两类:模态对话框和非模态对话框。
模态对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。(比如:word中的“另存为”)
非模态对话框,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。(比如:word中的“查找与替换)
创建模态对话框
弹出对话框比较关键的一个函数,
CDialog::DoModal()函数的原型为: virtual INT_PTR DoModal(); 返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。 调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。
就是对话框类的DoModal()函数。
注:CAdditionDlg 为新建对话框的类。 CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg INT_PTR nResponse = dlg.DoModal(); // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponse if (nResponse == IDOK) // 判断返回值是否为OK按钮 { MessageBox(“ ”,””,MB_OK); } else if (nResponse == IDCANCEL) // 判断返回值是否为Cancel按钮 { MessageBox(“ ”,””,MB_OK); }
步骤:
1. 在资源视图添加Dialog的对话框,再给对话框添加类CAdditionDlg。
2. 定义对话框类的对象CAdditionDlg m_dlg。
3. m_dlg.DoModal()。
非模态对话框
实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的。
创建非模态对话框:
注:CAdditionDlg 为新建对话框的类。在父对话框的头文件必须加上” CAdditionDlg.h”。
在父对话框的头文件,先声明CAdditiondlg *m_pDlg。再到源文件的初始化中把m_pDlg=NULL;
CAdditiondlg *m_pDlg; If(m_pDlg==NULL) { // 创建非模态对话框实例 m_pDlg=new CAdditionDlg; m_pDlg->Create(,NULL); //第一参数为新建对话框的ID。 } m_pDlg->ShowWindow(SW_SHOW); // // 显示非模态对话框
销毁非模态对话框:
因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义的
析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:
CAdditionDlg::~CAdditionDlg() { // 如果非模态对话框已经创建则删除它 if (NULL != m_pDlg) { // 删除非模态对话框对象 delete m_pDlg; } }
注意:创建非模态对话框为什么不用对象呢?
如:m_Dlg.Create( ,NULL);
第一次创建成功,并可以显示。第二次时,程序崩溃。因为,以对象来创建,只有一份内存,而用指针时,每一次都重新分配内存(new)。
步骤:
1. 在资源视图中,创建Dailog对话框,并添加类 CAdditiondlg。
2. 在父对话框的头文件添加新建Dailog的头文件 ”CAdditiondlg.h”。(一定要添加)
3. 再创建CAdditiondlg *m_pDlg; 在源文件 初始化为NULL;
4. m_pDlg=new CAdditiondlg; 分配内存
5. 创建非模态对话框 并显示
6.
m_pDlg->Create(,NULL); //第一参数为新建对话框的ID。
m_pDlg->ShowWindow(SW_SHOW);
。。。。。。。。。。。。。。。。。。。。结束。。。。。。。。。。。。。。。。。。。。。。