MFC相关知识点

本博客内容:
一、MFC消息映射机制
二、MFC单文档框架讲述
三、MFC的基本类有哪些
四、Windows程序运行
五、SendMessage 和PostMessage的异同

一、MFC消息映射机制

参考:
http://www.docin.com/p-1538732692.html
http://blog.sina.com.cn/s/blog_7cb2016601010tcf.html
MFC是windows下的一个类库,主要是封装了WIN32 API函数,并设计了一套方便的消息映射机制。
具体实现方法:在每个能接收和处理消息的类中,定义一个消息和消息映射表。
在消息映射表中,消息与对应的消息处理函数指针是成对出现的,也就是他们是绑定在一起的。
当有消息需要处理时,程序只要在消息映射表中查看是否含有该消息,就知该类是否能处理此消息。

大致讲一下,WINDOWS SDK下的消息机制实现
windows的消息都是和线程相对应的,即windows会把消息发送给该消息相对应的线程。
SDK模式下,程序是通过GetMessage()函数从某个线程相对应的消息队列里边把消息取出来并放到一个特殊的结构体里面,消息结构体MSG;参数有:
窗口过程相关的窗口句柄
消息的ID号
消息相关的参数(2个)
时间
发送时的鼠标位置
然后TranslateMessage函数用来把虚键消息翻译成字符消息并放到响应的消息队列中,最后由DispatchMessage函数把消息分发到相关的窗口过程。然后窗口过程根据消息的类型对不同的消息进行分别的处理,相对比较麻烦,MFC把消息调用的过程给封装起来了,使得用户能够通过classWizard方便的使用和处理Windows的各种消息。
重点来了……………….
MFC框架结构下,可以进行消息处理的类的头文件中都含义DECLARE_MESSAGE_MAP()宏,
主要进行消息映射和消息处理函数的声明。
这类的实现文件中都有:BEGIN_MESSAGE_MAP END_MESSAGE_MAP
这里主要进行消息映射的实现和消息处理函数的实现
注意:所有能够进行消息处理的类都是基于CCmdTarget类的,就是说CCmdTarget类是所有可以进行消息处理类的父类。
CCmdTarget类是MFC处理命令消息的基础和核心。
同时MFC定义了2个主要的结构体:
AFX_MSGMAP_ENTRY
AFX_MSGMAP
结构一包含了一个消息的所有相关信息。包括:ID号,消息的动作标识,一个指向和该消息相应的执行函数的指针
结构二AFX_MSGMAP主要作用是2个:1.用来得到基类的消息映射入口地址,2.得到本身的消息映射入口地址。
实际上,MFC把所有的消息一条条地填入到AFX_MSGMAP_ENTRY结构体中,形成一个数组,同时通过AFX_MSGMAP得到该数组的首地址,同时得到基类的消息映射入口地址,如果本身不响应,就调用基类的。

MFC如何让窗口过程来处理消息?(了解即可)
实际上所有MFC的窗口类都通过钩子函数来截获消息,并且在钩子函数中把窗口过程设定为AfxWndProc。
1.函数AfxWndProc接受windows操作系统发送的消息
2.它调用AfxCallWndProc进行消息处理
3.又会调用CWnd类的WindowProc进行消息处理。
4.又调用onWndMsg进行正式的消息处理。

二、MFC单文档框架讲述

由classWazerd创建的单文档程序中主框架包含:
文档、视图、框架、文档模板:
文档对象用于管理和维护数据,包括保存数据,取出数据以及修改数据操作,数据修改之后,文档可以通知其对应的所有视图更新显示。
视图:视图对象将文档中数据可视化,负责从文档对象中取出数据显示给客户,并接受用户的输入和编辑,将数据的改变反映给文档对象,视图充当了文档和用户之间媒介的角色。
框架:一个文档可能有多个视图界面,就需要框架来管理。框架就是管理文档和视图的。框架窗口是应用程序的主窗口,程序运行时时会先创建一个最顶层的框架窗口。
文档模板:文档模板中存放了与文档、视图和框架相关的信息,程序通过文档模板创建文档对象,框架窗口对象和视图对象。
自动生成的代码中,框架类继承于CFrameWndEx中,文档类继承与CDocument类,视图类继承于CView类。
MFC构造顺序:
CObject→CCmdTarget→CWinThread→CWinApp→CMyApp

