最近在做一个简单界面实现的项目,从未学习过MFC相关的知识,在网上找了一些文档学习,加上已有的项目代码,简单总结如下,希望对大家有帮助。主要参考了文章:https://blog.csdn.net/iflyme/article/details/77222457
MFC基础对话框新建:
打开vs2010——文件——新建——项目——选择“MFC应用程序”(填写项目名称)——(MFC程序)下一步——应用程序类型(选给予对话框),其余默认选择,下一步——主框架样式(根据需要选择需要的基础功能),下一步——高级功能,下一步——生成的类,选择Dlg结尾的那个——完成即可。
MFC 执行流程:
MFC创建项目后,一般包括3个类: ”关于” 对话框类,主对话框类,以及用于初始化项目的APP类,假如项目名称为Demo,那么这三个类分别为CAboutDlg、CDemoDlg、CDemoApp。
2、项目生成后,都会生成一个属于CDemoApp类的theApp对象,对本应用程序实例化,这个在CDemoApp.cpp文件中定义,创建时会调用构造函数 CDemoApp::CDemoApp()。这就是程序创建的第一步。
3、接下来程序会调用winmain函数,这个在项目文件中找不到,但可以在VS2010安装路径下找到,奇函数声明为:
4、调用完毕winmain后,就通过InitInstance()函数初始化窗口,包括注册、创建和显示对话框,InitInstance函数是CDemoApp类中除构造函数以外唯一的成员函数。【怪不得debug跟踪时。theApp 构造函数执行完毕之后,直接跑到InitInstance 里面去了,一直都不知道是从哪里进去的】
一般不需要修改这部分程序,但有些时候可以添加部分代码,比如需要创建多个对话框时,刚启动时弹出的对话框(比如用于登录)不是主对话框,就可以在这个函数里创建主对话框之前调用登录对话框,这样就可以设置启动时的默认对话框了。
而对应于各个对话框需要做些什么,就可以到初始化函数BOOL CHSECUDlg::OnInitDialog()
中进行设置即可。
5、应用程序创建完毕之后,程序就开始运行了,于是就进入了消息循环,windows程序的时间都是消息驱动的,每产生一个消息就出发一个响应事件,消息和事件通过消息映射DECLARE_MESSAGE_MAP()联系在一起。
默认包含三个消息:
ON_WM_SYSCOMMAND() //响应控制指令
ON_WM_PAINT() //响应绘图消息,用于刷新窗口
ON_WM_QUERYDRAGICON() //当用户拖动最小化窗口时取得光标
6、当用户关闭应用程序时,会发送一个WM_CLOSE消息,程序响应后结束程序,如何在点击关闭时需要弹出其他对话框(比如用于提示保存),可以通过类向导添加WM_CLOSE消息处理函数,便添加相关处理程序,比如:
7、这样,一个应用程序通过定义,初始化,由winmain开始,注册,创建、显示窗口,消息响应,程序终止 完成了他的运行周期。
自定义消息添加:
1、WM_USER 以下的消息都是系统消息,所以自定义消息时,ID要比WM_USER大,
2、在CDemoDlg类头文件,添加处理该消息的函数,
3、在.cpp源文件中,添加消息映射:
这是最重要的部分,只有在这里映射以后,消息才能和实际处理的函数对应得上,
4、在函数执行过程中,可以通过::SendMessage函数来发送出发消息,因为有程序在一直监听,当接收到某类型的消息以后,会自动按照消息对应的函数进行执行。
注意事项:
·注意自己定义的消息ID要大于WM_USER
MFC添加菜单栏实现页面(窗口到窗口)的跳转(基于VS2013)
1、首先我们看代码效果:点击菜单中的跳转页面可以弹出新的窗口
2、 Step1(新建菜单) 首先新建一个MFC工程文件,并打开资源视图添加菜单栏
Step3(将菜单显示到主窗口)在主窗口的初始化函数(OnInitDialog())中添加代码:
1. CMenu menu;
2. menu.LoadMenu(IDR_MENU1); //IDR_MENU1为菜单栏ID号
3. SetMenu(&menu)
说明:新建的 菜单 相当于一个单独的界面,因此需要通过load到主界面上,才能通过主界面来操作菜单选项。
Step4(新建要弹出的窗口)
Step5(为弹出的窗口添加类)
Step6(添加菜单处理事件(弹出&跳转))把弹出窗口头文件包含进来:
说明:在主窗口中 包含 要跳转的那个 界面对应的 类头文件,然后在主窗口代码中插入事件处理程序,在事件处理程序中添加 { caidan dlg; dlg.DoModal();}即可弹出指定窗口类对应的窗口了。
知识点:
1.Afx前缀的函数代表应用程序框架(Application Framework)函数,属于全局函数,它们可以在程序的任何地方被调用。
2.以域作用符“::”开始的表示的函数,表明该函数是一个全局函数。
模态与非模态对话框的区别:
模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作。
非模态对话框类似于WORD里的查找替换,就在应用程序打开非模态对话框的同时还可以切换到其他窗口进行操作。
二者的类都派生于CDialog类,而CDialog类派生于CWnd类。
区别:
模态对话框使用CDialog::DoModal函数创建以及销毁。初始化消息WM_INITDIALOG,调用OnInitDialog初始化并显示,创建完毕后,DoModal启动消息循环。
非模态对话框使用CDialog::Create实现。由于Create函数不会启动新的消息循环,对话框与应用程序共用一个消息循环,就不会独占用户输入,Create函数在对话框显示后就立即返回。DoModal是在对话框关闭后才返回。对话框关闭后说明对话框窗口的对象已经销毁,只剩下C++对象还没有释放,所以必须调用CWnd::DestoryWindows函数来关闭非模态对话框。