void Set_PictureBox_Size_Mode(LCUI_Widget *widget, int mode) /* 功能:设定图片盒子的图像显示模式 */ { LCUI_PictureBox *pic_box = (LCUI_PictureBox*) Get_Widget_PrivData(widget); if(pic_box->size_mode == mode) return; float scale_x,scale_y; pic_box->size_mode = mode; if(pic_box->image == NULL) return; switch(mode) { case SIZE_MODE_BLOCK_ZOOM: case SIZE_MODE_ZOOM: if( widget->size.w <= 0 || widget->size.h <= 0) { pic_box->scale = 1.0; } else { scale_x = (float)widget->size.w / pic_box->image->width; scale_y = (float)widget->size.h / pic_box->image->height; if(scale_x < scale_y) pic_box->scale = scale_x; else pic_box->scale = scale_y; } Zoom_PictureBox_View_Area(widget, pic_box->scale); break; default: pic_box->scale = 1.0; break; } Draw_Widget(widget); }
static void Exec_Resize_PictureBox(LCUI_Widget *widget) /* 功能:改变PictureBox部件的尺寸 */ { LCUI_PictureBox *pic_box = (LCUI_PictureBox*) Get_Widget_PrivData(widget); float scale_x, scale_y; if( widget->size.w <= 0 || widget->size.h <= 0 ) { Refresh_Widget(widget); return; } switch(pic_box->size_mode) { case SIZE_MODE_BLOCK_ZOOM: /* 重新改变图像浏览区域的尺寸,这个尺寸指的是从源图像中截取出的图像的尺寸 */ Resize_PictureBox_View_Area( widget, widget->size.w / pic_box->scale, widget->size.h / pic_box->scale ); /* 以现在的缩放比例重新生成缩放后的图像 */ Zoom_PictureBox_View_Area(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->width; scale_y = (float)widget->size.h / pic_box->image->height; if(scale_x < scale_y) pic_box->scale = scale_x; else pic_box->scale = scale_y; //printf("Exec_Resize_PictureBox(): scale: %.4f, x: %.4f, y: %.4f\n", pic_box->scale, scale_x, scale_y); Zoom_PictureBox_View_Area(widget, pic_box->scale); //printf("Exec_Resize_PictureBox(): 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: /* 居中模式 */ Resize_PictureBox_View_Area(widget, widget->size.w, widget->size.h); break; default : break; } Refresh_Widget(widget); }
void Set_PictureBox_Image_From_Graph(LCUI_Widget *widget, LCUI_Graph *image) /* 功能:添加一个图片数据至图片盒子 */ { int i; float scale_x,scale_y; LCUI_Graph *graph = image; LCUI_PictureBox *pic_box = (LCUI_PictureBox*) Get_Widget_PrivData(widget); for(i = 0; i < 2; ++i) { /* 如果image有效 */ if(Graph_Valid(graph)) { /* 图片更换了,就释放缓存图形 */ Graph_Free(&pic_box->buff_graph); pic_box->image = graph; /* 读取的范区域为整个图片区域 */ pic_box->read_box.x = 0; pic_box->read_box.y = 0; pic_box->read_box.width = graph->width; pic_box->read_box.height = graph->height; pic_box->read_box.center_x = 0.5; pic_box->read_box.center_y = 0.5; pic_box->scale = 1.0; //printf("Set_PictureBox_Image_From_Graph(): img, w: %d, h: %d\n", graph->width, graph->height); //printf("Set_PictureBox_Image_From_Graph(): pb: w: %d, h: %d\n", widget->size.w, widget->size.h); //printf("Set_PictureBox_Image_From_Graph(): size mode: %d\n", pic_box->size_mode); switch(pic_box->size_mode) { case SIZE_MODE_BLOCK_ZOOM: case SIZE_MODE_ZOOM: //printf("Set_PictureBox_Image_From_Graph(): widget: w: %d, h: %d\n", widget->size.w, widget->size.h); if(widget->size.w <= 0 || widget->size.h <= 0) { //printf("Set_PictureBox_Image_From_Graph(): break\n"); break; } scale_x = (float)widget->size.w / pic_box->image->width; scale_y = (float)widget->size.h / pic_box->image->height; if(scale_x < scale_y) pic_box->scale = scale_x; else pic_box->scale = scale_y; //printf("Set_PictureBox_Image_From_Graph(): scale: %.4f, x: %.4f, y: %.4f\n", //pic_box->scale, scale_x, scale_y); Zoom_PictureBox_View_Area(widget, pic_box->scale); //printf("Set_PictureBox_Image_From_Graph(): 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: break; /* 拉伸模式 */ case SIZE_MODE_STRETCH: break; /* 平铺模式 */ case SIZE_MODE_TILE: break; case SIZE_MODE_CENTER: /* 判断图像的尺寸是否超出图片盒子的尺寸 */ if(pic_box->image->width >= widget->size.w) { pic_box->read_box.x = (pic_box->image->width - widget->size.w)/2.0; pic_box->read_box.width = widget->size.w; } if(pic_box->image->height >= widget->size.h) { pic_box->read_box.y = (pic_box->image->height - widget->size.h)/2.0; pic_box->read_box.height = widget->size.h; } break; default : break; } break; } else if(pic_box->image_status == IMAGE_STATUS_LOADING) { /* 使用对应的图片 */ if(Graph_Valid(&pic_box->initial_image)) { graph = &pic_box->initial_image; } else { return; } } else { /* 使用对应的图片 */ if(Graph_Valid(&pic_box->error_image)) { graph = &pic_box->error_image; pic_box->image_status = IMAGE_STATUS_FAIL; } else { return; } } } /* 如果记录中有该部件,那判断该部件使用的图像是否为同一个,不一样就释放之前的 */ graph_data *data; i = find_widget_data(widget); if(i >= 0) { data = (graph_data*)Queue_Get(&picbox_graph_mem, i); if(data->image != image) { Queue_Delete(&picbox_graph_mem, i); } } Draw_Widget(widget); }