mre下的控件实现(三、Button实现)
实现button控件,其他控件类此写便是了。
//button.h 按钮控件 #ifndef __BUTTON_H__ #define __BUTTON_H__ #include "widget.h" typedef void (*ButtonOnClickedFunc)(void* param1, void* param2); typedef enum _ButtonStyle { ButtonStyle1, ButtonStyle2, ButtonStyleMax } ButtonStyle; /* * 函数名:button_create * 说明:创建按钮 * 参数说明: */ Widget* button_create(int id, Rect rect, int* layer, char* text); /* * 函数名:button_set_on_clicked_func * 说明:设置按钮单击时间处理函数 * 参数说明: */ void button_set_on_clicked_func(Widget* thiz, ButtonOnClickedFunc on_clicked, void* param1, void* param2); /* * 函数名:button_set_font_size * 说明:设置文本字体大小 * 参数说明: */ void button_set_font_size(Widget* thiz, font_size_t size); /* * 函数名:button_set_style * 说明:设置按钮风格 * 参数说明: */ void button_set_style(Widget* thiz, ButtonStyle style); /* * 函数名:button_set_text * 说明:设置按钮文本 * 参数说明: */ void button_set_text(Widget* thiz, char* text); #endif /*__BUTTON_H__*/
//button.c 按钮控件自有的接口实现 #include "button.h" struct _ButtonExtra; typedef struct _ButtonExtra ButtonExtra; #define BUTTON_MAX_TEXT 0x20 typedef enum _ButtonState { BUTTON_NORMAL, BUTTON_PUSHDOWN, BUTTON_STATE_MAX } ButtonState; struct _ButtonExtra { char text[BUTTON_MAX_TEXT]; font_size_t fone_size; ButtonStyle style; ButtonState state; ButtonOnClickedFunc on_clicked; void* param1; void* param2; }; static int button_on_key_event(Widget* thiz, int event, int keycode) { ButtonExtra* extra = NULL; if(thiz == NULL || !widget_is_visible(thiz) || NULL == thiz->extra || !widget_is_focus(thiz)) return FALSE; extra = (ButtonExtra*)thiz->extra; if(VM_KEY_EVENT_DOWN == event) { switch(keycode) { case VM_KEY_OK: extra->state = BUTTON_PUSHDOWN; break; default: break; } } else if(VM_KEY_EVENT_UP == event) { switch(keycode) { case VM_KEY_OK: extra->state = BUTTON_NORMAL; if(extra && extra->on_clicked) extra->on_clicked(extra->param1, extra->param2); break; default: break; } } return TRUE; } static int button_on_pen_event(Widget* thiz, int event, int x, int y) { ButtonExtra* extra = NULL; if(NULL == thiz || !widget_is_visible(thiz) || NULL == thiz->extra) return FALSE; extra = (ButtonExtra*)thiz->extra; if(VM_PEN_EVENT_TAP == event) { if(widget_is_point_in_area(thiz, x, y)) extra->state = BUTTON_PUSHDOWN; } else if(BUTTON_PUSHDOWN == extra->state && VM_PEN_EVENT_RELEASE == event) { extra->state = BUTTON_NORMAL; if(extra->on_clicked) extra->on_clicked(extra->param1, extra->param2); } return TRUE; } static int button_on_paint(Widget* thiz) { ButtonExtra* extra = NULL; VMWCHAR button_name[BUTTON_MAX_TEXT] = {0}; VMINT wstr_width, wstr_height; VMINT x_pos = widget_get_x_pos_abs(thiz); VMINT y_pos = widget_get_y_pos_abs(thiz); VMINT height = widget_get_height(thiz); VMINT width = widget_get_width(thiz); int* layer = widget_get_layer(thiz); int layer_hd = layer[widget_get_layer_index(thiz)]; vm_graphic_color start_color; vm_graphic_color end_color; vm_graphic_color color; if(NULL == thiz || !widget_is_visible(thiz) || NULL == thiz->extra) return FALSE; extra = (ButtonExtra*)thiz->extra; vm_graphic_set_font(extra->fone_size); vm_gb2312_to_ucs2(button_name, BUTTON_MAX_TEXT, extra->text); wstr_width = vm_graphic_get_string_width(button_name); wstr_height = vm_graphic_get_string_height(button_name); if(ButtonStyle1 == extra->style) { if(BUTTON_NORMAL == extra->state) { end_color.vm_color_565 = VM_COLOR_888_TO_565(130, 130, 130); start_color.vm_color_565 = VM_COLOR_888_TO_565(210, 210, 210); } else if(BUTTON_PUSHDOWN == extra->state) { end_color.vm_color_565 = VM_COLOR_888_TO_565(70, 70, 70); start_color.vm_color_565 = VM_COLOR_888_TO_565(130, 130, 130); } color.vm_color_565 = VM_COLOR_BLACK; vm_graphic_setcolor(&color); vm_graphic_gradient_paint_rect(layer_hd, x_pos + 1, y_pos + 1, x_pos + width - 2, y_pos + height - 2, start_color, end_color, VM_GDI_GP_VER); vm_graphic_roundrect_ex(layer_hd, x_pos, y_pos, width, height, 5); vm_graphic_textout_to_layer(layer_hd, x_pos + width/2 - wstr_width/2 - 4, y_pos + height/2 - wstr_height/2 - 3, button_name, vm_wstrlen(button_name)); } else if(ButtonStyle2 == extra->style) { } vm_graphic_set_font(VM_MEDIUM_FONT); return TRUE; } static int button_on_destroy(Widget* thiz) { return_val_if_fail(NULL != (int)thiz, -1); if(thiz->extra) WBH_FREE(thiz->extra); widget_deinit(thiz); WBH_FREE(thiz); } void button_set_on_clicked_func(Widget* thiz, ButtonOnClickedFunc on_clicked, void* param1, void* param2) { ButtonExtra* extra = (ButtonExtra*)thiz->extra; extra->on_clicked = on_clicked; extra->param1 = param1; extra->param2 = param2; } void button_set_font_size(Widget* thiz, font_size_t size) { ButtonExtra* extra = (ButtonExtra*)thiz->extra; extra->fone_size = size; } void button_set_style(Widget* thiz, ButtonStyle style) { ButtonExtra* extra = (ButtonExtra*)thiz->extra; extra->style = style; } void button_set_text(Widget* thiz, char* text) { ButtonExtra* extra = (ButtonExtra*)thiz->extra; if(NULL == text || 0 == strlen(text)) return; memset(extra->text, 0, sizeof(extra->text)); strncpy(extra->text, text, sizeof(extra->text)); } Widget* button_create(int id, Rect rect, int* layer, char* text) { Widget* thiz = NULL; ButtonExtra* extra = NULL; thiz = WBH_MALLOC(sizeof(Widget)); extra = WBH_MALLOC(sizeof(ButtonExtra)); extra->fone_size = VM_MEDIUM_FONT; extra->style = ButtonStyle1; strncpy(extra->text, text, sizeof(extra->text)); thiz->extra = (void*)extra; thiz->on_key_event = button_on_key_event; thiz->on_pen_event = button_on_pen_event; thiz->on_paint = button_on_paint; thiz->on_destroy = button_on_destroy; widget_init(thiz, CONTROL_TYPE_BUTTON, id, rect, layer); return thiz; }
不积跬步无以至千里,不积小流无以成江河。