MFC中的控件

模态对话框和非模态对话框

快速构建

​ 我们要实现一个窗口,窗口中包含了两个按钮,单击第一个打开的是模态对话框,单击第二个打开非模态对话框。

​ 模态对话框是指打开新的对话框不能对原有的对话框操作,非模态对话框是指打开新的对话框还可以对原来的对话框操作。

主界面如下图所示:

MFC中的控件

准备工作

  1. 在资源视图中新建出两个对话框资源,分别在其中右击选择添加类,设置好添加类的类名后,就实现了资源对象与类对象产生了关联。

    2.  在主对话框中添加两个按钮与两个对话框产生交互。
    

实现打开模态对话框

  1. 在资源界面中的主Dialog中,双击打开模态对话框的按钮,打开了单击按钮后触发的程序 的 事件函数:

    // 这里要注意,要在本文件中添加相应的头文件才可以用CDialogDla,读者需要注意到这一点
    void CDialogDlg::OnBnClickedButton1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	dialogEXEC dia;
    	dia.DoModal();
    }
    

添加非模态对话框

  1. 在资源界面中的主Dialog中,双击打开非模态对话框的按钮,打开了单击按钮后触发的程序 的 事件函数:
  2. 添加非模态对话框大致分为三步,先 定义,再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()函数中(当然放在构造函数中也行),如果将函数放到单击事件了,第二次单击按钮时因为重复创建,程序就会报错。

下拉对话框

​ 按照图片的操作顺序,首先在资源视图中新建一个下拉对话框。
MFC中的控件

上一篇:学习C++ Qt/MFC客户端开发还有前途吗?本文给你答案


下一篇:第一章 Hello,MFC