模态对话框和非模态对话框
快速构建
我们要实现一个窗口,窗口中包含了两个按钮,单击第一个打开的是模态对话框,单击第二个打开非模态对话框。
模态对话框是指打开新的对话框不能对原有的对话框操作,非模态对话框是指打开新的对话框还可以对原来的对话框操作。
主界面如下图所示:
准备工作
-
在资源视图中新建出两个对话框资源,分别在其中右击选择添加类,设置好添加类的类名后,就实现了资源对象与类对象产生了关联。
2. 在主对话框中添加两个按钮与两个对话框产生交互。
实现打开模态对话框
-
在资源界面中的主Dialog中,双击打开模态对话框的按钮,打开了单击按钮后触发的程序 的 事件函数:
// 这里要注意,要在本文件中添加相应的头文件才可以用CDialogDla,读者需要注意到这一点 void CDialogDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 dialogEXEC dia; dia.DoModal(); }
添加非模态对话框
- 在资源界面中的主Dialog中,双击打开非模态对话框的按钮,打开了单击按钮后触发的程序 的 事件函数:
- 添加非模态对话框大致分为三步,先 定义,再Create ,之后 ShowWindow,话句话说就是先创建后显示。
定义:要在类中定义为成员变量
class CDialogDlg : public CDialogEx
{
// 构造
...
...
private:
CDialogShow dialogShow;
};
Create:
BOOL CDialogDlg::OnInitDialog()
{
...
...
dialogShow.Create(IDD_SHOW);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
ShowWindow:
void CDialogDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
dialogShow.ShowWindow(SW_SHOWNORMAL);
}
运行就行了~
具体说明:
有人可能会问,为什么模态对话框可以定义局部变量,非模态对话框就不行呢?
其实答案是生命周期的问题,局部变量的生命周期是它所在的方法,当这个方法执行完毕时,局部变量的生命周期就结束了,模态对话框调用了DOModel()方法,这个方法会将程序阻塞,让程序不往下面执行,所以在方法中定义局部变量完全没问题。而非模态的创建过程就不行,它所调用的Create和showWindow方法并不会阻塞,因此最好将对话框定义为成员变量。
非模态对话框中,create方法为什么要放到OnInitDialog()中呢?
先说需求,我们是每次单击每次让对话框显示在屏幕上,这个每次单击每次创建一个非模态对话框显然不符合需求,所以我们要讲create放到一个程序只执行一次的地方,因此放在OnInitDIalog()函数中(当然放在构造函数中也行),如果将函数放到单击事件了,第二次单击按钮时因为重复创建,程序就会报错。
下拉对话框
按照图片的操作顺序,首先在资源视图中新建一个下拉对话框。