|
高级模板、控件的构建与使用
??? 本节例子源代码请见源代码光盘“第7章的例子”文件夹下“7.2 高级模板、控件的构建与使用”文件夹。
前面我介绍了屏幕模板的使用,接下来我重点介绍高级控件的使用,高级模板是建立在普通模板的基础上的,所以要特别注意普通的模板时怎样一步步变成高级模板的。
讲到高级模板,我们不可避免涉及到Draw Manager的概念。Draw Manager(简称DM)主要是为了减轻代码冗余。触摸屏在模板数据库中保存了每个模板的控件列表,DM一并将每个控件的属性集(如排版数据,控制标志等)也加入其中,当要绘制模板时DM 将控件集与属性集一起取出来,然后依次通知每个WGUI 控件,WGUI 控件收到DM的通知与相关的属性集后立即将自己绘制出来。
普通屏幕模板加入触摸屏与DM后,就成了高级屏幕模板,本章将为大家介绍如何将普通模板转化为高级模板。
模板数据库
高级模板的重中之重是“模板数据库”,数据库存在CustCoordinates.C 中,下面将详细讲述数据库的构成。
首先要讲的是映射表g_categories_controls_map,映射表中每一项代表一个模板,其结构定义如下:
typedef struct
{
U16 category_id; //模板ID,CategoryScreen、DM、TouchScreen 之间主要是通过模板ID 相互交流
U8 *control_set_p; //控件列表
S16 *default_coordinate_set_p; //属性列表
S16 *rotated_coordinate_set_p; //旋转屏幕的属性列表,目前基本不用
} dm_category_id_control_set_map_struct;
模板ID 定义在wgui_categories_defs.h 中,我们将新模板的ID 命名为MMI_CATEGORY888_ID:
enum MMI_CATEGORY_ID_LIST
{
MMI_LIST_CATEGORY_ID = 1,
MMI_CATEGORY5_ID,
… …
MMI_CATEGORY_NSM275,
MMI_CATEGORY888_ID //我们屏幕的模板ID
};
然后在映射表中加上一项:
const dm_category_id_control_set_map_struct g_categories_controls_map[] =
{
{MMI_CATEGORY5_ID, (U8 *) category5, (S16 *) coordinate_set5, NULL},
{MMI_CATEGORY6_ID, (U8 *) list_menu_category, (S16 *) common_coordinate_set, NULL},
… …
{MMI_CATEGORY888_ID, (U8 *) category888, (S16 *) coordinate_set888, NULL}
};
我们的模板包含了两个控件“列表控件”与“系统按键条”:
const U8 category888[] =
{
3,
DM_BASE_LAYER_START,
DM_LIST1,
DM_BUTTON_BAR1,
};
第一个参数表示我们模板包含的控件数,这里为数字“3”是因为我们还加上了一个控制类型的控件DM_BASE_LAYER_START,后面会详细讲此控件的作用。
控件在列表中放置的顺序也有讲究,越往后的控件显示越靠上层,也越容易接收触摸屏操作。
接下来定义我们模板的属性集:
const S16 coordinate_set888[] =
{
DM_FULL_SCREEN_COORDINATE_FLAG,
20, MMI_CONTENT_Y + 5, 136, MMI_CONTENT_HEIGHT - 40, DM_NO_FLAGS,
DM_DEFAULT_BUTTON_BAR_FLAG, MMI_SOFTKEY_WIDTH,
};
|
|