博客
关于我
初探MFC
阅读量:661 次
发布时间:2019-03-16

本文共 1562 字,大约阅读时间需要 5 分钟。

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)

转载地址:http://xpcqz.baihongyu.com/

你可能感兴趣的文章
ES6_变量生明
查看>>
考研复试英语问答
查看>>
百度背景换肤案例
查看>>
修改ng-zorro中table对齐及宽度等细节
查看>>
输出对象的值——踩坑
查看>>
angular2项目里使用排他思想
查看>>
折线图上放面积并隐藏XY轴的线
查看>>
zabbix之自动发现
查看>>
Experience of tecent interview
查看>>
failed to push some refs to git
查看>>
在苹果Mac上如何更改AirDrop名称?
查看>>
1110 Complete Binary Tree (25 point(s))
查看>>
541【毕设课设】基于单片机电阻电感电容RLC测量仪系统
查看>>
568【毕设课设】基于单片机多路温度采集显示报警控制系统设计
查看>>
基于8086交通灯系统仿真设计(微机原理设计资料)
查看>>
解读域名管理之:域名注册机构介绍
查看>>
找中位数
查看>>
这些运维发展方向及系统运维技能都不了解,怎么能吃透Linux??
查看>>
自动化测试——UI自动化测试的痛点
查看>>
如何将萌推商品主图、属性图、详情图批量保存到电脑的方法
查看>>