开源那些事儿(三)-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 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架