您的位置:首页 > 其它

MTK资源相关学习总结

2012-06-11 13:01 176 查看
1.资源添加

资源的添加分为三个步骤:准备原材料,添加资源ID(一般都在各个模块的XXXDef.h中定义),装载资源(一般在各个模块的res_XXX.c文件中)。

1.1字符串资源

1.1.1添加ID

在模块的xxxDef.h中添加模块字符串ID;在GlobalDefs.h中的STR_GLOBAL_LIST枚举中添加全局字符串ID。

1.1.2在资源文件中添加字符串

打开plutommiCustomerCustResource ef_list.txt文件,ref_list.txt文件各列描述如下:

第一列是字符串ID,即在xxxDef.h中定义的ID。

第二列是字符串所属的模块名(仅参考作用,可任意填写)。

第三列是本字符串的最大长度(去所有语言文本中的最大长度)。

第四列是字符串的描述(仅参考作用,可任意填写)。

从第五列开始是各种语言版本对应的字串。

1.1.3装载资源

模块字符串:在模块的res_xxx.c文件的PopulateXXXRes()函数中,使用宏ADD_APPLICATION_STRING或ADD_APPLICATION_STRING2装载字串。

全局字符串:在PopulateRes.c文件的PopulateGlobalData函数中,装载字符串。

ADD_APPLICATION_STRING第一个参数为字串ID,第二个参数是字符串的默认显示值。

ADD_APPLICATION_STRING2前两个参数与ADD_APPLICATION_STRING一致,第三个参数为字符串的描述,可忽略。

1.1.4编译

在dos下输入:make 项目名 gprs resgen 编译资源文件,然后在模拟器中编译运行。

1.2图片资源

1.2.1添加图片ID

在模块的XXXDef.h中添加模块图片ID;在GlobalDefs.h中的IMG_GLOBAL_LIST枚举中添加全局图片ID。

1.2.2将图片资源添加到资源包中

在plutommiCustomerImages目录下根据LCD尺寸和主副屏找到相应的图片资源包,比如PLUTO240X320,此目录下有一个MainLCD目录和image.zip文件,如果资源添加完成后调用plutommiCustomer下的ResGenerator.bat编译资源文件,则只需在MainLCD文件夹下对应的目录中添加图片即可;如果在DOS中使用make 项目名 gprs resgen的方式编译资源文件,则必须在image.zip中添加需要添加的图片。

1.2.3资源加载

模块图片:在模块的res_XXX.c文件的PopulateXXXRes()函数中,使用宏ADD_APPLICATION_IMAGE装载图片资源。

全局图片:在PopulateRes.c文件的PopulateGlobalData函数中,装载图片资源。

ADD_APPLICATION_IMAGE第一个参数为图片ID,第二个参数为图片存放路径,例如CUST_IMG_PATH"\\MainLCD\\Mainmenu\\mainmenu_flyfot\\FTS_mainmenu_BG01.bmp"

宏CUST_IMG_PATH即为"..\\..\\Customer\\Images\\PLUTO240X320"

1.3菜单资源

1.3.1在GlobalMenuItems.h的GLOBALMENUITEMSID枚举中添加菜单ID

必须添加到MAX_MENU_ITEMS_VALUE之前,例如

enum GLOBALMENUITEMSID

{

IDLE_SCREEN_MENU_ID = 1,

……

……

MENU_ID_MYAPP_DEMO,

MAX_MENU_ITEMS_VALUE,

MENU_ITEM_END

};

1.3.2将菜单添加到菜单列表中。

例如:

ADD_APPLICATION_MENUITEM((MESSAGES_MENU_SMS_MENUID,

MAIN_MENU_MESSAGES_MENUID, NUM_MESSAGES_MAIN_MENU,

MESSAGES_MENU_WMESSAGE_MENU_ID,

MESSAGES_MENU_INBOX_MENUID,

MESSAGES_MENU_OUTBOX_MENUID,

MENU_ID_MYAPP_DEMO,

SHOW,

MOVEABLEWITHINPARENT|INSERTABLE,

DISP_LIST,STR_SMS_MENUENTRY, IMG_MESSAGE_SMS_MENUENTRY));

