分类: C/C++
2009-03-20 00:06:30
定义Category
Category在MTK中是一个很重要的组件,它相当于Windows中的窗口组件,而在MTK中一个Category 则表示一个屏幕,而显示一个屏幕就是要调用类似于ShowCategoryXXX的函数。下面我们就Category 的定义以及实现做一个简要的分析。
每一个Category都要有一个全局唯一的标识ID号 形如:MMI_CATEGORY70_ID 。
Category的ID是在plutommi\mmi\gui\gui_inc\Wgui_categories_enum.h 中定义的。
而Category的定义体是在plutommi\customer\custresource\CustCoordinates.c 中实现的。这里需要严重注意一点:就是Category在CustCoordinates.的定义体循序是按照Wgui_categories_enum.h 中ID定义的序列顺序定义的,不能乱放,这样Category ID就可以和定义体一一对应了!
定义一个Category分为以下几步:
1: 首先在Wgui_categories_enum.h 中定义一个唯一的Category ID 。这个ID号是一个枚举类型的,在I835中的 这个枚举类型名是:MMI_CATEGORY_ID_LIST 。然后再到CustCoordinates.c 文件中找到与你定义的ID值对应的位置上,定义自己的Category。
2: 自定义的Category有两个部分组成,分别定义的是两个枚举类型。
第一个枚举类型 表示这个Category中有多少个组件。例:如下所示:
const U8 category70[] =
{
2, // 这表示:这个Category中共有多少的组成部分
DM_BASE_LAYER_START, // 这个表示:这个Category所在层
DM_CATEGORY_CONTROLLED_AREA, // 这个表示:这个Category有一个控制区域
};
这个例子是一个很简单的Category,你还可以在其中添加更多的组件,比如可以添加一个背景图片( DM_SCR_BG ),可以添加一个List组件( DM_LIST1 ),还可以添加状态条( DM_STATUS_BAR1 )和添加一个Button_Bar组件( DM_BUTTON_BAR1 ),但一定不要忘了,添加完组件之后还要把第一个的数字根据你添加的组件个数做一个修改。
第二个枚举类型 表示的是:各个组件的位置信息: 例如:
const S16 coordinate_set70[] =
{
DM_FULL_SCREEN_COORDINATE_FLAG,
DM_DUMMY_COORDINATE, /* control area */
//80,20,100,200,DM_NO_FLAGS // add fanhongyu for progress coordinate
前四个值分别表示:X Y 长 宽
};
这个枚举类型是根据第一个枚举类型的内容而定义的,第一个参数 DM_FULL_SCREEN_COORDINATE_FLAG, 是上面的DM_BASE_LAYER_START,的属性说明,这个参数表明 这个Category在DM_BASE_LAYER_START,上是一个全屏的屏幕。
而第二个参数DM_DUMMY_COORDINATE 对应的是上一个枚举类型的DM_CATEGORY_CONTROLLED_AREA ,表明:在这个Category的屏幕中的控制区的位置信息。DM_DUMMY_COORDINATE 是一个系统默认定义的枚举值,如果你不想使用系统默认的枚举值,还可以自己把具体的坐标写上去,只要在最后写上,DM_NO_FLAGS 标志位就行,这个标志为表示的意思是:不让系统用默认的坐标而使用自定义坐标。
3: 最后要做的就是把Category的ID和它的定义实现体关联起来。这个功能的实现是在
CustCoordinates.c 中的dm_category_id_control_set_map_struct类型的结构体数组 g_categories_controls_map 中。这个结构体的定义是这样的:
typedef struct
{
U16 category_id;
U8 *control_set_p;
S16 *default_coordinate_set_p;
S16 *rotated_coordinate_set_p;
} dm_category_id_control_set_map_struct;
第一个成员:category_id 表示Category的ID号,
第二个成员:control_set_p 指向Category的定义体 即第一个枚举类型,
第三个成员:default_coordinate_set_p 指向Category的坐标定义结构体,即第二个枚举类型
第四个成员:rotated_coordinate_set_p 指向Category在屏幕旋转后的坐标,一般置为空NULL。
至此一个Category的定义就算完成了,但是如果想要让这个Category真正的显示出来还要定义一个类似于ShowCateXXX这样的函数。下面举一个例子来说明一下具体怎么显示这个Category。
U16 title,
U16 title_icon,
U16 left_softkey,
U16 left_softkey_icon,
U16 right_softkey,
U16 right_softkey_icon,
U8 *history_buffer)
{
dm_data_struct dm_data; // 这个是记录当前Category ID信息的结构
gdi_layer_lock_frame_buffer(); // Lock当前层,以便对其操作
/* 在这里可以进行一些资源描画的动作。如调用:gdi_image_draw_id();描画一个图片 */
gdi_layer_unlock_frame_buffer(); // Unlock当前层,证明对其描画操作已经完成
/* 注册控制区的触摸屏事件,这里是注册Pen_Down事件时的回调函数 */
wgui_register_category_screen_control_area_pen_handlers(
Cat70PenDownHandler, MMI_PEN_EVENT_DOWN);
/* 注册控制区的触摸屏事件,这里注册的是:Pen_UP事件回调函数*/
wgui_register_category_screen_control_area_pen_handlers(
Cat70PenUpHandler, MMI_PEN_EVENT_UP);
/* 保存现在屏幕的信息信息,以便从下一级屏幕返回时恢复当前屏幕 */
dm_setup_category_functions(
dm_redraw_category_screen, dummy_get_history, dummy_get_history_size);
/* 设置Category退出回调函数,这个函数将在退出该Category时调用,也是Category中最后一个调用的函数 */
ExitCategoryFunction = ExitCategory70Screen;
/* 描画Category屏幕的函数,此函数将在所有资源收集完成后调用,并描画此Category的整个屏幕 */
RedrawCategoryFunction = dm_redraw_category_screen;
/* 这个结构体变量是保存当前屏幕ID和Category ID,在dm_redraw_category_screen函数描画整个屏幕的时候会查找当前描画的Category的元素和位置信息,而这些信息就是这个结构体变量提供的 */
dm_data.s32ScrId = (S32) GetActiveScreenId();
dm_data.s32CatId = MMI_CATEGORY70_ID;
dm_data.s32flags = 0;
dm_setup_data(&dm_data);
/* 注册此Category的控制区描画函数,可以在里面描画控制区的一些资源信息 */
dm_register_category_controlled_callback(DrawCate70CategoryControlArea);
/* 描画Category的函数,它会从头的状态栏到最下面的Button_Bat依次描画,当然也会调用控制区的回调函数辅助描画 */
dm_redraw_category_screen();
}
另外,如果想要在此Category上实现Pen的 Down Up Move事件,都要在Category注册各个动作的回调函数后,在外面进行定义并实现相应的动作。
一般一个按钮在Down的回调中更换按下的图片,在Up回调中恢复按钮图片并执行动作。