|
高級模板、控件的構建與使用
??? 本節例子源代碼請見源代碼光盤“第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,
};
|
|