菜单下拉滚动条

滚动条就是菜单右侧用来上下拖动以显示屏幕未显示内容的。
滚动条有以下部分组成:
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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值