菜单下拉滚动条

    技术2025-08-31  12

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