菜单的显示和隐藏 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

看到标题,你可能会在心里大骂,“这家伙太闲了,又总结这些小儿科的东西了。”其实不是的,虽然我们平时对于菜单的显示和隐藏只需用两个函数就可以了。
InBlock.gif void mmi_frm_hide_menu_item(U16 menu_item_id);
InBlock.gif void mmi_frm_unhide_menu_item(U16 menu_item_id);

并且还用的不亦乐乎。因为他们基本可以解决所需。但其实这里还是有一些知识存在的,触犯了它们,你可能会遇到不可思议的错误。

原理

InBlock.gif static U8 MenuItemMask[(MAX_MENU_ITEMS_VALUE / 8) + 1];
 
MTK定义了如上一个能容下所有菜单ID的大静态数组来保存菜单的状态,每个菜单对应一位,当菜单调用函数mmi_frm_hide_menu_item被隐藏后,对应的位会被置1。之后我们可以通过函数:
InBlock.gifMMI_BOOL mmi_frm_test_menu_item_hide(U16 menu_item_id);
来获得菜单的状态,返回 MMI_TRUE 代表菜单处于隐藏状态,否则为显示状态。 OK ,下面我们来解释为什么隐藏菜单后,屏幕上就不显示该菜单了。显示菜单屏幕的模板都会用到两个重要的函数:
InBlock.gifU16 GetNumOfChild_Ext(U16 menu_item_id);
InBlock.gifU16 GetSequenceStringIds_Ext(U16 parent_item_id, U16 *StringIds);
前者用于获得指定菜单的子菜单的个数,后者用于获得子菜单的字符串 ID 。在这两个函数中都通过调用函数 mmi_frm_test_menu_item_hide 过滤掉了隐藏的菜单。这样在菜单屏幕显示的时候就不显示隐藏的菜单了。

另外和这两个函数类似的有另外两个函数:

InBlock.gifU16 GetNumOfChild(U16 ItemId);
InBlock.gif void GetSequenceStringIds(U16 ParentItemId, U16 *StringIds);
 
这两个函数中没有调用函数mmi_frm_test_menu_item_hide进行过滤。所以如果我们在有的地方使用这两个函数不但可能起不到隐藏的作用,而且还有可能会出现以下错误。

①      不同父菜单的隐藏

如果我们进入的两个界面中的菜单,父菜单不同,但他们的子菜单中有着共同的菜单A,如果在一个界面中隐藏掉了A,那么在另外一个界面中A不会被隐藏,但高亮函数会出错。

因为这两个函数无法起到隐藏的作用。而在获得高亮函数时又考虑到了隐藏的效果,因此会使最后获得的高亮函数下移。即下面菜单的高亮函数。