滚动条就是菜单右侧用来上下拖动以显示屏幕未显示内容的。 滚动条有以下部分组成: 1.上下箭头图标——>我们一般称之为 SCROLLBAR_BUTTON 2.滚动轴——>我们一般称之为 SCROLLBAR_REGION 3.滚动条——>我们一般称之为 SCROLLBAR 在滚动条的显示方面,如果我们要改变滚动条是否显示,则通过改变结构体变量MMI_fixed_list_menu中的flag成员的值就可以了,因为我们事先定义好了一些菜单格式宏,其定义在Gui_typedef.h中,关于是否显示关系到下面两个宏:
引用 LIST_MENU #define UI_LIST_MENU_DISABLE_SCROLLBAR 0x00000002 // 用来隐藏在列表菜单中的垂直滚动条(vertical scrollbar ) #define UI_LIST_MENU_AUTO_DISABLE_SCROLLBAR 0x00000010 // 列表菜单动态显示垂直滚动条,即有未显示内容时显示滚动条,全部显示时则不显示滚动条 MATRIX_MENU #define UI_MATRIX_MENU_DISABLE_SCROLLBAR 0x00000002 // 用来隐藏在矩阵菜单中的垂直滚动条(vertical scrollbar ) #define UI_MATRIX_MENU_AUTO_DISABLE_SCROLLBAR 0x00000010 // 矩阵菜单动态显示垂直滚动条,即有未显示内容时显示滚动条,全部显示时则不显示滚动条如果是要改变结构体的整体风格的话,我们就要修改滚动条的一些属性了。在MMI_fixed_list_menu中的vbar成员是一个结构体,定义了滚动条的一些属性值:
引用 typedef struct _vertical_scrollbar { S32 x; S32 y; S32 width; S32 height; U32 range; U32 value; U32 scale; U32 flags; U32 style; UI_filled_area *focussed_bar_filler; UI_filled_area *normal_bar_filler; UI_filled_area *disabled_bar_filler; icon_button up_button; icon_button down_button; icon_button scroll_button; /* the vertical scrollbar target lcd */ gdi_handle target_lcd; /* the vertical scrollbar target layer */ gdi_handle target_layer; /* the alpha blend layer of vertical scrollbar */ gdi_handle alpha_blend_layer; /* hide callback function for hide the vertical scrollbar */ void (*hide_callback)(S32 x1, S32 y1, S32 x2, S32 y2); #ifdef __MMI_TOUCH_SCREEN__ S16 min_pen_offset; S16 pen_self_scroll; gui_scrollbar_pen_state_struct pen_state; #endif /* __MMI_TOUCH_SCREEN__ */ } vertical_scrollbar通过改变style成员的值改变其风格,这里我们只预设了两种大的风格:
引用 #define GUI_SCROLLBAR_STYLE_DEFAULT (0x00000001) //默认风格:滚动条组成部分齐全 #define GUI_SCROLLBAR_STYLE_WIDER (0x00000002) //宽风格:滚动条无上下箭头图标再细分的话就有: 1.对于GUI_SCROLLBAR_STYLE_DEFAULT:UI_SCROLLBAR_STYLE_1 ~~~~~~~ UI_SCROLLBAR_STYLE_7 2.对于GUI_SCROLLBAR_STYLE_WIDER:UI_SCROLLBAR_WIDER_STYLE_1 ~~~~~~~ UI_SCROLLBAR_WIDER_STYLE_7 它们又分别给vbar自己的赋值,以更改其外观。 接下来是关于滚动条的一些函数: 滚动条的函数大多在Gui_scrollbars.c 与Gui_scrollbars_oem.c 中。 创建滚动条函数:
引用 void gui_create_vertical_scrollbar_ex(vertical_scrollbar *v, S32 x, S32 y, S32 width, S32 height, U32 style,gdi_handle target_lcd, gdi_handle target_layer,gdi_handle alpha_blend_layer)显示滚动条函数:
引用 void gui_show_vertical_scrollbar(vertical_scrollbar *v)创建上下箭头图标
引用 void gui_create_icon_button(icon_button *b, S32 x, S32 y, S32 width, S32 height, PU8 button_icon)显示上下箭头图标:
引用 void gui_show_icon_button(icon_button *b)显示滚动轴(这个函数包含在gui_show_vertical_scrollbar当中选择的style显示函数中使用了,没有单独列出选择):
引用 static void gui_scrollbar_draw_region_style_ *(ep:6)(gui_scrollbar_region_enum type, S32 x, S32 y, S32 width, S32 height, icon_button *b)触笔事件
引用 BOOL gui_horizontal_scrollbar_translate_pen_event这次我们处理的是滚动轴,就先讲滚动轴,等以后再遇到修改其他的再添加上对应的讲解。下面是显示滚动轴的函数:
引用 /*传入的参数x,y,width,height分别为滚动条的起始坐标(x,y)和滚动条的宽,高*/ static void gui_scrollbar_draw_region_style_6(gui_scrollbar_region_enum type, S32 x, S32 y, S32 width, S32 height, icon_button *b) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ color color; S32 x1, y1, x2, y2, i, j; S32 region_width = 4; //决定了滚动轴的宽度 S32 num_gradient_color; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ if (gui_scrollbar_redraw_clip_enable) { gui_push_clip(); gui_set_clip(x, y, x + width - 1, y + height - 1); } color = current_MMI_theme->scrollbar_background_filler->c; /*对颜色结构体g_mmi_gui_scrollbar_gradient_style_6[GUI_SCROLLBAR_NUM_GRADIENT_COLOR_STYLE6]赋值*/ gui_scrollbar_precache_color1_style_6( color, region_width, //色宽 GUI_SCROLLBAR_MIN_BACKGROUND_GRADIENT_SATURATION_STYLE6, //饱和度最小值 GUI_SCROLLBAR_MAX_BACKGROUND_GRADIENT_SATURATION_STYLE6, //饱和度最大值 GUI_SCROLLBAR_MIN_BACKGROUND_GRADIENT_LIGHTNESS_STYLE6, //亮度最小值 GUI_SCROLLBAR_MAX_BACKGROUND_GRADIENT_LIGHTNESS_STYLE6, //亮度最大值 GUI_SCROLLBAR_NUM_BACKGROUND_GRADIENT_STYLE6); //几种颜色变化 num_gradient_color = region_width; if (num_gradient_color > GUI_SCROLLBAR_NUM_BACKGROUND_GRADIENT_STYLE6) { num_gradient_color = GUI_SCROLLBAR_NUM_BACKGROUND_GRADIENT_STYLE6; } if (num_gradient_color > GUI_SCROLLBAR_NUM_GRADIENT_COLOR_STYLE6) { num_gradient_color = GUI_SCROLLBAR_NUM_GRADIENT_COLOR_STYLE6; } if (num_gradient_color <= 1) { num_gradient_color = 2; } if (type == GUI_SCROLLBAR_REGION_VERTICAL) { x1 = x + (width - region_width) / 2 + 1; x2 = x1 + region_width - 1; y1 = y + 1; y2 = y + height - 2; for (i = 0, j = 0; i < region_width; i ++) //通过画region_width条制定颜色的线,绘制渐变色滚动轴 { gui_draw_vertical_line(y1, y2, x2 - i, g_mmi_gui_scrollbar_gradient_style_6[j]); if ((i % (region_width / num_gradient_color)) == (region_width / num_gradient_color - 1)) { j ++; if (j >= num_gradient_color) { j = num_gradient_color - 1; } } } } else { x1 = x + 1; x2 = x1 + width - 3; y1 = y + (height - region_width) / 2 + 1; y2 = y1 + region_width - 1; for (i = 0, j = 0; i < region_width; i ++) { gui_draw_horizontal_line(x1, x2, y1 + i, g_mmi_gui_scrollbar_gradient_style_6[j]); if ((i % (region_width / num_gradient_color)) == (region_width / num_gradient_color - 1)) { j ++; if (j >= num_gradient_color) { j = num_gradient_color - 1; } } } } if (gui_scrollbar_redraw_clip_enable) { gui_pop_clip(); } }