MTK中的hilite,hint函数处理

来源:互联网 发布:1.2算法和算法的描述 编辑:程序博客网 时间:2024/06/08 01:04
 

在进入一个新的Screen的Entry函数中,为什么还要有:    RegisterHighlightHandler()?   我的理解是假设即将进入的SCREEN有3个MENU,每个MENU在该APPLICATION的初始函数中都已经设置了Hilite函数。进入该SCREEN之后,就直接调用设置的Hilite handler就可以了。为什么还要在这里显示的Register??

是不是因为有些SCREEN没有MENU,只有一些索引让用户选择??

自己解答:在一个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之后,注意Hilite Event是内部事件,是由Framework自动调用的。于是当某一MENU highlight时,就调用上面3个函数中的某一个(根据显示的方式来决定调用其中某一个吗?)。由于设置了他们都指向ExecuteCurrHiliteHandler(),因此实际上都是执行这个函数。传递的参数是highlight menu的索引值。(从0开始)。然后调用ExecuteCurrHiliteHandler_Ext(S32 hiliteid)函数。在这个函数中,查找maxHiliteInfo这个全局变量中是否保存了该MENU ID的entryFuncPtr()函数,也就是highlight handler函数。如果有,则执行,可以做一些:改变左键或右键的标签,改变处理函数等等。

 

引申: hint的处理

       如果某个SCREEN中的MENU有一些POP hint信息,那么在一个SCREEN的Entry函数中,有类似这样的函数

ConstructHintsList(MENU_ID_BGSND_CM_OPT_EFFECT, hintList);

这个函数的执行过程是:根据SCREEN的panrent menu ID获取他有N个child menu。然后查找maxHiliteInfo[hiliteItemID[i]].hintFuncPtr是否存在,也就是hint handler。如果存在就执行一次(目的是更新hintData【】里面的提示信息),然后把hintData【】里面的信息拷贝到hintList中。如果某个MENU没有hint handler,那么hintList中对应项就为NULL。

最后,在ShowCategoryXXScreen()的时候,把hintList设为参数就可以了。

注意:highlight handler AND hint handler都是在初始化函数中设置好的。

 

     本文章为自己刚接触MTK时的学习笔记,如有错误,请不吝赐教!谢谢

原创粉丝点击