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