Exemple #1
0
/* 在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); 
}
Exemple #2
0
/* 缩放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;
}
Exemple #3
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 );
}
Exemple #4
0
/* 设定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); 
}
Exemple #5
0
/* 在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); 
}