即在菜单项MESSAGES_MENU_SMS_MENUID的下一级菜单的最后增加了菜单项MENU_ID_MYAPP_DEMO。

添加时要注意NUM_MESSAGES_MAIN_MENU值应相应变化。

宏ADD_APPLICATION_MENUITEM用来装载菜单资源,其参数如下:

第1个参数:新加菜单项ID

第2个参数:新菜单项的上一级菜单ID,即ParentID。

第3个参数:此菜单的下一级菜单项总个数(N)。

第4—4+N个参数:分别为每一个子菜单项ID。

第4+N+1个参数:菜单项显示属性,一般为show。

第4+N+2个参数:菜单项转移属性,有以下几种:

#define NONMOVEABLE 0x00

#define MOVEABLEWITHINPARENT 0x01

#define MOVEABLEACROSSPARENT 0x02

#define INSERTABLE 0x10

#define SHORTCUTABLE 0x80

一般为MOVEABLEWITHINPARENT|INSERTABLE

第4+N+3个参数:菜单项下级菜单的显示风格,有以下几种

typedef enum

{

DEFAULT, /* Cannot be changed to list,matrix,circular */

DISP_LIST,

DISP_MATRIX,

DISP_CIRCULAR_3D,

DISP_PAGE,

DISP_ANI_BG_LIST,

DISP_MATRIX_EMS,

DISP_ROTATE,

DISP_MOTION,

DISP_LIST_MATRIX,

DISP_MATRIX_PAGE,

DISP_FIXED_GRID

} DISPATTRIBUTE;

第4+N+4个参数:此菜单项的显示文本字符串

第4+N+5个参数:此菜单项的显示小图标

菜单的高亮时按下OK键对应的处理函数用宏

ADD_APPLICATION_MENUITEM_HILITE_HANDLER加载,它有2个参数,分别为:

第1个参数:菜单ID

第2个参数:对应的函数

1.4声音

从目前了解的代码来看,声音资源和图片资源类似,资源包在plutommiCustomerAudio下,加载资源的宏为ADD_APPLICATION_AUDIO2。

资源添加完成后运行plutommiCustomer ResGenerator.bat或在命令行中运行make 项目名 gprs resgen对资源编译。

2.热区的注册和使用

触屏开关 __MMI_TOUCH_SCREEN__

2.1触笔在非手写状态下的事件有:

typedef enum

{

MMI_PEN_EVENT_DOWN,

MMI_PEN_EVENT_UP,

MMI_PEN_EVENT_LONG_TAP,

MMI_PEN_EVENT_REPEAT,

MMI_PEN_EVENT_MOVE,

MMI_PEN_EVENT_ABORT,

MMI_PEN_EVENT_DOUBLE_CLICK,

MMI_PEN_EVENT_NONE,

MMI_PEN_EVENT_TYPE_MAX = MMI_PEN_EVENT_NONE

} mmi_pen_event_type_enum;

热区的处理通过注册各事件的handler来完成。在事件的handler中根据当前坐标判断触笔是在哪个热区中,然后调用相应的函数处理。

2.2定义触笔事件的handler

如:

/* 触笔按下handler*/

MMI_BOOL main_menu_pen_down_handler (mmi_pen_point_struct point)

{

/* 判断触笔当前位置(point)在屏幕热区的区域 */

/* 调用相应的函数处理 */

}

MMI_BOOL main_menu_pen_up_handler (mmi_pen_point_struct point)

MMI_BOOL main_menu_pen_move_handler (mmi_pen_point_struct point)

MMI_BOOL main_menu_pen_abort_handler (mmi_pen_point_struct point)

MMI_BOOL main_menu_pen_repeat_handler (mmi_pen_point_struct point)

2.3注册热区的handler

对于使用wgui屏幕模板画的窗口,使用函数

wgui_register_category_screen_control_area_pen_handlers来注册热区

它有2个参数,分别为:

第1个参数为:mmi_pen_handler pen_fp,handler。

第2个参数为:mmi_pen_event_type_enum event_type,触笔事件。

如:

wgui_register_category_screen_control_area_pen_handlers(

main_menu_pen_down_handler, MMI_PEN_EVENT_DOWN);

wgui_register_category_screen_control_area_pen_handlers(

main_menu_pen_up_handler, MMI_PEN_EVENT_UP);

