MTK: ShowCategory200Screen() //電話簿快速查找

2008-09-01 | MTK: ShowCategory200Screen()

 

說明:

1.所有的ShowScreen都有2IDScreen IDEntryNewScreen()函數中設置的ID),以及模板IDCategory 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個函數:

1U8 *dm_search_control_set(S32 category_id, S16 **default_coordinate_set_p)

       獲取某個模板的組件和組件屬性指針。

2S16 *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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章