消息的来龙去脉

事件的前身是消息(Message)。Windows是消息驱动的操作系统,运行其上的程序也遵照这个机制运行。消息本质就是一条数据,这条数据记载着消息的类别,必要的时候还记载一些消息参数。比如,当你在窗体上按下鼠标左键的时候,一条名为WM_LBUTTONDOWN的消息就被生成并加入Windows待处理的消息队列中——大部分情况下Windwos的消息队列里不会有太多的消息在排队、消息会立刻被处理,如果你的计算机很慢并且处在很忙的状态(如播放电影),那么这条消息就要等一会才被处理,这就是常见的操作系统反应延迟。当Windows处理到这条消息时会把消息发送给你单击的窗体,窗体会用自己的一套算法来响应这个消息,这个算法就是Windows API开发中常说的消息处理函数。消息处理函数中有一个多级嵌套的switch结构,进入这个switch结构的消息会被分门别类并最终流入某个末端分支,在这个分支里会有一个由程序员编写函数被调用。例如对于WM_LBUTTONDOWN这个消息,程序员可能会编写一个函数来查看它所携带的参数(即鼠标单击的X、Y坐标),然后决定是把它们显示出来还是在这个点上绘制图形等。也有些消息是不用携带参数的,比如按钮被单击的消息,当它流入某个分支后程序员就已经知道是按钮被单击了,程序员并不关心鼠标点在按钮的哪个位置上了。

上面叙述的过程就是消息触发算法的过程,又称消息驱动。这样一个过程对于想入门Windows开发的人来说门槛太高,对于大型的Windows程序来说开发与维护成本也不低。随着微软面向对象开发平台日趋成熟,微软把消息机制封装成了更容易让人理解的事件模型。

事件模型隐藏了消息机制的很多细节,让程序的开发变得简单。烦琐的消息驱动机制在事件模型中被简化为3个关键点:

1、事件的拥有者:即消息的发送者。事件的宿主可以在某些条件下激发它拥有的事件,即事件被触发。事件被触发则消息被发送。

2、事件的响应者:即消息的接收者、处理者。事件接受者使用其事件处理器(Event Handler)对事件做出响应。

3、事件的订阅关系:事件的拥有者可以随时激发事件,但事件发生后会不会得到响应要看有没有事件的响应者,或者说要看这个事件是否被关注。如果对象A关注对象B的某个事件是否发生,则称A订阅了B的事件。更进一步讲,事件实际上是一个使用event关键字修饰的委托(Delegate)类型成员变量,事件处理器则是一个函数,说A订阅了B的事件,本质上就是让B.Event与A.EventHandler关联起来。所谓事件激发就是B.Event被调用,这时,与其关联的A.EventHandler就会被调用。

事件模型可以用下图的模型作为简要说明:

原文地址:https://www.cnblogs.com/wanghaibin/p/3859235.html