单文档MFC启动流程
1.调用CXXApp构造函数构造全局对象theApp:CXApp theApp;
2.调用WinMain函数完成初始化工作:通过宏_tWinMain
3.初始化工作包括:窗口类注册、窗口产生、显示和更新、消息循环等
①注册窗口类:AfxEndDeferRegisterClass()
②创建窗口CMainFrame::PreCreateWindow()
③消息循环:PumpMessage()
这里写图片描述
其他描述
1.定义和构造APP对象(定义,调用其构造函数,调用父类,子类)
2.调用WinMain函数:这是编译链接的时候从外部链接进来的。
3.该函数中重写了InitInstance() 然后再改函数中执行CWinApp:InitInstance()函数。该函数会new 一个CMyFrameWnd对象,产生主窗口,建对象需要构造函数,构造函数有一个create函数。该函数用来产生窗口。create函数中执行一个createEx函数,createEx函数中的PreCreateWindow是虚函数,在该函数中进行了注册窗口类的操作,create完成创建。至此:窗口创建完成,返回InitInstance(),调用showWindow()显示。upDateWindow()函数。
其他消息机制:
CWinApp::Run()函数是程序声明的源头。Run来执行PumpMessage、GetMessage、TranslateMessage、DispatchMessage,一系列过程把消息与处理函数连接在一起。

三、MFC的基本类有哪些

参考:
https://wenda.so.com/q/1371481757067078?src=140
https://wenku.baidu.com/view/37301f1f6bd97f192279e93b.html
CCmdTarget:用于处理用户请求
CWinApp:应用程序的核心
CDocument:包含应用程序的数据集
CWnd:用于图形用户界面(GUI)的对象,可以处理常见的Windows Message
CFrameWnd:应用程序的主要windows框架
CViw:用于显示数据并与Document对象交互

四、Windows程序运行

输入设备→产生事件→操作系统→发生消息→应用程序→调用API→输出设备
windows程序主要是由消息和事件进行驱动。
应用程序可以通知OS执行某个具体的动作,如OS控制声卡发出声音,但是并不知道何时发出声音,得由应用程序告诉OS何时发出什么声音。在应用程序中要完成某个功能,都是以函数调用的形式来实现的。OS把它所有能完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用叫系统调用。这些函数的集合叫做Windows API. 不可死记硬背。

事件和消息

windows是事件驱动的,所谓事件就是应用程序做了什么事情或程序用户通过输入设备做了哪些事情。
举例:OS能够将输入设备的变化上传给应用程序。如用户在某个活动中,按了键盘,操作系统马上感知该事件,并且知道用户按了那个键,OS并不决定对这个时间做反应,而是交给应用程序,由程序来做出反应。

OS怎么样将感知到的事件传给应用程序?

通过消息机制来实现的。
OS为每个事件都包装成一个称为消息结构体MSG来传递应用程序。
MSG是一个结构体。包括:句柄、消息代号、参数、时间、点坐标等

五、SendMessage 和PostMessage的异同

1.
postMessage:只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,是个异步消息投放函数
而sendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。
2.
postMessage的返回值表示该函数是否执行正确。
sendMessage返回值表示其他程序处理消息后的返回值。
3.
如果位于同一个线程中,post发送消息时,消息要先放入线程的消息队列,然后dispatch到目标窗口。
sendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回,就是说sendMessage在同一个线程中发送消息时并不入线程消息队列。

猜你喜欢

转载自blog.csdn.net/xiongluo0628/article/details/82344009