Group结构图
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 if (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_ACTIVATED));
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;)。