最近在做一个简单界面实现的项目,从未学习过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函数来关闭非模态对话框。

MFC 入门介绍和实例操作相关推荐

  1. SAP IDOC和EDI应用(1) 基本原理介绍及实例操作

    SAP系统之间.SAP系统与外部系统传输业务数据的方法有多种,IDOC.EDI是比较常见的方式. IDOC(Intermediate Document)是一个数据载体,描述了一个完整的业务对象,用于在 ...

  2. html自定义datajs,科技常识:HTML5的自定义属性data-*详细介绍和JS操作实例

    今天小编跟大家讲解下有关HTML5的自定义属性data-*详细介绍和JS操作实例 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5的自定义属性data-*详细介绍和JS操作实例 的 ...

  3. java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解

    sqlite数据库的介绍与java操作sqlite的实例讲解 发布时间:2020-10-03 05:40:34 来源:脚本之家 阅读:92 作者:Lee_Tech sqlite是啥? 1.一种轻型数据 ...

  4. 《SolidWorks 2017中文版机械设计从入门到精通)》——2.7 复合草图实例操作

    本节书摘来自异步社区<SolidWorks 2017中文版机械设计从入门到精通>一书中的第2章,第2.7节,作者: 赵罘 , 杨晓晋 , 赵楠 更多章节内容可以访问云栖社区"异步 ...

  5. Visual C++/MFC入门教程

    Visual C++/MFC入门教程 VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友 ...

  6. [翻译][1.4.2]Flask-Admin入门介绍

    为什么80%的码农都做不了架构师?>>>    #Flask-Admin入门介绍 ##让我们荡起双桨 初始化 Introduction To Flask-Admin Getting ...

  7. 【C/C++语言入门篇】-- 文件操作

    [C/C++语言入门篇]-- 文件操作 收藏 此文于2010-03-09被推荐到CSDN首页 如何被推荐? 最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起.之前本打算这个模块就结束了,文件操 ...

  8. java hashmap实例,关于java中的HashMap的实例操作

    HashMap简介: 1.以(键,值)对存储数据. 2.不允许有重复的键,但允许有重复的值. 3.不同步(多个线程可以同时访问) 相关视频教程推荐:java在线学习 实例演示如下: 1.添加 Hash ...

  9. 分布式事物框架--EasyTransaction的入门介绍

    分布式事物框架--EasyTransaction的入门介绍 柔性事务,分布式事务,TCC,SAGA,可靠消息,最大努力交付消息,事务消息,补偿,全局事务,soft transaction, distr ...

  10. [转载] python中pass的使用_Python pass详细介绍及实例代码

    参考链接: Python pass语句 Python pass详细介绍及实例代码 Python pass的用法: 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++ ...

最新文章

  1. Python 200个标准库汇总
  2. python课程费用-深圳python课程费用
  3. SolrQuery的使用
  4. 关于前后端分离我的理解
  5. 济南长清104国道科目三考试流程(转载)
  6. 选择列表和可多选的选择列表
  7. figma设计_在Figma中使用隔片移交设计
  8. 切割日志 python版
  9. LeetCode Python实现 链表简单部分
  10. js 格式化 java时间格式化_用JavaScript(js)对时间格式化
  11. ArcGISServer 10.2发布地理处理服务:以CAD数据至地理数据库为例(2)发布地理处理服务
  12. 计算机主机进水无法启动,笔记本电脑进水后出现不能正常开机启动
  13. FFmpeg+SDL纯语音播放器
  14. vue模板中写html,vue中template的三种写法示例
  15. 布尔逻辑代数化简公式
  16. LNMT架构部署:Linux+Nginx+Mysql+Tomcat
  17. 喜讯 | 哈特公寓荣誉获最佳新锐公寓奖
  18. 登录服和游戏服分开的原因
  19. Java 12位uuid_java如何生成12位永远不重复的数字
  20. Vue双向绑定失效 v-model

热门文章

  1. Jsp和Servlet的关系(通俗易懂)
  2. 使用iOS AirPrint 让你的APP轻松实现打印功能
  3. 数据迁移软件|如何将旧电脑的数据传输到新电脑?
  4. 非线性控制3.0——自适应模糊控制
  5. 单点登录原理及实现方式
  6. 《App后台开发运维和架构实践》资源汇总
  7. 全集成隔离DC-DC转换器CA-IS3105W简介
  8. ASCII码值对照全表
  9. 伪加密文件的破解方法
  10. C语言实现扫雷游戏(详解)