|
Hilite和Hint的作用
1:选中某项时的操作提示的更改,
2:按键处理,一般LSK是进入SUB MENU或者操作提示的状态(ON OFF)等等
3:显示状态值(ON OFF)
个人认为这个其实应该放在按键处理函数里。
比如每种类型的ITEM对应某种类型的按键操作
比如那种只要左右键调整的
KeyActionMap code AdjustKeyMap[] =
{
{KEY_LEFT, MIA_DECVALUE},
{KEY_RIGHT, MIA_INCVALUE},
{KEY_UP, MIA_NOTHING},
{KEY_DOWN, MIA_NOTHING},
{KEY_LEFT_REP, MIA_DECVALUE},
{KEY_RIGHT_REP, MIA_INCVALUE},
{KEY_UP_REP, MIA_NOTHING},
{KEY_DOWN_REP, MIA_NOTHING},
{KEY_LSK, MIA_NOTHING},
{KEY_RSK, MIA_NOTHING},
{KEY_INVALID, MIA_NOTHING},
};
没有选项,按LSK进入下级菜单的
KeyActionMap code NaviKeyMap[] =
{
{KEY_LEFT, MIA_NOTHING},
{KEY_RIGHT, MIA_NOTHING},
{KEY_UP, MIA_NOTHING},
{KEY_DOWN, MIA_NOTHING},
{KEY_LEFT_REP, MIA_NOTHING},
{KEY_RIGHT_REP, MIA_NOTHING},
{KEY_UP_REP, MIA_NOTHING},
{KEY_DOWN_REP, MIA_NOTHING},
{KEY_LSK, MIA_SUB_PAGE},
{KEY_RSK, MIA_RETURN},
{KEY_INVALID, MIA_NOTHING},
};
按键处理可以专门做一个函数,放在MMI_TASK里,具体放哪里,有待研究。
在这个函数里,根据当前菜单的ID找到MIA_xxx,执行对应的功能。而不用把这些在开机初始化时注册了
言归正传:
-----------------------
1:正方向
开机初始化时调用POPULATE函数,注册信息
void PopulateSettingMenuRes(void)//PopulateSettingMenuRes
{
ADD_APPLICATION_MENUITEM_HILITE_HANDLER(MENU_ID_MAIN_PHONESETTING, HighlightPhnsetScr);
ADD_APPLICATION_MENUITEM_HILITE_HANDLER(MENU_ID_MAIN_TIME_DATA, HighlightPhnsetTimeAndDate);
......................
}
看看ADD_APPLICATION_MENUITEM_HILITE_HANDLER到底是做了什么
#define ADD_APPLICATION_MENUITEM_HILITE_HANDLER(MenuID, HiliteHandler)
RES_PRINT_INFO("ADD HILITE HANDLER\t(%s [%d])...\n", __FILE__, __LINE__);
SetMenuHiliteHandler(MenuID, #MenuID, #HiliteHandler); RES_PRINT_INFO("\tdone.\n");
也就是说开机的过程,其实就是把菜单ID和对应的高亮函数赋给变量nMenuHiliteHandlers[MenuID]。
void SetMenuHiliteHandler(U16 MenuID, S8 *MenuIDEnum, S8 *FuncName)
{
。。。。。。
nMenuHiliteHandlers[MenuID].nMenuItemId = MenuID;
strncpy(nMenuHiliteHandlers[MenuID].MenuItemIdEnum, MenuIDEnum, MAX_MENUID_ENUM);
strncpy(nMenuHiliteHandlers[MenuID].HiliteFuncName, FuncName, MAX_HANDLER_NAME);
HiliteHdlrCount++;
}
2:反方向
-------------
在一个Entry函数中,注册:RegisterHighlightHandler(ExecuteCurrHiliteHandler);
void RegisterHighlightHandler(void (*f) (S32 item_index))
{
MMI_list_highlight_handler = f;
MMI_matrix_highlight_handler = f;
MMI_circular_3D_highlight_handler = f;
}
实际上就是把以上3个函数指针都指向ExecuteCurrHiliteHandler()这个函数。
当进入新的Screen之后,当某一MENU highlight时,
就调用上面3个函数中的某一个(根据显示的方式来决定调用其中某一个)。
打个比方,就好比要打败敌人,你可以用刀(MATRIX),也可以用枪(LIST),也可以用鞭子(circular),
无论哪种兵器,目的只有一个,战胜敌人(执行高亮函数ExecuteCurrHiliteHandler,其实是执行ExecuteCurrHiliteHandler_Ext)
传递的参数是highlight 的ITEM索引值。(从0开始)。
最后来看看void ExecuteCurrHiliteHandler_Ext(S32 hiliteid)到底做了什么?
获取当前ITEM序号
hiliteItemID = GetSeqItemId_Ext((U16) currParentID, (S16) hiliteid);
获取当前要执行的函数INDEX
currFuncPtr = mmi_frm_get_hilite_hdlr((U16)hiliteItemID);
执行该高亮函数
if (currFuncPtr)
{
(*currFuncPtr) ();
}
3:
现在问题来了,正方面和反方向的结合点在哪里呢?上下键选择菜单项是怎么操作的?
正方向注册信息
nMenuHiliteHandlers[MenuID].nMenuItemId = MenuID;
strncpy(nMenuHiliteHandlers[MenuID].MenuItemIdEnum, MenuIDEnum, MAX_MENUID_ENUM);
strncpy(nMenuHiliteHandlers[MenuID].HiliteFuncName, FuncName, MAX_HANDLER_NAME);
反方向获得信息
hiliteItemID = GetSeqItemId_Ext((U16) currParentID, (S16) hiliteid);
currFuncPtr = mmi_frm_get_hilite_hdlr((U16)hiliteItemID);
我现在就去找,谁知道的可以先透露下 |
|