Ginger GUI基类菜单的优化设计

时间:2022-10-19 04:56:38

Ginger GUI基类菜单的优化设计

摘要:Ginger GUI是美国卓然公司推出的DVD OSD系统,功能强大,易于实现,但其菜单设计中存在一些缺陷,当有多个菜单时可能出现系统错误,文章分析了系统基类菜单存在的问题,并针对问题提出了优化解决方案。

关键词:DVD;Ginger GUI;菜单;活动;冻结;属性;索引

中图分类号:TP391 文献标识码:A文章编号:1007-9599 (2011) 08-0000-02

The Optimization Design of Ginger GUI Base Class Menu

Zhang Hongtao

(Shijiazhuang Engineering School,Shijiazhuang050067,China)

Abstract:Ginger GUI is launched in United States Zoran DVD OSD system,a powerful,easy to implement,but the menu design has some shortcomings,when there are multiple menu system errors that may arise,the paper analyzed the system-based problems in class menu And problem-optimized solutions.

Keywords:DVD;Ginger GUI;Menu;Activities;Freezing;Property;Index

DVD系统中的图形用户界面系统是人机交互的中介,好的用户界面设计反应速度快,占用资源低,拥有很好的移植和维护特性。随着系统的复杂度增加,图象形户界面系统的设计也越来越复杂,设计和维护日趋复杂的界面系统占用了工程师大量的时间。如何实现满足客户要求的GUI系统,使其有效利用硬件资源,有效利用软件系统的能力,最终取得商业目标上的成功,成为许多DVD生产厂家面对的难题。

美国卓然公司推出的基于i96芯片的Ginger GUI系统,占用内存小,具有面向对象和消息驱动的特性,易于维护,一经推出,迅速占据市场,受到了客户的欢迎。

Ginger GUI的参考设计中有三个菜单,当有的客户增加新的菜单时,有时会出现死机状态。经过分析是由以下原因造成的:

菜单具有两种状态:活动状态和冰冻状态,可以对处于活动状态的菜单进行冰冻,这样菜单的内容就被移动到片上内存中,对处于冰冻状态的菜单进行解冻就是把菜单的内容从片上内存移回RAM中。在系统运行的过程中,同一时间只有一个菜单处于活动状态,可以有多个菜单处于冰冻状态。处于活动状态的菜单同时具有焦点属性。

菜单类的声明给出如下:

typedef MSO-CONTAINER MSO-MENU;

可以看出菜单类与容器类结构相同,其属性中有两个表明菜单的当前焦点状态:MS-ATTR-PREV-FOCUS和MS-ATTR-FOCUS,如果当前活动的菜单被冰冻起来,新的菜单被打开时,新菜单具有MS-ATTR-FOCUS属性,而原来活动的菜单将具有

MS-ATTR-PREV-FOCUS属性。当关闭新菜单时,GUI系统发现有冰冻状态的菜单存在,就在其中查找具有MS-ATTR-PREV-FOCUS属性的菜单,把它解冻,使其运行。

如果系统中有多个菜单处于冰冻状态时,这时连续关闭两个以上的菜单,则系统中有冰冻菜单存在,却没有具有MS_ATTR_PREV_FOCUS属性的菜单,系统无法打开菜单,就处于死机状态了。

针对上述情况,我们对原菜单基类进行如下修改:

1.修改菜单基类的结构,新菜单基类的结构声明如下:

typedef struct{

MSO-CONTAINER mo Container;

UINT8 mc Menu Index;

UINT8 mc Parameter Reserved;

}MSO-MENU;

Mc Menu Index用来记录菜单的先后顺序,由于编译规定是16位对齐,可以定义了一个八位的亚元变量留作将来扩展使用。

然后定义如下的宏:

#define MENU-INDEX-NEW (MENU-INDEX-ACTIVE-1)

#define MENU-INDEX-ACTIVE 1

#define MENU-INDEX-2ND-IN-LIST 2

具有焦点属性的菜单的索引值为1,其他菜单的索引值越小,排列越靠前。索引值为0的菜单是刚刚打开的菜单。

在菜单的打开,关闭,和冰冻操作中,系统会动态的更新索引菜单链表的索引值。使其按打开的先后顺序排列。

在打开一个菜单的操作后,索引值的更新方法如下。

图1.菜单打开时索引值更新流程图

在关闭一个菜单后,把链表中每个比当前菜单的索引值大的菜单的索引值减1,代码如下:

if(c Menu Index Closed!=MENU-INDEX-ACTIVE)

{

MSO-OBJECT-NEAR*p Object;

P Object=((MSO-CONTAINER*)gp Screen)->mp Olist;

while(NULL!=p Object)

{

if(MS-Is Menu(p Object)&(((MSO-MENU*)p Object)->mc Menu Index

>c Menu Index Closed))

((MSO-MENU*)p Object)->mc Menu Index--;

P Object=p Object->mp Next;

}

}

在冰冻一个菜单后,所有链表内的菜单的索引值增加1,代码如下:

{

MSO-OBJECT-NEAR*p Object;

P Object=((MSO-CONTAINER*)gp Screen)->mp Olist;

while(NULL!=p Object)

{

if(MS-Is Menu(p Object))

((MSO-MENU*)p Object)->mc Menu Index++;

P Object=p Object->mp Next;

}

}

通过上述过程,菜单在每次发生变动时,其在链表中的顺序都被动态调整。这样,系统中打开菜单的数量就不再受到限制。

参考文献:

[1]Janardhan V,Schulzrinne H Peer assisted VoD for set-top box based IP network.2007

[2]By Jasmin Blanchette,Mark Summerfield.C++GUI Programming with Qt 4 Prentice Hall.June 21,2006

[3]张素文,贺玮,刘明兰.基于OSD的数字机顶盒用户界面设计[J].机器视觉,2006,11

[4]李政莲,李翔熙.图形菜单显示装置和用于在其上显示菜单的方法[J].专利公开号CN1832547A.

[5]陈宁伟.电视机OSD菜单显示方法,专利公开号CN1798289A,2006

[6]彭静,张维勇,李洋.基于嵌入式系统的GUI软件开发包的设计与实现[J].合肥工业大学学报(自然科学版),2009,4

“本文中所涉及到的图表、公式、注解等请以PDF格式阅读”

上一篇:一种改进的Grid-P2P模型 下一篇:图像复原技术研究