当前位置:文档之家› MTK代码_GROUP机制及运用

MTK代码_GROUP机制及运用

应用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;)。

相关主题
文本预览
相关文档 最新文档