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"[url=file://\\MainLCD\\Mainmenu\\mainmenu_flyfot\\FTS_mainmenu_BG01.bmp]\\MainLCD\\Mainmenu\\mainmenu_flyfot\\FTS_mainmenu_BG01.bmp[/url]"
宏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区的背景成了白色。
资源的添加分为三个步骤:准备原材料,添加资源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"[url=file://\\MainLCD\\Mainmenu\\mainmenu_flyfot\\FTS_mainmenu_BG01.bmp]\\MainLCD\\Mainmenu\\mainmenu_flyfot\\FTS_mainmenu_BG01.bmp[/url]"
宏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区的背景成了白色。