/* 在PictureBox部件的尺寸改变时,进行些附加操作 */ static void PictureBox_ExecResize(LCUI_Widget *widget) { LCUI_PictureBox *pic_box; float scale_x, scale_y; pic_box = Widget_GetPrivData(widget); if( widget->size.w <= 0 || widget->size.h <= 0 ) { Widget_Refresh(widget); return; } switch(pic_box->size_mode) { case SIZE_MODE_BLOCK_ZOOM: /* 重新改变图像浏览区域的尺寸,这个尺寸指的是从源图像中截取出的图像的尺寸 */ PictureBox_ResizeViewArea( widget, widget->size.w / pic_box->scale, widget->size.h / pic_box->scale ); /* 以现在的缩放比例重新生成缩放后的图像 */ PictureBox_ZoomViewArea(widget, pic_box->scale); break; case SIZE_MODE_ZOOM: if(widget->size.w <= 0 || widget->size.h <= 0) { break; } scale_x = (float)widget->size.w / pic_box->image->w; scale_y = (float)widget->size.h / pic_box->image->h; if(scale_x < scale_y) pic_box->scale = scale_x; else pic_box->scale = scale_y; //printf("PictureBox_ExecResize(): scale: %.4f, x: %.4f, y: %.4f\n", pic_box->scale, scale_x, scale_y); PictureBox_ZoomViewArea(widget, pic_box->scale); //printf("PictureBox_ExecResize(): read box: %d,%d,%d,%d\n", //pic_box->read_box.x, pic_box->read_box.y, //pic_box->read_box.width, pic_box->read_box.height); break; case SIZE_MODE_NORMAL:/* 正常模式 */ case SIZE_MODE_STRETCH:/* 拉伸模式 */ case SIZE_MODE_TILE:/* 平铺模式 */ break; case SIZE_MODE_CENTER: /* 居中模式 */ PictureBox_ResizeViewArea(widget, widget->size.w, widget->size.h); break; default : break; } Widget_Refresh(widget); }
/* 缩放PictureBox部件的图片浏览区域 */ LCUI_API int PictureBox_ZoomViewArea( LCUI_Widget *widget, double scale ) { LCUI_Graph buff, temp; LCUI_PictureBox *pic_box; pic_box = Widget_GetPrivData(widget); if(!Graph_IsValid(pic_box->image)) { return -1; } Graph_Init(&buff); Graph_Init(&temp); /* 有效范围为2%~2000% */ if(scale < 0.02) { scale = 0.02; } if(scale > 20) { scale = 20; } if(pic_box->size_mode != SIZE_MODE_ZOOM && pic_box->size_mode != SIZE_MODE_BLOCK_ZOOM) { pic_box->size_mode = SIZE_MODE_ZOOM; /* 改为缩放模式 */ } pic_box->scale = scale; Update_BuffGraph(widget); Update_ReadBox(widget); Widget_Draw(widget); Widget_Refresh(widget); return 0; }
static void Button_ExecUpdate( LCUI_Widget *widget ) { if(widget->style_id == BUTTON_STYLE_CUSTOM) { Button_ExecCustomUpdate( widget ); } else { Button_ExecDefalutUpdate( widget ); } Widget_Refresh( widget ); }
/* 设定PictureBox部件的图片显示区域的大小 */ LCUI_API void PictureBox_ResizeViewArea( LCUI_Widget *widget, int width, int height ) { LCUI_Pos start, center_pos; LCUI_PictureBox *pic_box; pic_box = Widget_GetPrivData(widget); if(width <= 0 || height <= 0) { return; } if(!Graph_IsValid(pic_box->image)) { return; } /* 将中心点位置转换成坐标 */ center_pos.x = pic_box->read_box.center_x * pic_box->scale * pic_box->image->w; center_pos.y = pic_box->read_box.center_y * pic_box->scale * pic_box->image->h; /* 处理区域数据,使之为有效区域 */ start.x = center_pos.x - width/2.0; start.y = center_pos.y - height/2.0; if(start.x < 0) start.x = 0; if(start.y < 0) start.y = 0; if(start.x + width > pic_box->image->w) start.x = pic_box->image->w - width; if(start.y + height > pic_box->image->h) start.y = pic_box->image->h - height; if(start.x < 0) { start.x = 0; width = pic_box->image->w; } if(start.y < 0) { start.y = 0; height = pic_box->image->h; } pic_box->read_box.x = start.x; pic_box->read_box.y = start.y; pic_box->read_box.width = width; pic_box->read_box.height = height; /* 更新图片盒子内的图像 */ Widget_Draw(widget); Widget_Refresh(widget); }
/* 在PictureBox部件更新时进行附加处理 */ static void PictureBox_ExecUpdate(LCUI_Widget *widget) { LCUI_Pos pos; LCUI_PictureBox *pic_box; LCUI_Graph graph, *widget_graph, *p; pos = Pos(0,0); Graph_Init(&graph); pic_box = (LCUI_PictureBox*)Widget_GetPrivData(widget); widget_graph = Widget_GetSelfGraph( widget ); //print_widget_info(widget); //Graph_PrintInfo(widget_graph); //Graph_PrintInfo(pic_box->image); //printf("PictureBox_ExecUpdate(): 1\n"); if(! Graph_IsValid(pic_box->image)) { return; } //printf("PictureBox_ExecUpdate(): widget size: w: %d, h: %d\n", widget->size.w, widget->size.h); //printf("PictureBox_ExecUpdate(): read box: %d,%d,%d,%d\n", //pic_box->read_box.x, pic_box->read_box.y, //pic_box->read_box.width, pic_box->read_box.height); switch(pic_box->size_mode) { case SIZE_MODE_BLOCK_ZOOM: case SIZE_MODE_ZOOM: /* 裁剪图像 */ if(pic_box->scale == 1.00) p = pic_box->image; else p = &pic_box->buff_graph; if(! Graph_IsValid(p)) { //printf("! Graph_IsValid(p)\n"); return; } pos.x = (widget->size.w - pic_box->read_box.width)/2.0; pos.y = (widget->size.h - pic_box->read_box.height)/2.0; /* 引用图像中指定区域的图形 */ Graph_Quote(&graph, p, pic_box->read_box); break; case SIZE_MODE_NORMAL:/* 正常模式 */ Graph_Quote(&graph, pic_box->image, pic_box->read_box); break; case SIZE_MODE_STRETCH:/* 拉伸模式 */ /* 开始缩放图片 */ Graph_Zoom( pic_box->image, &graph, FALSE, widget->size ); break; case SIZE_MODE_TILE:/* 平铺模式 */ Graph_Tile( pic_box->image, &graph, TRUE ); break; case SIZE_MODE_CENTER: /* 判断图像的尺寸是否小于图片盒子的尺寸,并计算坐标位置 */ if(pic_box->image->w < widget->size.w) { pic_box->read_box.x = 0; pic_box->read_box.width = pic_box->image->w; pos.x = (widget->size.w - pic_box->image->w)/2 + 0.5; } if(pic_box->image->h < widget->size.h) { pos.y = (widget->size.h - pic_box->image->h)/2 + 0.5; pic_box->read_box.y = 0; pic_box->read_box.height = pic_box->image->h; } if(pic_box->read_box.y + pic_box->read_box.height >= pic_box->image->h) /* 如果读取区域的尺寸大于图片尺寸 */ pic_box->read_box.y = pic_box->image->h - pic_box->read_box.height; if(pic_box->read_box.x + pic_box->read_box.width >= pic_box->image->w) pic_box->read_box.x = pic_box->image->w - pic_box->read_box.width; Graph_Quote(&graph, pic_box->image, pic_box->read_box); break; default : break; } // 用于调试 //printf("PictureBox_ExecUpdate(): read box: %d,%d,%d,%d; %d/%d, %d/%d\n", //pic_box->read_box.x, pic_box->read_box.y, //pic_box->read_box.width, pic_box->read_box.height, //pic_box->read_box.x + pic_box->read_box.width, pic_box->buff_graph.w, //pic_box->read_box.y + pic_box->read_box.height, pic_box->buff_graph.h); if(!Graph_IsValid(&widget->background.image)) { Graph_Replace( widget_graph, &graph, pos ); } else { Graph_Mix( widget_graph, &graph, pos ); } Graph_Free(&graph); //printf("scale: %.4f\n", pic_box->scale); //printf("PictureBox_ExecUpdate(): end\n"); Widget_Refresh(widget); }