欢迎来到天天文库
浏览记录
ID:6757800
大小:66.26 KB
页数:7页
时间:2018-01-24
《ucgui 按键窗口切换机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、uCGUI按键窗口切换机制前段时间在做一个窗口项目,这个项目菜单项过多,在管理起来比较麻烦。想做一个高效移植又方便的一个切换机制。后来在网上多方查找这方面资料,但是感觉比较少。后来自己整理出了这个结构,希望对后来朋友有所帮助。 本结构不只局限与按键操作,同时也支持触摸切换,也可以两者共存同时对窗口进行操作。在按键操作过程中我想很多朋友都会遇到窗口焦点问题,内存不足问题等等。这个机制可以尽可能的解决这些问题。 首先先说下这个机制的主要思想。在感官上我们看到是这样子:开一个窗口会覆盖前一个窗口,再开新的窗口就会重复覆盖上一个窗口。而在退出窗口时就是一层一层恢复到前一级的窗口。以此反复
2、。但是在嵌入式系统操作时用这种方式的话,就有点太耗内存了,菜单深度越多那么资源浪费就越多。那要怎么办呢?当然如果我们在进入下一个窗口时销毁上一个窗口就可以有效的解决这个问题。那么退出本级窗口该怎么办呢?其实退出本级窗口和进入新窗口的性质是一样的,只不过这个新窗口是本窗口的前一级而非后一级。 我们的窗口每级每级是怎么连接在一起的呢?这里我采用的树的结构,一个大家很熟悉的模型树——二叉树。为什么用树呢,大家应该都清楚用树有几大好处:1)维护方便,在您的菜单中增加一个窗口或改变一个窗口位置应该是长有的事吧。那么在修改时我们也只需修改树中结点的位置就可以了,而不用改了位置又要去考虑改窗口名顺
3、序等连带操作。当然这样也可以避免很多出错可能;2)合理使用资源,有多少窗口用开多少窗口的结点,而无须预留充足空间以被扩展。当添加新窗口只需在树中追加节点。 下面能过一个图型来地架构进行解说,如下图 首先先说下窗口的规则,我是以元素的右孩子为子菜单,左孩子为水平菜单。 这是我建立的一个简单事例,主窗口是一个码表盘。主窗口的下一层是一个列表窗口,列表窗口的内容是他的下层窗口的名子。“MenuTest”下层有四个菜单,前三个是列表窗口,最后一个是对话框窗口。“MenuTest0”又有7个子菜单,前三个为列表窗口,第四个无窗口,第五个是对话框窗口,第六个是数字轴窗口,第七个是一个
4、电字时钟。有人一定会问:只能在最右一排下建立子窗口吗。当然不是,我只是为了方便都在最右排建立子集,你也可以在MenuTest1或MenuTest2下建立,根据你的窗口需要对组合。完成这个树的建立,只通过了很少代码就完成了。完成这个功能只用了两步,1)建立元素,2)将元素链接到一起。如果我有窗口想一直都在最顶层或有时显示有时不显示,不能和树结构整合到一起怎么办!其实在工程中有WIN_WindowsNumpad一个按键板,他就是一个不依赖在树中的独立窗口。是一个从始至终都会显示的窗口。这些窗口只要独立创建于树外就可以了,他的显示或不显示由你程序操作。 窗口实体就是建立的元素,下面对元素的内
5、容进行详细的介绍: 树中每一个结点的内容如下:typedefstructBiTreeElem{ DATA_TYPE *data; //数据元素 structBiTreeElem *Lift; //窗口标题 structBiTreeElem *Right; //窗口标题}ELEMENT; 数据DATA_TYPE元素所指向的内容如下:typedefconststruct{ constchar *title; //窗口标题 WIN_INFO_TY
6、PE *win; //窗口信息 FunCBType *enter; //窗口进入回调函数 FunCBType *exit; //窗口退出回调函数}MENU_INFO_TYPE;通过注释消息可以看出每个元素的作用。这里需要说的FunCBType类型,这两个是回调函数,本窗口进入时运行*enter所指向的指针函数,退出时执行*exit所指向的数据。如果本窗口不需要执行这两个或其中的一个,可以让其指向0。 WIN_INFO_TYPE*win是窗口的相关消息,包括三个元素
7、,内容如下:typedefconststruct{ void *hWin; //窗口句柄 FunCBType *create; //窗口建立 FunCBType *destroy; //窗口回收}WIN_INFO_TYPE;*create指向特定窗口建立的回调函数,*destroy指向特定窗口销毁
此文档下载收益归作者所有