mre下的控件实现(四、Button使用)
来源:互联网 发布:机器人算法和plc程序 编辑:程序博客网 时间:2024/04/26 13:43
这里有一个实例使用(一、实现)中的按钮控件,达到的效果如下图所示,
用mre sdk(这里使用的是mre sdk 2.5版本)创建一个工程,工程名为mtid(实际上这个是我要在做一个工具)。
//生成的工程,自动生成mtid.c,代码改动成如下//主窗体在这里创建#include "vmsys.h"#include "vmio.h"#include "vmgraph.h"#include "vmchset.h"#include "vmstdlib.h"#include "ResID.h"#include "vm4res.h"#include "vmlog.h"#include "MtidView.h"#include "widget.h"VMINT layer_hdl[1];VMINT SCREEN_HEIGHT;VMINT SCREEN_WIDTH;Widget* g_mtid_view;void handle_sysevt(VMINT message, VMINT param);void handle_keyevt(VMINT event, VMINT keycode);void handle_penevt(VMINT event, VMINT x, VMINT y);void handle_exitevt(void* ctx);void vm_main(void) { layer_hdl[0] = -1; vm_reg_sysevt_callback(handle_sysevt); vm_reg_keyboard_callback(handle_keyevt); vm_reg_pen_callback(handle_penevt); vm_res_init();}void handle_sysevt(VMINT message, VMINT param) { switch (message) { case VM_MSG_CREATE: vm_log_info("handle_sysevt VM_MSG_CREATE"); if(layer_hdl[0] == -1) { SCREEN_HEIGHT = vm_graphic_get_screen_height(); SCREEN_WIDTH = vm_graphic_get_screen_width(); layer_hdl[0] = vm_graphic_create_layer(0, 0, vm_graphic_get_screen_width(),vm_graphic_get_screen_height(),-1); vm_graphic_set_clip(0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height()); } g_mtid_view = MtidViewInit(layer_hdl, handle_exitevt, NULL); break; case VM_MSG_ACTIVE: if(layer_hdl[0] == -1) { layer_hdl[0] = vm_graphic_create_layer(0, 0, vm_graphic_get_screen_width(),vm_graphic_get_screen_height(),-1); vm_graphic_set_clip(0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height()); widget_on_paint(g_mtid_view); } break; case VM_MSG_PAINT: vm_log_info("handle_sysevt VM_MSG_PAINT"); widget_on_paint(g_mtid_view); break; case VM_MSG_INACTIVE: if( layer_hdl[0] != -1 ) { vm_graphic_delete_layer(layer_hdl[0]); layer_hdl[0] = -1; } break; case VM_MSG_QUIT: handle_exitevt(NULL); break; }}void handle_keyevt(VMINT event, VMINT keycode) { if( layer_hdl[0] != -1 ) { vm_graphic_delete_layer(layer_hdl[0]); layer_hdl[0] = -1; } vm_exit_app(); /* quit application */}void handle_penevt(VMINT event, VMINT x, VMINT y){ widget_on_pen_evt(g_mtid_view, event, x, y);}void handle_exitevt(void* ctx){ if( layer_hdl[0] != -1 ) { vm_graphic_delete_layer(layer_hdl[0]); layer_hdl[0] = -1; } if( layer_hdl[1] != -1 ) { vm_graphic_delete_layer(layer_hdl[0]); layer_hdl[1] = -1; } widget_on_destroy(g_mtid_view); vm_res_deinit(); vm_exit_app();}
//主窗体 MtidView.h#ifndef __MTID_VIEW_H__#define __MTID_VIEW_H__#include "typedef.h"struct _Widget;typedef struct _Widget Widget;extern VMINT SCREEN_HEIGHT;extern VMINT SCREEN_WIDTH;typedef void (*ExitCbFunc)(void* ctx);Widget* MtidViewInit(int* layer, ExitCbFunc exit, void* ctx);void MtidViewOnPaint(Widget* thiz);void MtidViewOnPenEvt(Widget* thiz, VMINT event, VMINT x, VMINT y);void MtidViewOnKeyEvt(Widget* thiz, VMINT event, int keycode);#endif /*__MTID_VIEW_H__*/
//主窗体接口实现,在这里拼装子控件#include "button.h"#include "widget.h"#include "MtidView.h"#define MTID_NUMBER 15#define MTID_FILE_PATH "E:\\mre\\mtid.txt"typedef struct _MtidViewExtrat{ char write_buf[MTID_NUMBER + 1]; char mtid[MTID_NUMBER + 1]; ExitCbFunc exit; void* ctx;} MtidViewExtra;static void MtidViewNumBtnOnClicked(void* param1, void* param2){ Widget* thiz = (Widget*)param2; MtidViewExtra* extra = (MtidViewExtra*)thiz->extra; char tmp[MTID_NUMBER + 1] = {0}; int len = 0; int i = 0; memset(extra->write_buf, 0, sizeof(extra->write_buf)); sprintf(tmp, "%d", (int)param1); len = strlen(extra->mtid); if(len < 15) { int i = 0; strcat(extra->mtid, tmp); } len = strlen(extra->mtid); for(i = 0; i < MTID_NUMBER - len; i++) { extra->write_buf[i] = '0'; } strcat(extra->write_buf, extra->mtid); MtidViewOnPaint(thiz);}static void MtidViewSureBtnOnClicked(void* param1, void* param2){ Widget* thiz = (Widget*)param2; MtidViewExtra* extra = (MtidViewExtra*)thiz->extra; int* layer = widget_get_layer(thiz); wbh_write(MTID_FILE_PATH, "w", extra->write_buf); if(NULL != extra->exit) extra->exit(extra->ctx);}static void MtidViewClearBtnOnClicked(void* param1, void* param2){ Widget* thiz = (Widget*)param2; MtidViewExtra* extra = (MtidViewExtra*)thiz->extra; int len = 0; int i = 0; memset(extra->mtid, 0, sizeof(extra->mtid)); len = strlen(extra->mtid); for(i = 0; i < MTID_NUMBER - len; i++) { extra->write_buf[i] = '0'; } strcat(extra->write_buf, extra->mtid); MtidViewOnPaint(thiz);}static void MtidViewAddNumBtn(Widget* thiz){ Rect rect = {0}; Widget* btn = NULL; int btn_area_x = 0; int btn_area_y = SCREEN_HEIGHT/5; int btn_h = (SCREEN_HEIGHT*4/5)/4; int btn_w = SCREEN_WIDTH/3; int i = 0; int* layer = widget_get_layer(thiz); for(i = 1; i <= 10; i++) { char text[16] = {0}; sprintf(text, "%d", i%10); rect.x_pos = btn_area_x + ((i-1)%3)*btn_w; rect.y_pos = btn_area_y + (i-1)/3*btn_h; rect.width = btn_w; rect.height = btn_h; btn = button_create(100 + i, rect, layer, text); vm_log_info("MtidViewAddNumBtn btn:%d", btn); button_set_on_clicked_func(btn, MtidViewNumBtnOnClicked, (void*)(i%10), (void*)thiz); widget_add_child(thiz, btn); } rect.x_pos = btn_area_x + btn_w; rect.y_pos = btn_area_y + 3*btn_h; rect.height = btn_h; rect.width = btn_w; btn = button_create(100 + 11, rect, layer, "清空"); button_set_on_clicked_func(btn, MtidViewClearBtnOnClicked, NULL, (void*)thiz); widget_add_child(thiz, btn); rect.x_pos = btn_area_x + btn_w * 2; rect.y_pos = btn_area_y + 3*btn_h; rect.height = btn_h; rect.width = btn_w; btn = button_create(100 + 12, rect, layer, "确定"); button_set_on_clicked_func(btn, MtidViewSureBtnOnClicked, NULL, (void*)thiz); widget_add_child(thiz, btn);}void MtidViewOnPaint(Widget* thiz){ int i = 0; MtidViewExtra* extra = (MtidViewExtra*)thiz->extra; VMWCHAR w_str[32] = {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; color.vm_color_565 = VM_COLOR_WHITE; vm_graphic_setcolor(&color); vm_graphic_fill_rect_ex(layer_hd, 0, 0, width, height); end_color.vm_color_565 = VM_COLOR_888_TO_565(217, 210, 168); start_color.vm_color_565 = VM_COLOR_888_TO_565(217, 210, 168); vm_graphic_gradient_paint_rect(layer_hd, x_pos + 2, y_pos + 2, x_pos + width - 4, y_pos + height/5 - 4, start_color, end_color, VM_GDI_GP_VER); vm_graphic_setcolor(&color); vm_graphic_roundrect_ex(layer_hd, x_pos+1, y_pos+1, width-2, height/5-2, 5); color.vm_color_565 = VM_COLOR_BLACK; vm_graphic_setcolor(&color); vm_gb2312_to_ucs2(w_str, sizeof(w_str), extra->write_buf); vm_graphic_set_font(VM_LARGE_FONT); wstr_width = vm_graphic_get_string_width(w_str); wstr_height = vm_graphic_get_string_height(w_str); vm_graphic_textout_to_layer(layer_hd, x_pos + width - wstr_width - 8, y_pos + height/5 - wstr_height - 8, w_str, vm_wstrlen(w_str)); for(i = 0; i < MAX_WIDGET_CHILD; i++) { if(NULL != thiz->child[i]) { widget_on_paint(thiz->child[i]); } } vm_graphic_flush_layer(layer, 1);}void MtidViewOnPenEvt(Widget* thiz, VMINT event, VMINT x, VMINT y){ int i = 0; for(i = 0; i < MAX_WIDGET_CHILD; i++) { vm_log_info("MtidViewOnPenEvt thiz->child[%d]:%d", i, thiz->child[i]); if(NULL != thiz->child[i]) { widget_on_pen_evt(thiz->child[i], event, x, y); } } vm_graphic_flush_screen();}void MtidViewOnKeyEvt(Widget* thiz, int event, int keycode){}void MtidViewOnDestroy(Widget* thiz){ int i = 0; for(i = 0; i < MAX_WIDGET_CHILD; i++) { if(NULL != thiz->child[i]) { widget_on_destroy(thiz->child[i]); thiz->child[i] = NULL; } } if(thiz->extra) WBH_FREE(thiz->extra); widget_deinit(thiz); WBH_FREE(thiz);}Widget* MtidViewInit(int* layer, ExitCbFunc exit, void* ctx){ Widget* thiz = NULL; Rect rect = {0}; MtidViewExtra* extra = NULL; int i =0, len =0; thiz = WBH_MALLOC(sizeof(Widget)); extra = WBH_MALLOC(sizeof(MtidViewExtra)); thiz->on_destroy = (OnDestroyFunc)MtidViewOnDestroy; thiz->on_paint = (OnPaintFunc)MtidViewOnPaint; thiz->on_pen_event = (OnPenEventFunc)MtidViewOnPenEvt; thiz->on_key_event = (OnKeyEventFunc)MtidViewOnKeyEvt; extra->exit = exit; extra->ctx = ctx; thiz->extra = (void*)extra; rect.x_pos= 0; rect.y_pos = 0; rect.width = SCREEN_WIDTH; rect.height = SCREEN_HEIGHT; widget_init(thiz, CONTROL_TYPE_VIEW, 100, rect, layer); MtidViewAddNumBtn(thiz); len = strlen(extra->mtid); for(i = 0; i < MTID_NUMBER - len; i++) { extra->write_buf[i] = '0'; } strcat(extra->write_buf, extra->mtid); return thiz;}
- mre下的控件实现(四、Button使用)
- mre下的控件实现(三、Button实现)
- mre下的控件实现(一、公共的宏定义)
- mre下的控件实现(二、Widget基础类)
- 自定义控件 BUTTON的实现。
- Radio Button控件的使用
- Android Button控件的使用
- Vc++ Button控件的使用
- IOS学习四:基础控件Label,textfield,button等使用
- Button点击事件的四种实现
- 安卓控件之Button与ImageButton详解以及其按下效果的实现
- vc60中控件Radio Button的使用
- VC6.0 控件Radio Button的使用
- VC6.0 控件Radio Button的使用
- VC6.0 控件Radio Button的使用
- Silverlight中Button控件的使用
- VC6.0 控件Radio Button的使用
- VC6.0 控件Radio Button的使用
- Nios II 定时器内核
- 加密算法
- Ajax的常用技巧(2)---实现Web页面中的级联菜单
- 云端的使用
- text-indent属性缩进无效解决方法
- mre下的控件实现(四、Button使用)
- 常用被引用文献 MIRA CRF
- 关于JAVA 和IOS 的十进制转十六进制
- 基于centos 的Lamp环境搭建
- linux基础之虚拟机ubuntu为什么不能上网?
- Ajax的常用技巧(3)---实现自动刷新页面.
- 详细透彻的分析DM9000网卡驱动程序(4)---我是苦行僧
- 采用MATLAB的DSP调试方法
- MFC消息机制与虚函数的结合