找回密码
 注册
搜索
查看: 1066|回复: 6

[讨论] 深度剖析MTK------- Hilite和Hint

[复制链接]
发表于 2010-5-6 14:51:25 | 显示全部楼层 |阅读模式
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);
我现在就去找,谁知道的可以先透露下
 楼主| 发表于 2010-5-6 14:58:02 | 显示全部楼层
好像都是类似在CATXXXXX函数里

    SetKeyHandler(wgui_inputs_ml_previous_line, KEY_UP_ARROW, KEY_EVENT_DOWN);
    SetKeyHandler(wgui_inputs_ml_next_line, KEY_DOWN_ARROW, KEY_EVENT_DOWN);
    SetKeyHandler(wgui_inputs_ml_previous_line, KEY_VOL_UP, KEY_EVENT_DOWN);
    SetKeyHandler(wgui_inputs_ml_next_line, KEY_VOL_DOWN, KEY_EVENT_DOWN);
点评回复

使用道具 举报

发表于 2010-5-6 19:07:18 | 显示全部楼层
楼主的意思是所有的按键都放在一个大table里边吗?
我觉得那样的话不方便啊……
还是注册功能和UI紧密点比较好,而不是和key
点评回复

使用道具 举报

发表于 2010-5-6 21:56:27 | 显示全部楼层
顶个 谢谢LZ分析~~~
点评回复

使用道具 举报

发表于 2010-5-7 16:02:17 | 显示全部楼层
顶一下,支持!
点评回复

使用道具 举报

发表于 2010-5-11 18:17:49 | 显示全部楼层
你这个整得太复杂了
MTK 就很好啊 大数组放好handle  你还可以去查询 使用
点评回复

使用道具 举报

发表于 2010-5-12 11:58:23 | 显示全部楼层
一般在模板函数中都会有:register_fixed_list_keys注册方向键。

列表显示的时候
gui_fixed_list_menu_switch_highlighted_item-》m->item_highlighted(m->highlighted_item)-》standard_list_highlight_handler-》MMI_list_highlight_handler(item_index);就调到你用RegisterHighlightHandler注册的函数了
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-2-26 04:35 , Processed in 0.048092 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表