MTK: ShowCategory200Screen() 收藏
說(shuō)明:
1.所有的ShowScreen都有2個(gè)ID:Screen ID(EntryNewScreen()函數(shù)中設(shè)置的ID),以及模板ID(Category ID)。
2.所有的窗口模板的基本設(shè)置都保存在一個(gè)全局變量:g_categories_controls_map中。它的結(jié)構(gòu)是:
typedef struct
{
U16 category_id; 模板ID號(hào)
U8 *control_set_p; 這個(gè)模板的組件指針
S16 *default_coordinate_set_p; 這個(gè)模板中各組件屬性的指針
S16 *rotated_coordinate_set_p; 其他特殊屬性指針
} dm_category_id_control_set_map_struct;
例如Category200:{MMI_CATEGORY200_ID, (U8 *) category200, (S16 *) coordinate_set200, NULL},
組件:
const U8 category200[] =
{
5,
DM_BASE_LAYER_START,
DM_SCR_BG,
DM_BASE_CONTROL_SET1,
DM_CATEGORY_CONTROLLED_AREA,
DM_SINGLELINE_INPUTBOX1
};
屬性:
const S16 coordinate_set200[] =
{
DM_FULL_SCREEN_COORDINATE_FLAG,
DM_CONTENT_COORDINATE_FLAG,
26,
MAIN_LCD_DEVICE_HEIGHT - MMI_BUTTON_BAR_HEIGHT - MMI_SINGLELINE_INPUTBOX_HEIGHT - 2,
MAIN_LCD_DEVICE_WIDTH - 29,
MMI_SINGLELINE_INPUTBOX_HEIGHT,
DM_NO_FLAGS
};
3.一個(gè)Screen ID的屬性變量:g_screenid_coordinate_sets_map[]。其中只包含了幾個(gè)Screen的屬性指針,可能是用來(lái)設(shè)置一些特殊窗口的屬性。結(jié)構(gòu)是:
typedef struct
{
S32 screen_id;
S16 *coordinate_set_p;
} dm_screen_id_coordinate_set_map_struct;
4.2個(gè)函數(shù):
(1)U8 *dm_search_control_set(S32 category_id, S16 **default_coordinate_set_p)
獲取某個(gè)模板的組件和組件屬性指針。
(2)S16 *dm_search_coordinate_set(S32 ScrId)
獲取Screen ID的屬性指針。
進(jìn)入ShowCategory200Screen():MTK的電話簿快速查詢
ShowCategory200Screen()
dm_data_struct dm_data; 定義變量,賦值后,帶入全局變量:g_dm_data。最后在dm_redraw_category_screen()中使用。
gdi_layer_lock_frame_buffer(); 鎖屏
create_fixed_icontext_menuitems(); 設(shè)置fixed list menuitem的公共屬性MMI_fixed_icontext_menuitem,以及每個(gè)menuitems: MMI_fixed_icontext_menuitems[i]和指針
MMI_fixed_menuitem_pointers[i]
associate_fixed_icontext_list(); 把上面設(shè)置的menuitems與框架MMI_fixed_list_menu結(jié)合起來(lái),設(shè)置icontext的menuitem的接口函數(shù)。
init_dynamic_item_buffer(number_of_items, get_item_func, get_hint_func, UI_dummy_function); 裝載動(dòng)態(tài)menuitem:dynamic_item_buffer:獲取item,hint的函數(shù),以及開(kāi)始,結(jié)束,
總的items數(shù)目;并調(diào)用函數(shù)設(shè)置MMI_fixed_icontext_menuitems[]中的每個(gè)menuitem。
設(shè)置shotcut位置MMI_menu_shortcut_box。
register_dynamic_list_keys() 注冊(cè)方向鍵的響應(yīng)。
resize_fixed_list(240,191) 設(shè)置icontext menuitem框架的位置尺寸,以及fixed list和滾動(dòng)條的位置尺寸
設(shè)置輸入框的位置尺寸
dynamic_list_goto_item_no_redraw(highlighted_item = 0);
gui_dynamic_list_menu_goto_item(&MMI_fixed_list_menu, item_index);
gui_dynamic_list_menu_locate_highlighted_item(m);
wgui_setup_singleline_inputbox() 設(shè)置輸入框,包括信息框
SetKeyHandler(wgui_handle_qsearch_singleline_inputbox_change_input_mode, KEY_POUND, KEY_EVENT_DOWN); #鍵改變輸入法
gui_set_single_line_input_box_theme(&MMI_singleline_inputbox, &cat200_singleline_inputbox_theme); 輸入框主題
resize_dynamic_icontext_menuitems_to_list_width();
set_fixed_icontext_positions 設(shè)置icontext的icon和text 的坐標(biāo)
singleline_inputbox_input_callback(); 右軟件標(biāo)簽
設(shè)置左軟件標(biāo)簽
gdi_layer_unlock_frame_buffer(); 解屏
ExitCategoryFunction = ExitCategory200Screen;
dm_setup_category_functions(dm_redraw_category_screen, GetCategory200History, GetCategory200HistorySize); /* 102605 quick search history Calvin add */
dm_data.s32flags = DM_CLEAR_SCREEN_BACKGROUND; 設(shè)置dm_data
dm_data.s32flags |= DM_SHOW_VKPAD;
dm_data.s32ScrId = (S32) GetActiveScreenId();
dm_data.s32CatId = MMI_CATEGORY200_ID;
dm_setup_data(&dm_data); 設(shè)置g_dm_data
dm_register_category_controlled_callback(RedrawCategoryControlledArea200Screen); 注冊(cè)控制區(qū)域的CBACK函數(shù)
dm_register_vkpad_callback(cat200_virtual_keypad_callback); 畫(huà)虛擬鍵盤(pán)的CBACK
dm_redraw_category_screen();
dm_redraw_category_screen()
S16 *UICtrlAccessPtr_p = NULL, *DeafultCoordinateSet_p = NULL; Category200模板的組件屬性指針
U8 *control_set_ptr = NULL; Category200模板的組件指針
control_set_ptr = dm_search_control_set((U16) g_dm_data.s32CatId, &DeafultCoordinateSet_p); 獲取模板200的組件和組件默認(rèn)屬性指針
u8NoOfUICtrls = control_set_ptr[0]; 組件第一個(gè)參數(shù)是組件個(gè)數(shù)
UICtrlAccessPtr_p = dm_search_coordinate_set(g_dm_data.s32ScrId); 獲取組件屬性。即:UICtrlAccessPtr_p是組件屬性指針,如果UICtrlAccessPtr_p為空,就設(shè)置為默認(rèn)屬性。
gdi_layer_lock_frame_buffer();
UICtrlAccessPtr_p = dm_get_cat_scr_coordinates(UICtrlAccessPtr_p, &dm_cat_scr_info); Get category screen size,在畫(huà)組件之前,根據(jù)屬性要獲取這個(gè)窗口的大小。
此時(shí),屬性指針下移一個(gè)位置,指向下一個(gè)屬性。
gdi_layer_set_active(GDI_LAYER_MAIN_BASE_LAYER_HANDLE); 設(shè)置基本層
gui_set_clip(dm_cat_scr_info.x1, dm_cat_scr_info.y1, dm_cat_scr_info.x2, dm_cat_scr_info.y2); 設(shè)置窗口剪切區(qū)
gdi_draw_solid_rect(0, 0, UI_device_width - 1, UI_device_height - 1, GDI_COLOR_TRANSPARENT); 畫(huà)背景
for (u8CtrlCt = 1; u8CtrlCt <= u8NoOfUICtrls; u8CtrlCt++) 開(kāi)始畫(huà)組件
{
switch (control_set_ptr[u8CtrlCt]) 判斷組件
{
case DM_BASE_LAYER_START:
{
if (redraw_type != REDRAW_2_REDRAW)
{
dm_setup_base_layer();
}
break;
}
case DM_BASE_CONTROL_SET1:
{
dm_setup_and_draw_base_control_set(&UICtrlAccessPtr_p); 畫(huà)基本組件:status, title, button
control_set_ptr = dm_get_base_control_set(); 獲取基本組件指針
UICtrlAccessPtr_p = dm_get_base_coordinate_set(); 獲取基本組件屬性
u8NoOfUICtrls = control_set_ptr[0];
for (u8CtrlCt = 1; u8CtrlCt <= u8NoOfUICtrls; u8CtrlCt++)
{
畫(huà)3個(gè)基本組件。注意要傳進(jìn)入屬性指針作為參數(shù)。因?yàn)樵诋?huà)的時(shí)候,要根據(jù)組件屬性,去獲取坐標(biāo)等參數(shù)。
dm_setup_and_draw_status_icons(&UICtrlAccessPtr_p);
dm_setup_and_draw_title(&UICtrlAccessPtr_p);
dm_setup_and_draw_button_bar(&UICtrlAccessPtr_p);
}
break;
}
case DM_CATEGORY_CONTROLLED_AREA:
{
dm_setup_and_draw_category_controlled_area(&UICtrlAccessPtr_p);
*UICtrlAccessPtr_p = dm_get_coordinates(*UICtrlAccessPtr_p, &dm_category_controlled_area_info); 根據(jù)屬性輸入坐標(biāo)
(*dm_category_controlled_area_callback) (&dm_category_controlled_area_info); 即注冊(cè)的CBACK:RedrawCategoryControlledArea200Screen()
gdi_layer_lock_frame_buffer(); 鎖屏
wgui_redraw_singleline_input_information_bar(); 畫(huà)輸入法提示框
show_dynamic_list(); 畫(huà)fixed list menu
gui_draw_rectangle() 畫(huà)輸入框
gui_show_image() 輸入框前面的image
gdi_layer_unlock_frame_buffer();
gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);
break;
}
case DM_SINGLELINE_INPUTBOX1:
{
dm_setup_and_draw_singleline_inputbox(&UICtrlAccessPtr_p);
*UICtrlAccessPtr_p = dm_get_coordinates(*UICtrlAccessPtr_p, &dm_singleline_inputbox_info); 根據(jù)屬性,獲取坐標(biāo)
show_singleline_inputbox();
break;
}
}
} 到for退出后,所有的控件就畫(huà)好了
gdi_layer_unlock_frame_buffer();
gdi_layer_blt()
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xqq2009/archive/2009/09/13/4546713.aspx