<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                                                       EntryNewScreen 函数解析

函数原型:

U8 EntryNewScreen(U16 newscrnID, FuncPtr newExitHandler, FuncPtr newEntryHandler, void *flag);

参数 newscrnID 屏幕 ID 的唯一标识,每一个屏幕对应一个 ID

参数 newExitHandler 屏幕退出函数。

参数 newEntryHandler :屏幕入口函数。

参数 flag 。一般为 NULL 。其实他是用来标识屏幕的类型的。屏幕有以下几种:

MMI_FRM_FULL_SCREEN,

MMI_FRM_SMALL_SCREEN,

MMI_FRM_TAB_PAGE

此函数用来创建一个新屏幕,当调用 EntryNewScreen 函数时,程序会做以下工作。

1、 会执行函数 ExecuteCurrExitHandler(); 执行上一个屏幕的退出函数,并把上一个屏幕加入屏幕历史栈中。代码如下:

 
InBlock.gif if (curr_entry_handler)
InBlock.gif{
InBlock.gif     //在这里将屏幕加入历史屏幕栈。
InBlock.gif     mmi_frm_generic_exit_scrn(currExitScrnID, curr_entry_handler);
InBlock.gif}
InBlock.gif
InBlock.gif if (curr_exit_handler)
InBlock.gif{
InBlock.gif     MMI_TRACE(MMI_FW_TRC_G1_FRM, TRC_MMI_FRM_EVENT_ENTRYNEWSCR_EXIT_HDLR);
InBlock.gif     mmu_frm_execute_scrn_exit_handler = MMI_TRUE;
InBlock.gif     //在这里执行屏幕退出函数
InBlock.gif     curr_exit_handler(curr_exit_scrn_arg_p);
InBlock.gif     mmu_frm_execute_scrn_exit_handler = MMI_FALSE;
InBlock.gif}
InBlock.gifcurr_entry_handler = NULL;
InBlock.gifcurr_exit_handler = NULL;
 
从代码可以看出,如果上个屏幕的入口函数 curr_entry_handler == NULL 的话,是不会被加入屏幕历史栈的。但可以在退出函数中手动将屏幕加入屏幕历史栈。如果的退出函数 curr_exit_handler 也为 NULL ,那么上个屏幕就不会被加入屏幕历史栈。   

       所以将一个屏幕加入屏幕历史栈有两种方法:

①    传入屏幕入口函数。

②    传入退出函数,并在退出函数中定义代码手动加入屏幕历史栈。

这两种方法不可同时进行。否则会添加两次。如果需要同时传入屏幕入口函数和退出函数的话,我们只需在退出函数中不写加入屏幕历史栈的代码即可。

 

2、 设置当前屏幕入口函数和退出函数,并保存屏幕 ID ,及信息。

 
InBlock.gifcurrExitScrnID = new_scrn_id;
InBlock.gif
InBlock.gif if (curr_entry_scrn_arg_p != NULL)
InBlock.gif{
InBlock.gif        curr_exit_scrn_arg_p = curr_entry_scrn_arg_p;
InBlock.gif        curr_entry_scrn_arg_p = NULL;
InBlock.gif}
InBlock.gif
InBlock.gif if ((new_exit_handler != NULL) || (new_entry_handler != NULL))
InBlock.gif{
InBlock.gifmmi_frm_set_generic_exit_handler(new_scrn_id,new_exit_handler,new_entry_handler);
InBlock.gif}
InBlock.gif
InBlock.gifmmi_frm_dump_screen_id();

 
OK ,至此 EntryNewScreen 任务完工 ~

       EntryNewScreen 的对应一个函数是 GoBackHistory 。这个函数用于删除当前屏幕历史栈栈顶的屏幕,并进入上个屏幕。同样具有删除屏幕历史的另外一个函数为 DeleteScreenIfPresent 。这个函数只是用于从屏幕历史栈删除指定 ID 的屏幕,而不进入任何其他屏幕。