一步一步实现自己的模拟控件(1)——消息驱动设计
目标:
实现一套windows下简单且可扩展的抽象模拟控件内核。
抽象模拟控件:
我们将windows系统的窗口客户区作为模拟控件的容器,每个模拟控件就是其中的一个抽象矩形区域,并且能够模拟控件进行递归嵌套。控件支持基本的鼠标和键盘消息,能够在窗口大小改变时进行布局。
分析:
因为我们要实现的是抽象的模拟控件,不是真正的窗口控件,那么就需要将窗口消息适时派发到相应控件。下面以一个图来规划窗口消息的流向。
在这个图上我们可以看到除了我们的控件体系以外还需要实现几个核心模块来驱动控件。他们分别是:消息驱动、消息过滤、消息转换。消息驱动通过某种方法截获窗口消息(图上使用thunk),然后将窗口消息交给过滤器进行过滤(因为模拟控件不是所有窗口消息都感兴趣),消息过滤出控件感兴趣的消息交给消息转换器,其他消息交还给窗口的原有窗口过程进行处理(此处要注意的是消息过滤后控件感兴趣的消息不会再回到原窗口过程)。消息转换器将窗口消息转换为控件消息,之所以要进行转换是因为控件体系可能支持的消息系统会有别于窗口消息,也可能需要进行坐标映射等。
图上还能看到,我们的控件是能够递归嵌套的。每个窗口对应一个根控件,所有的控件都是在这个根组件之中的。为了要能够使用窗口的整个客户区,那么根组件所处区域就是窗口的整个客户区。
现在我们要开始进行设计了,设计过程中将引入代码,代码将随着设计的演化进行演化,最终形成我们这个简单且可扩展的抽象模拟控件核心。
By Evil.Ghost