|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-1-17 11:44:14
|
显示全部楼层
需要说明几点:这个GUI将桌面当作一个特殊的Window来控制,它也有他的回调函数,所以可以修改这个回调函数来美化桌面,整个GUI
没有用SRAM存储图像,所有的窗口操作全部基于消息机制和回调函数,所以在删除一个Window和将一个Window翻到最顶层时可能会很费
时间,这一点有待优化,当前删除Window时和将一个Window翻到最顶层时用的重画策略是给每一个剩下的Window发送一个
GUI_WININVALID_SYS 消息到其消息队列中。每个以创建Window都有一个私有的数据结构-> "WCB"即 Window Control Block 这个思想和
命名方式借用了uC/OS 。所有已创建的Window的WCB组成了一个有序链表,注意它是有序的,因为桌面上的Window有层次之分所以越靠下
层的Window的WCB在链表中越靠前,这是为了GUI的一个核心函数 void GUI_SendMSGToCallBack(void) 在定时检索WCB中消息队列中的消
息并将消息发给Window 的 callback 时方便而定的结构,也就是说如果所有Window都需要修改客户区的内容那就会是最底层的Window先
修改然后一层一层往上。 新建一个Window时其总是出现在最顶层,可以用void GUI_ChangeWindowToTop(INT8U ID) 这个函数来把一个
Window置为最高层,ID 为要操作Window的ID。整个GUI的窗口管理采用集中的管理方法: GUI 有两个核心函数
void GUI_WindowManager(void) 和 void GUI_SendMSGToCallBack(void) 这两个函数总是同步执行 WindowManager 在前
SendToCallBack 在后,且都在一个固定的时间点执行(就像uC/OS中的 Tick),且都加入了一个状态变量使其不可重入。
WindowManager 每次依次检查已建Window的状态并转换为消息放置在对应Window的消息队列里,然后SendMSGToCallBack 依次检查每个
Window 的消息队列是否为空,如果不是就将消息作为这个Window的CallBack函数的输入参数并调用这个CallBack(相当于发信息)
CallBack 根据消息进行一些操作:比如画图,输出文字。。。。。。 。也就是说所有的显示器操作在SendMSGToCallBack函数内完成
且下一轮的void GUI_WindowManager(void) 和 void GUI_SendMSGToCallBack(void) 函数的执行在上一轮的SendMSGToCallBack函数没
有返回前不会开始。 Window Create, Window Delete 等用户可操作的函数都只是改变Window的状态而此状态会在下一轮的
GUI_WindowManager 函数的执行中被识别
最后 这个GUI可以由用户规定最多可用多少Window 每个Window消息队列有多长,以及使用多大的显示器。 |
|