窗口模版
1. 定义窗口模版的ID
在wgui_categories_defs.h文件中有枚举enum MMI_CATEGORY_ID_LIST
首先要在MMI_CATEGORY_ID_LIST中添加窗口模版的ID,例如:
MMI_CATEGORY36_ID
2. 控件坐标和控件数组的定义
CustCoordinates.c (plutommi"customer"custresource)
控件坐标和控件数组的定义都是在CustCoordinates.c文件的
注意:在wgui_categories_defs.h中窗口ID的顺序与dm_category_id_control_set_map_struct g_categories_controls_map中窗口模版ID、控件数组和控件坐标的映射关系的顺序应该是一一对应的。
在CustCoordinates.c中,const dm_category_id_control_set_map_struct g_categories_controls_map[]下面有这样一句话:
/* The sequence of category id should be listed in ascending order */
const dm_category_id_control_set_map_struct g_categories_controls_map[]
这是将窗口模版ID、控件数组和控件坐标关联起来的数组,例如:
{MMI_CATEGORY36_ID, (U8 *) list_menu_category, (S16 *) common_coordinate_set, (S16 *) common_rotated_coordinate_set}
第一个参数是窗口模版的ID:
就是在wgui_categories_defs.h定义的ID
第二个参数是控件数组:
这也是在CustCoordinates.c中定义的,例如36号窗体模版的控件数组:
const U8 list_menu_category[] =
{
5, // 表示的是这个窗口模版有5个控件
DM_BASE_LAYER_START, //基本层
DM_SCR_BG, //背景图片
DM_BASE_CONTROL_SET1,
//状态栏、标题和软按键DM_STATUS_BAR1 DM_BUTTON_BAR1
DM_LIST1, //列表控件
DM_FLY_ANNIMATION
};
这些组件被定义在wgui_draw_manager.h文件的枚举结构mmi_dm_control_ids_enum中,如果需要添加自己定义的控件,则需要在这里添加相应的ID。
第三个参数是竖屏时各控件的坐标,例如36号窗口模版的如下所示:
const S16 common_coordinate_set[] =
{
DM_FULL_SCREEN_COORDINATE_FLAG,
DM_CONTENT_COORDINATE, DM_CENTRE_ALIGN_X | DM_CENTER_ALIGN_Y,
3, DM_SHIFTIN_ANNIMATION_TOP, 0, 0, LCD_WIDTH, MMI_TITLE_HEIGHT, 0, 0,
DM_SHIFTIN_ANNIMATION_LEFT, 0, MMI_TITLE_HEIGHT, LCD_WIDTH/2, LCD_HEIGHT - MMI_SOFTKEY_HEIGHT - MMI_TITLE_HEIGHT, 0, MMI_TITLE_HEIGHT,
DM_SHIFTIN_ANNIMATION_RIGHT, LCD_WIDTH/2, MMI_TITLE_HEIGHT, LCD_WIDTH/2, LCD_HEIGHT - MMI_SOFTKEY_HEIGHT - MMI_TITLE_HEIGHT, LCD_WIDTH/2, MMI_TITLE_HEIGHT,
};
一般情况下,DM_SCR_BG和DM_BASE_CONTROL_SET1的坐标不需要另外说明,定义控件的坐标有两种方法:
(一) 用系统预定义的标志
例如:DM_FULL_SCREEN_COORDINATE_FLAG
在wgui_draw_manager.h中可以找到一系列标志的定义
在S16 *dm_get_coordinates(S16 *UICtrlAccessPtr_p, dm_coordinates *dm_coordinate_info)函数中可以查看其实际的意义。
(二) 自己定义
定义的顺序是:X坐标,Y坐标,宽,高,标志(一般是DM_NO_FLAGS,自定义坐标有效)
例如:
0, MMI_TITLE_HEIGHT, MAIN_LCD_DEVICE_WIDTH, MAIN_LCD_DEVICE_HEIGHT - MMI_TITLE_HEIGHT - MMI_BUTTON_BAR_HEIGHT, DM_NO_FLAGS
第四个参数是横屏时的坐标,如下是36号窗口的定义,具体意义类似竖屏的定义
const S16 common_rotated_coordinate_set[] =
{
DM_FULL_SCREEN_COORDINATE_FLAG,
DM_CONTENT_COORDINATE, DM_CENTRE_ALIGN_X | DM_CENTER_ALIGN_Y,
};
3. 控件的初始化
void ShowCategory36Screen(
U16 title,
U16 title_icon,
U16 left_softkey,
U16 left_softkey_icon,
U16 right_softkey,
U16 right_softkey_icon,
S32 number_of_items,
U8 **list_of_items,
U16 highlighted_item,
U8 *history_buffer)
{
dm_data_struct dm_data;
S32 i;
U8 h_flag;
gdi_layer_lock_frame_buffer();
create_fixed_twostate_menuitems(get_image(RADIO_ON_IMAGE_ID), get_image(RADIO_OFF_IMAGE_ID));
associate_fixed_twostate_list();
ShowListCategoryScreen(
get_string(title),
get_image(title_icon),
get_string(left_softkey),
get_image(left_softkey_icon),
get_string(right_softkey),
get_image(right_softkey_icon),
number_of_items);
resize_fixed_twostate_menuitems(0, MMI_MENUITEM_HEIGHT);
if (mmi_frm_is_screen_width_height_swapped())
set_fixed_twostate_positions(MMI_MENUITEM_HEIGHT << 1, 0, MMI_MENUITEM_HEIGHT + 1, 0);
else
set_fixed_twostate_positions(MMI_MENUITEM_HEIGHT + 2, 0, 1, 0);
for (i = 0; i < number_of_items; i++)
{
add_fixed_twostate_item((UI_string_type) list_of_items[i]);
}
register_fixed_list_highlight_handler(standard_radio_list_highlight_handler);
h_flag = set_list_menu_category_history(MMI_CATEGORY36_ID, history_buffer);
if (h_flag)
{
fixed_list_goto_item_no_redraw(MMI_fixed_list_menu.highlighted_item);
}
else
{
fixed_list_goto_item_no_redraw(highlighted_item);
}
select_fixed_twostate_item(MMI_fixed_list_menu.highlighted_item);
resize_fixed_twostate_menuitems_to_list_width();
gdi_layer_unlock_frame_buffer();
ExitCategoryFunction = ExitListCategoryScreen;
RedrawCategoryFunction = dm_redraw_category_screen;
GetCategoryHistory = dm_get_category_history;
GetCategoryHistorySize = dm_get_category_history_size;
dm_data.s32ScrId = (S32) GetActiveScreenId();
dm_data.s32CatId = MMI_CATEGORY36_ID;
dm_data.s32flags = 0;
dm_setup_data(&dm_data);
dm_redraw_category_screen();
4.