菜单的显示和隐藏

                                                                 菜单的显示和隐藏
看到标题,你可能会在心里大骂,“这家伙太闲了,又总结这些小儿科的东西了。”其实不是的,虽然我们平时对于菜单的显示和隐藏只需用两个函数就可以了。
void mmi_frm_hide_menu_item(U16 menu_item_id);
void mmi_frm_unhide_menu_item(U16 menu_item_id);
并且还用的不亦乐乎。因为他们基本可以解决所需。但其实这里还是有一些知识存在的,触犯了它们,你可能会遇到不可思议的错误。
原理
static U8 MenuItemMask[(MAX_MENU_ITEMS_VALUE / 8) + 1];
 
MTK 定义了如上一个能容下所有菜单 ID 的大静态数组来保存菜单的状态,每个菜单对应一位,当菜单调用函数 mmi_frm_hide_menu_item 被隐藏后,对应的位会被置 1 。之后我们可以通过函数:
MMI_BOOL mmi_frm_test_menu_item_hide(U16 menu_item_id);
来获得菜单的状态,返回 MMI_TRUE 代表菜单处于隐藏状态,否则为显示状态。 OK ,下面我们来解释为什么隐藏菜单后,屏幕上就不显示该菜单了。显示菜单屏幕的模板都会用到两个重要的函数:
U16 GetNumOfChild_Ext(U16 menu_item_id);
U16 GetSequenceStringIds_Ext(U16 parent_item_id, U16 *StringIds);
前者用于获得指定菜单的子菜单的个数,后者用于获得子菜单的字符串 ID 。在这两个函数中都通过调用函数 mmi_frm_test_menu_item_hide 过滤掉了隐藏的菜单。这样在菜单屏幕显示的时候就不显示隐藏的菜单了。
另外和这两个函数类似的有另外两个函数:
U16 GetNumOfChild(U16 ItemId);
void GetSequenceStringIds(U16 ParentItemId, U16 *StringIds);
 
这两个函数中没有调用函数 mmi_frm_test_menu_item_hide 进行过滤。所以如果我们在有的地方使用这两个函数不但可能起不到隐藏的作用,而且还有可能会出现以下错误。
       不同父菜单的隐藏
如果我们进入的两个界面中的菜单,父菜单不同,但他们的子菜单中有着共同的菜单 A ,如果在一个界面中隐藏掉了 A ,那么在另外一个界面中 A 不会被隐藏,但高亮函数会出错。
因为这两个函数无法起到隐藏的作用。而在获得高亮函数时又考虑到了隐藏的效果,因此会使最后获得的高亮函数下移。即下面菜单的高亮函数。
 

你可能感兴趣的:(职场,MTK,休闲,菜单隐藏,菜单显示)