MFC 模态及非模态对话框
2015-10-20 17:44
197 查看
方法一:模态对话框
资源视图--Dialog--右键--添加资源--新建--对话框--右键--添加类。例如:添加CMyNewDlg类,在所要调的代码中(按钮点击方法中),先加头文件#include "CMyNewDlg.h ",之后在按钮点击方法中:
void COnclickDlg::OnBnClickedOk()
{
CMyNewDlg Dlg;
Dlg.DoModal();
}
方法二:非模态对话框
资源视图--Dialog--右键--添加资源--新建--对话框--右键--添加类。例如:添加CMyNewDlg类,在所要调的代码中(按钮点击方法中),先加头文件#include "CMyNewDlg.h ",之后在按钮点击方法中:
void COnclickDlg::OnBnClickedOk()
{
CMyNewDlg *pDlg=new CMyNewDlg ;
pDlg->Create(IDD_DIALOG2,this);
pDlg->ShowWindow(SW_SHOW);
}
3.关于“模态对话框”和“非模态对话框”的区别
先说说两者的定义:模态对话框就是指那种“显示出来就不可以点选位于其下面的对话框”的对话框;反之的就是非模态对话框。
两者的区别:
一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。
四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。
五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
{delete this; //删除对象}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。
六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。
资源视图--Dialog--右键--添加资源--新建--对话框--右键--添加类。例如:添加CMyNewDlg类,在所要调的代码中(按钮点击方法中),先加头文件#include "CMyNewDlg.h ",之后在按钮点击方法中:
void COnclickDlg::OnBnClickedOk()
{
CMyNewDlg Dlg;
Dlg.DoModal();
}
方法二:非模态对话框
资源视图--Dialog--右键--添加资源--新建--对话框--右键--添加类。例如:添加CMyNewDlg类,在所要调的代码中(按钮点击方法中),先加头文件#include "CMyNewDlg.h ",之后在按钮点击方法中:
void COnclickDlg::OnBnClickedOk()
{
CMyNewDlg *pDlg=new CMyNewDlg ;
pDlg->Create(IDD_DIALOG2,this);
pDlg->ShowWindow(SW_SHOW);
}
3.关于“模态对话框”和“非模态对话框”的区别
先说说两者的定义:模态对话框就是指那种“显示出来就不可以点选位于其下面的对话框”的对话框;反之的就是非模态对话框。
两者的区别:
一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。
四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。
五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
{delete this; //删除对象}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。
六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。
相关文章推荐
- 并查集应用 —— POJ 1182 食物链
- 结构型模式之五——享元模式
- asp.net mvc HandleErrorAttribute 异常错误处理 无效!
- Android WebView常见问题及解决方案汇总
- 网站上通过nginx部署ssl证书
- 谷歌应用市场4
- 物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
- Android 常见命令操作(需要配置adb.exe的环境变量)
- 常用JS
- Linux下profile environment bashrc的区别
- 《转》IEnumerable、IEnumerator两个接口的认识
- Map Wiki -- proposed by Shuo Ren
- 实现windows批处理下的计时功能
- 【转】mac上安装gradle
- [算法练习]最长公共子序列
- 使用Git的Push出现rejected - non-fast-forward错误
- iOS开发笔记--iOS应用架构谈 view层的组织和调用方案
- MySQL编码问题
- 关于bundle的创建方式
- Tomcat手动指定jdk路径