滚动条就是菜单右侧用来上下拖动以显示屏幕未显示内容的。
滚动条有以下部分组成:
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();
}
}