MTK: ShowCategory200Screen() 收藏
說明:
1.所有的ShowScreen都有2個ID:Screen ID(EntryNewScreen()函數中設置的ID),以及模板ID(Category ID)。
2.所有的窗口模板的基本設置都保存在一個全局變量:g_categories_controls_map中。它的結構是:
typedef struct
{
U16 category_id; 模板ID號
U8 *control_set_p; 這個模板的組件指針
S16 *default_coordinate_set_p; 這個模板中各組件屬性的指針
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.一個Screen ID的屬性變量:g_screenid_coordinate_sets_map[]。其中只包含了幾個Screen的屬性指針,可能是用來設置一些特殊窗口的屬性。結構是:
typedef struct
{
S32 screen_id;
S16 *coordinate_set_p;
} dm_screen_id_coordinate_set_map_struct;
4.2個函數:
(1)U8 *dm_search_control_set(S32 category_id, S16 **default_coordinate_set_p)
獲取某個模板的組件和組件屬性指針。
(2)S16 *dm_search_coordinate_set(S32 ScrId)
獲取Screen ID的屬性指針。
進入ShowCategory200Screen():MTK的電話簿快速查詢
ShowCategory200Screen()
dm_data_struct dm_data; 定義變量,賦值后,帶入全局變量:g_dm_data。最后在dm_redraw_category_screen()中使用。
gdi_layer_lock_frame_buffer(); 鎖屏
create_fixed_icontext_menuitems(); 設置fixed list menuitem的公共屬性MMI_fixed_icontext_menuitem,以及每個menuitems: MMI_fixed_icontext_menuitems[i]和指針
MMI_fixed_menuitem_pointers[i]
associate_fixed_icontext_list(); 把上面設置的menuitems與框架MMI_fixed_list_menu結合起來,設置icontext的menuitem的接口函數。
init_dynamic_item_buffer(number_of_items, get_item_func, get_hint_func, UI_dummy_function); 裝載動態menuitem:dynamic_item_buffer:獲取item,hint的函數,以及開始,結束,
總的items數目;并調用函數設置MMI_fixed_icontext_menuitems[]中的每個menuitem。
設置shotcut位置MMI_menu_shortcut_box。
register_dynamic_list_keys() 注冊方向鍵的響應。
resize_fixed_list(240,191) 設置icontext menuitem框架的位置尺寸,以及fixed list和滾動條的位置尺寸
設置輸入框的位置尺寸
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() 設置輸入框,包括信息框
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 設置icontext的icon和text 的坐標
singleline_inputbox_input_callback(); 右軟件標簽
設置左軟件標簽
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; 設置dm_data
dm_data.s32flags |= DM_SHOW_VKPAD;
dm_data.s32ScrId = (S32) GetActiveScreenId();
dm_data.s32CatId = MMI_CATEGORY200_ID;
dm_setup_data(&dm_data); 設置g_dm_data
dm_register_category_controlled_callback(RedrawCategoryControlledArea200Screen); 注冊控制區域的CBACK函數
dm_register_vkpad_callback(cat200_virtual_keypad_callback); 畫虛擬鍵盤的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的組件和組件默認屬性指針
u8NoOfUICtrls = control_set_ptr[0]; 組件第一個參數是組件個數
UICtrlAccessPtr_p = dm_search_coordinate_set(g_dm_data.s32ScrId); 獲取組件屬性。即:UICtrlAccessPtr_p是組件屬性指針,如果UICtrlAccessPtr_p為空,就設置為默認屬性。
gdi_layer_lock_frame_buffer();
UICtrlAccessPtr_p = dm_get_cat_scr_coordinates(UICtrlAccessPtr_p, &dm_cat_scr_info); Get category screen size,在畫組件之前,根據屬性要獲取這個窗口的大小。
此時,屬性指針下移一個位置,指向下一個屬性。
gdi_layer_set_active(GDI_LAYER_MAIN_BASE_LAYER_HANDLE); 設置基本層
gui_set_clip(dm_cat_scr_info.x1, dm_cat_scr_info.y1, dm_cat_scr_info.x2, dm_cat_scr_info.y2); 設置窗口剪切區
gdi_draw_solid_rect(0, 0, UI_device_width - 1, UI_device_height - 1, GDI_COLOR_TRANSPARENT); 畫背景
for (u8CtrlCt = 1; u8CtrlCt <= u8NoOfUICtrls; u8CtrlCt++) 開始畫組件
{
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); 畫基本組件: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++)
{
畫3個基本組件。注意要傳進入屬性指針作為參數。因為在畫的時候,要根據組件屬性,去獲取坐標等參數。
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); 根據屬性輸入坐標
(*dm_category_controlled_area_callback) (&dm_category_controlled_area_info); 即注冊的CBACK:RedrawCategoryControlledArea200Screen()
gdi_layer_lock_frame_buffer(); 鎖屏
wgui_redraw_singleline_input_information_bar(); 畫輸入法提示框
show_dynamic_list(); 畫fixed list menu
gui_draw_rectangle() 畫輸入框
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); 根據屬性,獲取坐標
show_singleline_inputbox();
break;
}
}
} 到for退出后,所有的控件就畫好了
gdi_layer_unlock_frame_buffer();
gdi_layer_blt()
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xqq2009/archive/2009/09/13/4546713.aspx