一、建立工程:
新建工程:MFC应用-->基于对话框-->高级功能全去掉
点完成,至此,基于对话框的MFC工程即建立完成。
二、给按钮添加事件响应函数
在按钮上右击属性-->点事件-->添加事件
如图,为新建工程的对话框,右击“确定”按钮,添加事件处理函数。
系统会自动添加事件处理函数,在事件处理函数中可以添加自己的处理代码。
三、添加窗体
右击工程添加类-->MFC-->基类为CDialog
添加完成后,系统会自动在工程中添加一个窗体,从上图中也可以看出窗体对话框的ID为IDD_TEST。
四、值绑定与控件绑定
1、值绑定:(有两种方法)
方法1:
直接在控件上右击,添加变量。
点击完成后,系统会自动将控件上的数据直接绑定到变量中。
方法2:
自己添加变量,三处改动:在.h文件类定义中添加变量声明(public)。在.cpp文件构造函数中添加变量初始化,在DoDataExchange函数(在.cpp)中将变量和控件进行绑定。(虚函数:DoDataExchange(不能直接调用))
绑定方法:
DDX_Text(pDX, IDC_STUID, m_stuID);//(所有的绑定语句都是用DDX开头的)绑定语句:将(通过控件的id号找到控件)控件所产生的文本绑定到m_stuID上。//还会对变量类型进行判定,输出提示信息
2、控件绑定(返回是控件,可以直接调用函数)
在DoDataExchange函数中以下这句会自动添加
DDX_Control(pDX, IDC_STUSCORE, m_stuScoreCtrl);//将控件绑定到m_stuScoreCtrl变量上,可以认为m_stuScoreCtrl就是控件。
[
DDX_TEXT()的作用可以理解为把字符串变量和控件的文本(WindowText)关联起来,
DDX_Control()的作用可以理解为把变量和控件本身关联起来,
]
3、获取文本控件框中的值进行操作
两种方法间接调用:UpdateData(true)[整个窗体进行刷新]控件里的值传回到变量](UpdateData只对值绑定起作用)
UpdateData(false)变量里的值传回到控件
五、在主对话框中点击按钮创建新的窗体
在三中我们已经添加了新的窗体,那怎样通过主对话框中的按钮,调用新的窗体,将新的窗体进行显示?
两种方法:
//方法1:模式对话框(在按钮的事件处理函数中直接添加)
CAddStudentDlg dlg;
dlg.DoModal();//模式对话框==阻塞对话框(只要这个对话框一运行,程序就被阻塞在这里)
不会继续往下执行
//方法2:非模式对话框
用指针(需要创建在堆区),如果直接在事件处理函数中新建对象在栈区,(而且用本非阻塞方法),要不需要在事件处理函数外delete
[将dlg声明为母窗体类的成员变量]
一般在母窗体构造函数中创建,
dlg = new CAddStudentDlg;//在需要显示的(按钮按下就显示)Dlg类的构造函数中添加
//new的是显示的dlg窗体类。
dlg->Create(IDD_ADDSTUDENTDLG, this);//IDD_ADDSTUDENTDLG是需要显示的窗体类的.h文件中的对话框数据enum { IDD = IDD_TEST };
在析构函数中delete
if (dlg!=NULL)
delete dlg;
在事件处理函数中显示
dlg->ShowWindow(SW_SHOW);//非阻塞的
六、总结整个Dialog程序的执行流程
MFC Dialog 执行步骤: 1、实例化app-------调用app的构造函数【可以自己改,但这里最好少】 2、执行main函数------mfc封装起来 a)调用app下的initInstance函数 【可以自己改BEGIN_MESSAGE_MAP,所有的业务逻辑需要写在对话框中的事件处理函数中】 ( BEGIN_MESSAGE_MAP(CMFCStudentDlg, CDialogEx) ON_XXXXX() //比如自己添加了按钮点击事件,会在此 END_MESSAGE_MAP() ) 创建对话框对象--------[对话框中的事件处理函数在此] 所有对话框创建出来都先调用OnInitDiglog()函数;【函数可以在这里填写代码】 显示对话框对象 b) 执行消息循环(取出消息给a)