在正式开始对话框的学习之前,先简单看一看菜单的操作。一个窗口具有一个菜单区,如“文件”、“编辑”、“查看”等。在MFC中编辑菜单时,我们主要使用其中的资源选项。新建一个名为menu的单文档项目,在其资源选项中找到IDR_MAINFRAME即为当前菜单的资源,选中后VS2008的最右侧会显示其属性信息:Caption表示其显示的内容,Popup为真说明其为弹出式菜单,弹出式菜单无法添加事件消息的相应。菜单的高级操作如图形标记、动态菜单等今天不会过多涉及,因为这些内容属于应用性的技术,需要的时候拿来资料一查就会用了。这里对于菜单只说明三点:一是懂的如何添加新的菜单,如何为添加的菜单添加绑定事件相应行为;二是了解MFC中各个组成类间的菜单出发事件的响应顺序;三是了解MFC资源的ID命名规则。
在窗口上菜单触发事件时,按照以下顺序进行相应:View类-->Doc类-->Frame类-->App类;
MFC的资源ID命名通常是:ID+类型+名称,如IDM表示菜单资源(menu),IDC表示光标资源(Cursor),IDI表示图标资源(Icon)等;
我们添加一个菜单,绑定事件弹出对话框:
关于菜单就先说这么多了,以后有需要的时候再来查阅资料吧。接下来是比较重要的对话框的设计。对话框属于一种特殊的控件,而所有的控件都是由CWnd类派生而来,因此对话框其实是一种特殊的窗口。对话框的作用在于接受用户输入数据,然后处理之后将结果呈现给用户。对话框可以分为两类:
1. 模态对话框:简单来说就是弹出该对话框时程序卡在该处,无法对用户的其他操作进行响应,如word程序的“查找”操作;
2. 非模态对话框:弹出对话框后程序继续运行,可以响应用户的其他操作,如文本程序的“查找”对话框;
就我自己而言,当然更加喜欢可以实时响应用户的非模态对话框了。我们可以直接创建一个对话框,也可以在一个单文档MFC上添加一个对话框,这里使用第二种,新建一个单文档MFC:MyTest,而后在项目中选择“添加资源”,选择Dialog,“新建”即可得到一个对话框:
接下来可以查看该对话框,在资源模式下的Dialog下可以看到IDD_DIALOG1,这是MFC为我们提供的默认ID,双击后可以查看属性,VS2008不能在属性中直接修改对话框的名字了,需要在初始化中使用函数实现。在MFC中,所有针对资源的操作都是通过与其关联的类实现的,为了操作IDD_DIALOG1,我们需要新建一个CDialog的子类,双击对话框,即可弹出类的添加向导,输入CTestDlg,OK之后MFC就自动添加了相应的函数和声明,生成了CTestDlg的cpp和.h文件。为了使得我们点击菜单时能够弹出对话框,我们需要为新的菜单设置事件响应绑定,方法同开始讲述的部分。MFC会自动生成添加OnDialog函数,我们需要在其中添加响应的动作代码:
我们首先创建一个资源对象dlg,而后调用其成员函数DoModal实现模态对话框的创建与显示,注意此时的菜单都是灰色不可用的:
如果想创建一个非模态的对话框,需要注意以下几点:
1. 模态对话框不需要考虑成员生存期问题,因为程序是卡在一点暂停执行的;而对于非模态对话框,需要将dlg设置成更长的生存期,一种方案是添加为CMyTestView类的成员变量,另一种则是声明为指针利用动态分配写入堆内存,而堆内存也是程序的最后才释放的,这时在相应的析构函数中也要添加delete pDlg;
2. 模态函数DoModal()负责创建和显示对话框,非模态则需要Create和ShowWindow两个函数来完成任务;
好了,我们来看看非模态的代码:
我们运行一下程序,可以看到弹出对话框的同时菜单栏都是黑色可选的:
在窗口上菜单触发事件时,按照以下顺序进行相应:View类-->Doc类-->Frame类-->App类;
MFC的资源ID命名通常是:ID+类型+名称,如IDM表示菜单资源(menu),IDC表示光标资源(Cursor),IDI表示图标资源(Icon)等;
我们添加一个菜单,绑定事件弹出对话框:
![](https://i-blog.csdnimg.cn/blog_migrate/51efe99e1731bca963f78be2f47c7e59.jpeg)
关于菜单就先说这么多了,以后有需要的时候再来查阅资料吧。接下来是比较重要的对话框的设计。对话框属于一种特殊的控件,而所有的控件都是由CWnd类派生而来,因此对话框其实是一种特殊的窗口。对话框的作用在于接受用户输入数据,然后处理之后将结果呈现给用户。对话框可以分为两类:
1. 模态对话框:简单来说就是弹出该对话框时程序卡在该处,无法对用户的其他操作进行响应,如word程序的“查找”操作;
2. 非模态对话框:弹出对话框后程序继续运行,可以响应用户的其他操作,如文本程序的“查找”对话框;
就我自己而言,当然更加喜欢可以实时响应用户的非模态对话框了。我们可以直接创建一个对话框,也可以在一个单文档MFC上添加一个对话框,这里使用第二种,新建一个单文档MFC:MyTest,而后在项目中选择“添加资源”,选择Dialog,“新建”即可得到一个对话框:
![](https://i-blog.csdnimg.cn/blog_migrate/10b5724aa082f22c1d9572c405fcb26a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a495ec707040610b49a55e5a12bd000d.jpeg)
接下来可以查看该对话框,在资源模式下的Dialog下可以看到IDD_DIALOG1,这是MFC为我们提供的默认ID,双击后可以查看属性,VS2008不能在属性中直接修改对话框的名字了,需要在初始化中使用函数实现。在MFC中,所有针对资源的操作都是通过与其关联的类实现的,为了操作IDD_DIALOG1,我们需要新建一个CDialog的子类,双击对话框,即可弹出类的添加向导,输入CTestDlg,OK之后MFC就自动添加了相应的函数和声明,生成了CTestDlg的cpp和.h文件。为了使得我们点击菜单时能够弹出对话框,我们需要为新的菜单设置事件响应绑定,方法同开始讲述的部分。MFC会自动生成添加OnDialog函数,我们需要在其中添加响应的动作代码:
点击(此处)折叠或打开
- void CMyTestView::OnDialog()
- {
- //模态对话框的创建
- CTestDlg dlg;
- dlg.DoModal();
-
- // TODO: 在此添加命令处理程序代码
- }
![](https://i-blog.csdnimg.cn/blog_migrate/a182c0b88e282cf21cefe7b413a4f24e.jpeg)
如果想创建一个非模态的对话框,需要注意以下几点:
1. 模态对话框不需要考虑成员生存期问题,因为程序是卡在一点暂停执行的;而对于非模态对话框,需要将dlg设置成更长的生存期,一种方案是添加为CMyTestView类的成员变量,另一种则是声明为指针利用动态分配写入堆内存,而堆内存也是程序的最后才释放的,这时在相应的析构函数中也要添加delete pDlg;
2. 模态函数DoModal()负责创建和显示对话框,非模态则需要Create和ShowWindow两个函数来完成任务;
好了,我们来看看非模态的代码:
点击(此处)折叠或打开
- void CMyTestView::OnDialog()
- {
- //模态对话框的创建
- //CTestDlg dlg;
- //dlg.DoModal();
-
- //非模态对话框的创建
- CTestDlg *pDlg = new CTestDlg;
- pDlg->Create(IDD_DIALOG1, this);
- pDlg->ShowWindow(SW_SHOW);
-
- // TODO: 在此添加命令处理程序代码
- }
![](https://i-blog.csdnimg.cn/blog_migrate/9cb653beac96af5faaffb21ecc6bfd31.png)