开源那些事儿(三)-iToday的总体设计
本文讲述iToday总体设计的第一版本。
UML 图
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的文章请看:
出处:http://procoder.cnblogs.com
本作品由Jake Lin创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言。