初探MFC
MFC
MFC(Microsoft Foundation Classes) 是微软基础类库,也就是用c++类将win32API封装起来。
应用程序对象
MFC程序都是以应用程序对象为核心,且程序中只有一个应用程序对象。一般我们通过从CWinApp类派生出自己的类并覆盖一些函数后建立全局应用程序对象。
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
程序运行流程
我们需要利用我们从CWinApp类中派生的类创建一个全局应用程序对象。
CMyApp myApp;
然后当程序创建应用程序对象时,因为这是一个全局应用程序对象所以会在_initterm()函数中调用构造代理函数,然后通过构造代理函数调用全局对象的构造函数。
当应用程序对象调用完构造函数后会继续调用我们在SDK中熟悉的WinMain()入口函数
实际在MFC中其调用WinMain函数就是调用AfxWinMain()
AfxWinMain先会调用AfxGetApp()函数得到当前的应用程序对象,返回对象指针赋给基类(CWinApp类)指针变量,然后通过基类指针变量调用各个虚函数。(体现了C++的多态性)
AfxWinMain内会调用AfxWinInit()初始化,调用InitApplication()看HINSTANCE hPrevInstance参数是否为空,接着就会调用InitInstance()函数。
如果这些函数都返回TRUE就会调用Run()函数进入消息循环。否则结束进程。
进入Run()函数接着就进入了消息循环,在消息循环中如果接收到WM_QUIT消息则调用ExitInstance()结束进程
消息映射
MFC中的消息映射是为每一个类维护一张特定消息与次特定消息的消息处理函数的表,当此类对象接收到消息时其会查询这张表能不能处理消息,如果不能就往其基类传递,就这样一直往上传递知道消息被处理或传递给Window消息默认处理函数处理。
如果需要使某个消息能被某个类处理就需要利用宏来建立消息映射,一般每一个消息都有其对应固定的消息处理函数名,我们需要在对应类中声明此函数并声明消息映射即可。然后我们就可以在类外对声明的消息处理函数定义,就可以在此函数中处理此消息。例如我们想要一个类处理WM_PAINT消息,此消息对应的消息处理函数名为:afx_msg void OnPaint();我们只需在类中声明此函数并加上消息映射声明宏语句即可。
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP();
但是要想让消息映射工作我们还需要在程序中使用如下宏才可以处理WM_PAINT消息,如果需要处理其他消息就可以在宏中间添加消息映射宏并在对应类中声明消息处理函数。其中类名为我们想要处理消息的类,基类名即为其对应的基类名。这样类无法处理的消息会被传递给基类消息映射表。
BEGIN_MESSAGE_MAP(类名, 基类名)
ON_WM_PAINT()
END_MESSAGE_MAP()
若果我们想处理一个MFC没有为之提供消息映射宏的消息就需要使用普通的ON_MESSAGE宏为消息创建一个条目,该宏接收两个参数,一个为消息ID,另一个为消息处理函数的地址。
ON_MESSAGE(WM_SETTEXT,MessageProc)
//在对应类中声明MessageProc消息处理函数的形式
afx_msg LRESULT MessageProc(WPARAM wParam,LPARAM lParam)
初探MFC的更多相关文章
- C Socket初探
C Socket初探 前段时间写了个C# Socket初探,这次再写个C语言的Socket博文,运行效果如下: 实现步骤: 1. Server端 #include <stdio.h> // ...
- HTML5+MUI+HBuilder 之初探情人
07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以 我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪,爆炸式的 ...
- 基于Vue、web3的以太坊项目开发及交易内幕初探 错误解决总结
基于Vue.web3的以太坊项目开发及交易内幕初探 本文通过宏观和微观两个层面窥探以太坊底层执行逻辑. 宏观层面描述创建并运行一个小型带钱包的发币APP的过程,微观层面是顺藤摸瓜从http api深入 ...
- vs2010静态链接MFC库报链接错误
由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ...
- MFC中成员变量的声明顺序与析构顺序
第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...
- VC中的MFC到底是什么?
1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
随机推荐
- 通过unity Distribution Portal发布华为渠道的游戏
背景说明 前面几个帖子详细介绍了: Unity Editor安装和Apk打包 手把手教您快速运行Unity提供的华为游戏demo 使用unity完成华为游戏的初始化和华为帐号登录 快速开发Unity游 ...
- 为 .NET 打 Call,为国产平台 Gitee 打 Call,我的 .NET/C# 开源项目清单,同步维护于 Github 和 Gitee
所有项目遵循 MIT 开源协议.可以随意使用,但是需在源代码和产品关于画面保留版权声明和我的网站链接,谢谢. Sheng.Winform.IDE Github:https://github.com/i ...
- 走进docker-初识
什么是Docker容器? 容器是打包代码及其所有依赖项的软件的标准单元,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境.Docker容器映像是一个轻量级的,独立的,可执行的软件软件包,其 ...
- python-3-3 字典
一 元组(tuple) 1.元组也是一个list,他和list的区别是 元组里面的数据无法修改 元祖用()小括号表示,如果元祖里面只有一个元素的话,必须在这个元素的后面添加一个逗号,不然就不是元祖了 ...
- Hibernate的Dao层通用设计
hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...
- [素数判断]P1125 笨小猴
笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出 ...
- centos 7升级gcc到10.2.0
安装gcc 由于 Linux 操作系统的自由.开源,在其基础上衍生出了很多不同的 Linux 操作系统,如 CentOS.Ubuntu.Debian 等.这些 Linux 发行版中,大多数都默认装有 ...
- OOUML系列总结及终章回顾
盼望着,盼望着,OO课程终于结束了,但是,此刻的我却感到一丝失落,甚至想着再来一单元岂不妙哉? 目录 总结本单元三次作业架构 四个单元中架构设计及OO方法理解的演进 四个单元中测试理解与实践的演进 课 ...
- (文字版)Qt信号槽源码剖析(三)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的Qt宏展开推导:今天接着深入分析,进入Qt信号槽源码剖析系列的第三节视频. Qt信号槽宏推导归纳 #define si ...
- Centos6无法使用yum解决办法
12月后Centos 6 系统无法使用yum出现错误(文章底部看) 相信已经有一部分朋友今天连接到CentOS 6的服务器后执行yum后发现报错,那么发生了什么? CentOS 6已经随着2020年1 ...