开源那些事儿(三)-iToday的总体设计

本文讲述iToday总体设计的第一版本。

UML 图

iToday-design-1

PanelManager

iToday的主程序只是包含PanelManager,主窗口线程的消息循环接收到的所有消息都传递给PanelManager来处理,iToday主程序不做任何业务逻辑处理。

 

PanelManager有三个主要的成员变量,其中Panels表示所有Panel的指针的容器,保存是指向PanelBase的指针,对象为各个具体的Panel对象。而ActivePanel为指向当前活动Panel的指针。Swither是特殊的Panel,单独一个对象,不在map容器里面。

 

消息事件处理

主窗口线程接收到任何事件都给PanelManager处理,而PanelManager又分发给ActivePanel和Swither来处理。所有继承于抽象类PanelBase的具体Panel类需要重载虚函数ProcessMouseDownEvent(),ProcessMouseUpEvent(),ProcessOtherEvents()和ProcessGesture()来处理事件和消息。如果是鼠标事件,ActivePanel和Swither会根据内部判断是否自己区域,不是就不用处理了。而具体Panel类根据需要可以调用PanelManager的Draw()函数,直接要求重画,为了做动画过程。

 

绘画

iToday的绘画由PanelManager的Draw()函数负责,由两部分组成,ActivePanel和Swither的绘画组成了整个iToday的绘画过程。PanelManager的Draw()的过程是这样的,分别调用 ActivePanel和Swither的PrepareDraw(),ActivePanel和Swither只是把需要画的画到内存内。然后由PanelManager一次画到真实设备,这里使用了双缓冲。以此,所有继承于抽象类PanelBase的具体Panel类需要根据当前的自己的需求去重载PrepareDraw()函数,把信息画到内存去。

 

如何开发新Panel

这个框架的原则是新增Panel的时候,PanelManager只是在初始化加载Panel的地方进行更改,不用更改任何消息处理和绘画过程。PanelManager和具体的Panel类解耦。开发具体的Panel类,需要重载事件函数ProcessMouseDownEvent(),ProcessMouseUpEvent(),ProcessOtherEvents()和ProcessGesture(),具体的Panel类可以自定义自己的事件,例如HomePanel可以自己定义监控注册表消息事件,PanelManager完全不需要进行更改来支持这自定义事件。同时需要重载PrepareDraw()来画自己的逻辑。

 

请根据具体Panel的需求来考虑这个框架是否完善,有任何意见请及时反馈,及时改进。

 

其他iToday的文章请看:

开源(Open Source)那些事儿 (一)

开源那些事儿 (二) - iToday开源项目计划

作者:Jake LinJake's Blog on 博客园
出处:http://procoder.cnblogs.com

作品Jake Lin创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言
posted @ 2010-02-09 15:30 Jake Lin 阅读(2452) 评论(8) 编辑 收藏

 回复 引用 查看   
#1楼 2010-02-09 13:38 gzuroy      
果然有效率啊,沙发我抢了。
 回复 引用 查看   
#2楼[楼主] 2010-02-09 13:45 Jake Lin      
谢谢 长工 同学的提醒,MouseMove事件处理函数,可能在做的时候需要加上。
 回复 引用 查看   
#3楼[楼主] 2010-02-09 13:47 Jake Lin      
UML图是starUML画的,开源的工具。
 回复 引用 查看   
#4楼 2010-02-09 14:09 Sunny Peng      
引用Jake Lin:UML图是starUML画的,开源的工具。

支持楼主。
我也开始学习使用UML了,用Enterprise Architect。

 回复 引用 查看   
#5楼 2010-02-09 20:40 王克伟      
辛苦Jake
 回复 引用 查看   
#6楼 2010-02-10 18:14 SmartJJ      
现在用了GDI开发,以后显示Engine换其它,代码大部分要重写吧? 还是现在就架构好了
 回复 引用 查看   
#7楼[楼主] 2010-02-10 19:07 Jake Lin      
@SmartJJ
需要重写,现在没有经验,我做不出能兼容以后版本的框架,希望有经验的朋友能帮忙指点指点。

 回复 引用 查看   
#8楼 2010-02-10 23:02 SmartJJ      
@Jake Lin
你们很厉害,甚是佩服O(∩_∩)O。。现在才刚刚开始,慢慢摸索吧~~大家交流交流