应用GROUP
MMI_ID mmi_frm_group_create (MMI_ID parent_id, MMI_ID group_id, mmi_proc_func proc, void *user_data)
MMI_ID mmi_frm_group_enter (MMI_ID group_id, mmi_group_enter_flag flag)
例如:
mmi_frm_group_create(GRP_ID_ROOT, APP_BARCODEREADER, mmi_barcodereader_cui_event_proc, NULL);
mmi_frm_group_enter(APP_BARCODEREADER, MMI_FRM_NODE_SMART_CLOSE_FLAG);
其中函数proc 会对各种事件作出处理,常见事件有
enum
{
EVT_ID_GROUP_FIRST_ENTRY,
EVT_ID_GROUP_ACTIVE,
EVT_ID_GROUP_INACTIVE,
EVT_ID_GROUP_DEINIT,
EVT_ID_SCRN_DELETE_REQ,
EVT_ID_SCRN_DEINIT
};
事件的结构为
#define MMI_EVT_GROUP_PARAM_HEADER
MMI_EVT_PARAM_HEADER
mmi_id sender_id;
#define MMI_EVT_PARAM_HEADER
U16 evt_id;
U16 size;
void *user_data;
我们还可以为事件的结构加以延伸,加上我们自己的需要的事件的特性,例如:
typedef struct
{
MMI_EVT_GROUP_PARAM_HEADER
S32 result;
U16 store_index;
U8 field_type;
} cui_phb_save_contact_result_struct;
具体使用举例如下:
cui_phb_save_contact_result_struct evt;
evt.evt_id = EVT_ID_PHB_SAVE_CONTACT;
evt.size = sizeof(cui_phb_save_contact_result_struct);
https://www.doczj.com/doc/9d3031257.html,er_data = NULL;
evt.sender_id = g_mmi_phb_save_contact_p->sg_id;
evt.result = result;
evt.store_index = store_index;
evt.field_type = g_mmi_phb_save_contact_p->highlight_type;
每个应用中,可能含有一个或者几个场景,如是要定义每个场景的ID,当有每个场景的事件发生时,执行相应的事件函数。
写到这里,我们可能想知道到底在什么地方,这些事件函数会发生。
mmi_frm_group_enter_ex(),//应用进入,通过注册按键
mmi_frm_group_close_ex(),//应用退出,通过注册按键
scenario_process_post_evt_ex(),//场景改变时
发送事件到proc函数
mmi_frm_scrn_send_to_parent(),//子节点向父节点发送事件,通过定时器回调函数L4CallBackTimer
mmi_frm_group_send_to_parent(),
会执行proc函数,执行相应事件。
几个重要的函数
void StartTimer(U16 timerid, U32 delay, FuncPtr funcPtr)//设置队列性定时器事件,发送定时器事件到事件队列里,MMI_TASK读取事件并执行
SetProtocolEventHandler(func, event);//设置协议事件,,发送协议事件到事件队列里,MMI_TASK读取事件并执行
MMI_FRM_INIT_EVENT(&event, event_id);//初始化事件结构
如果应用中下一个场景与上一个场景无关时,通过函数mmi_ret mmi_frm_scrn_close (MMI_ID parent_id, MMI_ID scrn_id)结束上个屏幕。
进入新屏幕:mmi_frm_create_new_screen()
mmi_imui_send_message
mmi_imc_send_message
mmi_input_box_m
sg_call_back_inline
mmi_input_box_msg_call_back_inline_text
//单行显示字符,光标,背景
gui_draw_single_line_one_line
gui_draw_single_line_character
gui_handle_single_line_cursor
gui_draw_single_line_highlight
//多行显示字符,光标,背景
gui_draw_multi_line_one_line
gui_draw_multi_line_single_character
-----------------------------------------------------------------------------------------------
1、group的定义
定义group ID和定义Screen ID一样
在XXX.res 中定义
<SCREEN id="GRP_ID_MYAPP_5"/>//group id
<SCREEN id="GRP_ID_MYAPP_6"/>//group id
<SCREEN id="SCR_ID_MYAPP_5"/>//screen id
<SCREEN id="SCR_ID_MYAPP_6"/>//screen id
通过编译资源,系统会自动生成mmi_rp_app_XXX_def.h文件
在mmi_rp_app_XXX_def.h中
我们可以看到如下的定义,这就是我们的group id了,可以看出去group id和screen id 其实是一个东西,只是用法不同而已。
typedef enum
{
GRP_ID_MYAPP_HEAD = 60382 + 1, /* BASE_ID + 1 */
GRP_ID_MYAPP_5,
GRP_ID_MYAPP_6,
SCR_ID_MYAPP_HEAD,
SCR_ID_MYAPP_5,
SCR_ID_MYAPP_6,
MMI_RP_APP_MYAPP_SCR_MAX
}mmi_rp_app_myapp_scr_enum;
2、group使用
void entry_myapp_screen(void)
{
MMI_ID parent_id;//定义上级group id
parent_id=mmi_frm_group_get_active_id();//得到当前激活group id
//将新建的group GRP_ID_MYAPP_HEAD插入到parent_id中
mmi_frm_group_create(parent_id,
GRP_ID_MYAPP_HEAD,
mmi_myapp_proc, // mmi_myapp_proc 相当于group的callback函数,
NULL);
// mmi_frm_group_enter为进入group函数,具体做了什么以后分析
mmi_frm_group_enter(GRP_ID_MYAPP_HEAD, MMI_FRM_NODE_SMART_CLOSE_FLAG);
// entry_myapp_show_screen()和group_entry_myapp_show_screen()用于显示菜单的函数
#if 0
entry_myapp_show_screen();
#else
group_entry_myapp_show_screen();
#endif
}
//所有与group GRP_ID_MYAPP_HEAD相关的操作都会调用mmi_myapp_proc函数,其中
//EVT_ID_CUI_MENU_ITEM_SELECT情况是为CUI提供菜单相应函数
static mmi_ret mmi_myapp_proc(mmi_event_struct *evt)
{
switch (evt->evt_id)
{
case EVT_ID_GROUP_FIRST_ENTRY:myapp_black();break;//第一次进入group时调用
case EVT_ID_GROUP_INACTIVE:myapp_black(); break;//已经激活时调用
case EVT_ID_GROUP_ACTIVE:myapp_black();break;//激活时调用
case EVT_ID_GROUP_GOBACK:myapp_black();break;//调gobackhistory时调用
case EVT_ID_GROUP_DELETE_REQ:myapp_black(); break;
case EVT_ID_GROUP_DEINIT:myapp_black();break;//注销时调用
case EVT_ID_GROUP_FOCUSED:myapp_black();break;
case EVT_ID_CUI_MENU_ITEM_SELECT://为CUI提供菜单高亮相应函数
if (menu_evt->highlighted_menu_id == MENU_ID_MYAPP_1)
{
myapp_menu1_hight_hdr();
}
else i
f (menu_evt->highlighted_menu_id == MENU_ID_MYAPP_2)
{
myapp_menu2_hight_hdr();
}
else if (menu_evt->highlighted_menu_id == MENU_ID_MYAPP_3)
{
myapp_menu3_hight_hdr();
}
break;
default: break;
}
return MMI_RET_OK;
}
//使用group就是为了显示窗体的,下面就是显示部分
void group_entry_myapp_show_screen(void)
{
#if 1
U8 *guiBuffer;
U16 nStrItemList[10];
U16 nNumofItem = 0;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
// mmi_frm_scrn_enter是进入group操作和EntryNewScreen功能差不多
if (!mmi_frm_scrn_enter(
GRP_ID_MYAPP_HEAD,//group id
SCR_ID_MYAPP_HEAD,//screnn id
NULL,
group_entry_myapp_show_screen,//入口函数
MMI_FRM_FULL_SCRN))//全屏显示
{
return;
}
guiBuffer = mmi_frm_scrn_get_active_gui_buf();//得到屏幕buf
//下面的不是10A的特性就不多说了
RegisterHighlightHandler(ExecuteCurrHiliteHandler);
nNumofItem = GetNumOfChild_Ext(MENU_ID_MYAPP_HEAD);
GetSequenceStringIds_Ext(MENU_ID_MYAPP_HEAD, nStrItemList);
SetParentHandler(MENU_ID_MYAPP_HEAD);
ShowCategory15Screen(
STR_GLOBAL_OPTIONS,
NULL,
STR_GLOBAL_OK,
IMG_GLOBAL_OK,
STR_GLOBAL_BACK,
IMG_GLOBAL_BACK,
nNumofItem,
nStrItemList,
(U16*)gIndexIconsImageList,
LIST_MENU,
0,
guiBuffer);
ClearKeyEvents();
SetKeyHandler(GoBackHistory, KEY_LEFT_ARROW, KEY_EVENT_DOWN);
SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);
#endif
}
3、cui的使用
Cui的用途就是为了方便用户显示菜单,实例如下:
Void entry_myapp_show_screen (void)
{
mmi_id menu_id;//定义id
menu_id = cui_menu_create(//创建cui
GRP_ID_MYAPP_HEAD,//group id
CUI_MENU_SRC_TYPE_RESOURCE,
CUI_MENU_TYPE_FROM_RESOURCE,
MENU_ID_MYAPP_HEAD,// 父菜单ID
MMI_FALSE,
(void*) (U32) MENU_ID_MYAPP_HEAD);
cui_menu_set_default_title(//设置标题及图片
menu_id,
(UI_string_type) GetString(STR_GLOBAL_ABORT),
(UI_image_type) GetImage(IMG_GLOBAL_AC
TIVATED));
cui_menu_run(menu_id);//执行cui
}
entry_myapp_show_screen的整个效果和group_entry_myapp_show_screen一样,我们可以看出entry_myapp_show_screen确实比group_entry_myapp_show_screen简洁了不少这个也是CUI的意义所在,但是同时CUI所显示菜单的高亮相应事件无法通过在
res文件中注册(例如:<MENUITEM id="MENU_ID_MYAPP_3" str="STR_ID_MYAPP_MENU_3" highlight="mmi_myapp_menu_3_hdr"/>),CUI所显示的菜单的高亮相应事件要定义在mmi_myapp_proc这种Group创建中所注册的函数中
(例如: case EVT_ID_CUI_MENU_ITEM_SELECT: ……..;break;)。