<?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();
执行上一个屏幕的退出函数,并把上一个屏幕加入屏幕历史栈中。代码如下:
if (curr_entry_handler)
{
//在这里将屏幕加入历史屏幕栈。
mmi_frm_generic_exit_scrn(currExitScrnID, curr_entry_handler);
}
if (curr_exit_handler)
{
MMI_TRACE(MMI_FW_TRC_G1_FRM, TRC_MMI_FRM_EVENT_ENTRYNEWSCR_EXIT_HDLR);
mmu_frm_execute_scrn_exit_handler = MMI_TRUE;
//在这里执行屏幕退出函数
curr_exit_handler(curr_exit_scrn_arg_p);
mmu_frm_execute_scrn_exit_handler = MMI_FALSE;
}
curr_entry_handler = NULL;
curr_exit_handler = NULL;
{
//在这里将屏幕加入历史屏幕栈。
mmi_frm_generic_exit_scrn(currExitScrnID, curr_entry_handler);
}
if (curr_exit_handler)
{
MMI_TRACE(MMI_FW_TRC_G1_FRM, TRC_MMI_FRM_EVENT_ENTRYNEWSCR_EXIT_HDLR);
mmu_frm_execute_scrn_exit_handler = MMI_TRUE;
//在这里执行屏幕退出函数
curr_exit_handler(curr_exit_scrn_arg_p);
mmu_frm_execute_scrn_exit_handler = MMI_FALSE;
}
curr_entry_handler = NULL;
curr_exit_handler = NULL;
从代码可以看出,如果上个屏幕的入口函数
curr_entry_handler == NULL
的话,是不会被加入屏幕历史栈的。但可以在退出函数中手动将屏幕加入屏幕历史栈。如果的退出函数
curr_exit_handler
也为
NULL
,那么上个屏幕就不会被加入屏幕历史栈。
所以将一个屏幕加入屏幕历史栈有两种方法:
①
传入屏幕入口函数。
②
传入退出函数,并在退出函数中定义代码手动加入屏幕历史栈。
这两种方法不可同时进行。否则会添加两次。如果需要同时传入屏幕入口函数和退出函数的话,我们只需在退出函数中不写加入屏幕历史栈的代码即可。
2、
设置当前屏幕入口函数和退出函数,并保存屏幕
ID
,及信息。
currExitScrnID = new_scrn_id;
if (curr_entry_scrn_arg_p != NULL)
{
curr_exit_scrn_arg_p = curr_entry_scrn_arg_p;
curr_entry_scrn_arg_p = NULL;
}
if ((new_exit_handler != NULL) || (new_entry_handler != NULL))
{
mmi_frm_set_generic_exit_handler(new_scrn_id,new_exit_handler,new_entry_handler);
}
mmi_frm_dump_screen_id();
if (curr_entry_scrn_arg_p != NULL)
{
curr_exit_scrn_arg_p = curr_entry_scrn_arg_p;
curr_entry_scrn_arg_p = NULL;
}
if ((new_exit_handler != NULL) || (new_entry_handler != NULL))
{
mmi_frm_set_generic_exit_handler(new_scrn_id,new_exit_handler,new_entry_handler);
}
mmi_frm_dump_screen_id();
OK
,至此
EntryNewScreen
任务完工
~
!
与
EntryNewScreen
的对应一个函数是
GoBackHistory
。这个函数用于删除当前屏幕历史栈栈顶的屏幕,并进入上个屏幕。同样具有删除屏幕历史的另外一个函数为
DeleteScreenIfPresent
。这个函数只是用于从屏幕历史栈删除指定
ID
的屏幕,而不进入任何其他屏幕。
转载于:https://blog.51cto.com/ihome/395341