对于纯自画的窗口,使用以下函数注册热区:

mmi_pen_register_down_handler(main_menu_pen_down_handler);

mmi_pen_register_up_handler(main_menu_pen_up_handler);

mmi_pen_register_move_handler(main_menu_pen_move_handler);

mmi_pen_register_abort_handler(main_menu_pen_abort_handler);

mmi_pen_register_repeat_handler(main_menu_pen_repeat_handler);

3.主菜单

3.1主菜单入口函数

主菜单入口函数为goto_main_menu(),主要代码如下

void goto_main_menu(void)

{

// 1.entry main menu

EntryNewScreen(MAIN_MENU_SCREENID, exit_main_menu, NULL,

MMI_FULL_SCREEN);

// 2.获取菜单项数量,图片ID,字符串ID,显示属性等

n_items = GetNumOfChild_Ext(IDLE_SCREEN_MENU_ID);

GetSequenceStringIds_Ext(IDLE_SCREEN_MENU_ID, mm_stringIDs);

GetSequenceImageIds_Ext(IDLE_SCREEN_MENU_ID, mm_iconIDs);

SetParentHandler(IDLE_SCREEN_MENU_ID);

attributes = GetDispAttributeOfItem(IDLE_SCREEN_MENU_ID);

……

// 3.注册高亮处理,即根据当前高亮项查找对应的hilite函数

RegisterHighlightHandler(main_menu_custom_highlight_handler);

// 4.调用wgui接口ShowCategory14Screen画主菜单

ShowCategory14Screen(…);

// 5.注册快捷键(数字键等)处理

register_menu_shortcut_selected(main_menu_shortcut_executer);

// 6.设置右软键处理

SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);

}

3.2主菜单修改为18宫格

3.2.1方案一

参照原主菜单的思路,新增菜单ID:IDLE_SCREEN_MENU_ID2,作为主菜单第二页的上一级菜单ID。新增函数main_menu_redraw如下:

void main_menu_redraw (void)

{

// 2.根据当前页号分别用IDLE_SCREEN_MENU_ID和IDLE_SCREEN_MENU_ID2获

// 取菜单项数量,图片ID,字符串ID,显示属性等

// 3.根据当前页号分别注册IDLE_SCREEN_MENU_ID和IDLE_SCREEN_MENU_ID2

// 的高亮处理,即根据当前高亮项查找对应的hilite函数

// 4.调用wgui接口ShowCategory14Screen画主菜单

ShowCategory14Screen(…);

// 5. 根据当前页号分别注册IDLE_SCREEN_MENU_ID和IDLE_SCREEN_MENU_ID2

// 的快捷键(数字键等)处理

register_menu_shortcut_selected(main_menu_shortcut_executer);

// 6.设置右软键处理

SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);

}

void goto_main_menu(void)

{

// 1.entry main menu

EntryNewScreen(MAIN_MENU_SCREENID, exit_main_menu, NULL,

MMI_FULL_SCREEN);

main_menu_redraw();

}

此方式不需要考虑各种冲突,但是实现起来比较复杂,需要修改wgui的接口等

3.2.2方案二

不使用wgui的模板,创建一个纯自画窗口。添加函数main_menu_redraw如下:

void main_menu_redraw(void)

{

// 根据当前页号分别画背景

gdi_image_draw_id(0, 0, MAIN_MENU_BACKGROUND_01_IMAG);

// 显示annun区

show_status_icon_bar(0);

show_status_icons();

// 初始化9个热区坐标

// 注册热区

mmi_pen_register_up_handler(main_menu_pen_up_handler);

}

// 触笔抬起处理函数

MMI_BOOL main_menu_pen_up_handler(mmi_pen_point_struct point)

{

// 根据point查找当前点击项

// 调用对应的入口函数

}

void goto_main_menu(void)

{

// 1.entry main menu

EntryNewScreen(MAIN_MENU_SCREENID, exit_main_menu, NULL,

MMI_FULL_SCREEN);

main_menu_redraw();

}

此方式实现比较简单,但是冲突问题,显示效果问题等都需要考虑,另外,画了全屏的背景后,调用show_status_icons();这个接口,annun区的背景成了白色。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: