"易语言.尘土"界面库2.0版源代码分析(5):Windows消息路由机制(上)

作者:liigo

原文链接:http://blog.csdn.net/liigo/archive/2010/10/28/5972548.aspx

转载请注明出处:http://blog.csdn.net/liigo

liigo: "易语言.尘土"界面库2.0版源代码分析系列

  很高兴看到"易语言.尘土"界面库这个原创性易语言模块近期又持续升级,版本到2.1了。看来我这个源代码分析系列文章还得继续跟进。这最新一篇,重点关注该界面库内部的Windows消息路由机制。Windows消息(如WM_PAINT)由Windows操作系统产生,发往相应窗口的消息处理函数(WndProc)。依据前面的分析,我们已经知道,消息在模块内部被EDust_WndProc()派发到对应窗口对象的“消息过程()”方法(继承自“_窗口基类”)。接下来Windows消息是如何被处理的呢?本文将揭开谜底。

  我们就从“_窗口基类.消息过程()”入手,看看里面有什么代码:

_窗口基类.消息过程()

  要理解以上代码,最好先搞清楚“事件哈希表”这个类成员变量的作用。从字面上看,它应该是一个哈希表——“键-值”的集合,其“键”是消息值,其“值”是什么呢?是对应该消息的处理子程序吗?按 Ctrl+F 搜索“事件哈希表”,找到了“_窗口基类.挂接事件()”这个类成员方法,代码如下:

_窗口基类.挂接事件()

  从以上代码我们分析得知,“事件哈希表”的“键”为事件类型(Windows消息值),“值”为一个链表——事件处理子程序的集合。很显然,事件处理子程序是由消息处理者提供的,将被类库内部自动调用。那么,事件处理子程序是如何被调用的呢?或者说,Windows消息是如何被处理的呢?让我们的视线回到“_窗口基类.消息过程()”里面调用的“事件链表_处理()”子程序,推测它的功能应该是:循环遍历链表,依次调用对应的事件处理子程序,直到遍历完毕或某事件处理子程序要求结束处理。事件处理子程序被调用,就意味着该消息值(事件)被处理了。事实上后挂接的处理子程序先被调用,即刚才所说的循环遍历链表其实应该是倒序遍历,这个细节今后可能还会涉及,暂时先不贴代码。

  好了,是时候总结一下"易语言.尘土"界面库2.0的事件处理机制(即Windows消息处理机制)了:1、通过“_窗口基类.挂接事件()”把欲处理的消息值及其处理子程序记录下来,记录到类成员变量“事件哈希表”中;2、“_窗口基类.消息过程()”通过查询“事件哈希表”,获取与当前消息值挂接到的事件处理子程序,并调用之。补充一点,可以多次调用“_窗口基类.挂接事件()”把多个事件处理子程序挂接到同一个Windows消息值上,届时“后”挂接的事件处理子程序会“先”被调用,并且后挂接的事件处理子程序可以决定是否调用先前挂接的事件处理子程序。

  以上就是"易语言.尘土"界面库2.0的基本的事件处理机制,也是其消息路由机制的基础部分。除了类库的最终用户可以使用这套事件处理机制处理Windows消息之外,在类库内部,也利用这套事件处理机制做了许多更深入的消息处理,且留待下文分解。

你可能感兴趣的:(windows,.net,Blog,F#)