C++系列 --- 消息机制原理(事件驱动)

1、消息

消息简单的说就是通过输入设备向程序发出指令要执行某个操作。具体的操作是你写的一系列代码,称为消息处理函数。

 

在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。

 

一个switch case语句就可以搞定,消息循环知道遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西。

 

2、Windows程序的整个生命活动周期

C++系列 --- 消息机制原理(事件驱动)_第1张图片

 Windows程序的整个生命活动周期,Win32程序主函数的入口点APIENTRY,当前的窗口程序被拉起来之后,就从APIENTRY这个入口点进行推进,首先,它会有一个WndClass的结构体,我们对WndClass结构体的每一个分量进行设计,设计完成之后,我们向Windows内核做一个提交,即RegisterClass注册内核。

在WndClass中有一个分量叫做lpfnWindowProc,这是Windows窗体过程的一个回调函数,这个回调函数设计好之后,也按照规约提交给Windows内核进行判断,当内核发现这个条件符合规约,并且操作系统也有这个条件和资源进行分配,那么在内核中提供一个内存空间,把这个内存分配好了之后,我们这个窗体已经由Windows内核开始生成了。

 

生成成功之后,将注册成功的消息发送给窗体,接下来我们的主窗体推进到UpdateWindow这个语句,当UpdateWindow这个语句执行之后,生成的这个窗体就被画了出来给用户看。

接下来进入while(::GetMessage())向我们Windows的消息队列开始捡取消息,消息队列不是我们用户自己的,而是由Windows的内核进行维护的,它会将我们所有的硬件排列成一条条的消息,放在消息队列里面,捡取消息这个过程也不是我们来做的,也是由Window内核完成的,Windows内核将消息队列的消息路由给窗体过程函数,我们对窗体过程函数进行switch case处理,只要是Windows的消息,就会路由给窗体过程函数。接下来我们需要了解一下Windows消息的类别,了解Windows有哪些消息需要路由给窗体过程函数。

3、消息类别

1>Windows消息

u此类消息主要包括以前缀WM_ 开头的消息,WM_COMMAND除外。Windows消息由窗口和视图处理。此类消息往往带有用于确定如何处理消息的参数。

2> 控件通知

此类消息包括从控件和其它子窗口发送到其父窗口的WM_COMMAND通知消息。

例如,当用户在编辑控件(Edit Control)中执行可能更改文本的操作后,该编辑控件(Edit Control)将向其父级发送包含EN_CHANGE控件通知代码的WM_COMMAND消息。

该消息的窗口处理程序以某种适当的方式相应此类通知消息,例如在控件中检索该文本。

框架向像传送其他WM_消息一样传送控件通知消息。但是有一个例外的情况,即当用户单击按钮时由按钮发送的消息。

3> 命令消息

此类消息包括用户界面对象(菜单、工具栏按钮和快捷键)发出的WM_COMMAND通知消息。框架处理命令的方式与处理其他消息不同,可以使用更多种类的对象处理命令。

你可能感兴趣的:(C++MFC)