Exemplo n.º 1
0
/**************************** 私有函数 **********************************/
static void
Move_ScrollBar( LCUI_Widget *widget, LCUI_Pos new_pos )
{
	double scale;
	int size;
	LCUI_ScrollBar *scrollbar;
	
	scrollbar = Get_Widget_PrivData( widget->parent );
	/* 使该坐标在限制范围内 */
	new_pos = Get_Widget_Valid_Pos( widget, new_pos );
	/* 判断滚动条的方向 */
	if( scrollbar->direction == 0 ) { /* 纵向 */
		/* 先得到容器高度 */
		size = _Get_Widget_Container_Height( widget );
		/* 减去自身高度 */
		size -= _Get_Widget_Height( widget );
		/* 再用当前坐标除以size,得到比例 */
		scale = new_pos.y * 1.0 / size;
		/* 将max_num乘以比例,得出current_num的值 */
		scrollbar->data.current_num = scale * scrollbar->data.max_num;
	} else { /* 横向 */
		size = _Get_Widget_Container_Width( widget );
		size -= _Get_Widget_Width( widget );
		scale = new_pos.x * 1.0 / size;
		scrollbar->data.current_num = scale * scrollbar->data.max_num;
	}
	Move_Widget( widget, new_pos );
}
Exemplo n.º 2
0
static void 
ScrollBar_Update( LCUI_Widget *widget )
{
	static int pos, max_len;
	static double scale;
	static char scale_str[256];
	LCUI_ScrollBar *scrollbar;
	
	scrollbar = Get_Widget_PrivData( widget );
	/* 计算比例,之后转换成字符串 */
	scale = scrollbar->data.current_size*1.0 / scrollbar->data.max_size; 
	sprintf( scale_str, "%.2lf%%", scale*100 );
	//printf( "ScrollBar_Update(): scale: %s\n", scale_str );
	/* 判断滚动条的方向 */
	if( scrollbar->direction == 0 ) { /* 纵向 */
		Set_Widget_Size( scrollbar->widget, NULL, scale_str );
		max_len = Get_Container_Height( widget );
		max_len -= _Get_Widget_Height( scrollbar->widget );
		Limit_Widget_Pos( scrollbar->widget, Pos(0,0), Pos( 0, max_len ) );
		
		scale = scrollbar->data.current_num*1.0 / scrollbar->data.max_num;
		pos = scale * max_len;
		//printf("ScrollBar_Update(), num: %d / %d\n", 
		//scrollbar->data.current_num, scrollbar->data.max_num);
		//printf("ScrollBar_Update(), scale: %.2f\n", scale);
		//printf("ScrollBar_Update(), y: %d\n", pos);
		/* 移动滚动条 */
		Move_Widget( scrollbar->widget, Pos(0,pos) );
	} else { /* 横向 */ 
		Set_Widget_Size( scrollbar->widget, scale_str, NULL );
		max_len = Get_Container_Width( widget );
		max_len -= _Get_Widget_Width( scrollbar->widget );
		Limit_Widget_Pos( scrollbar->widget, Pos(0,0), Pos(max_len,0) );
		scale = scrollbar->data.current_num*1.0 / scrollbar->data.max_num;
		pos = scale * max_len;
		//printf("ScrollBar_Update(), num: %d / %d\n", 
		//scrollbar->data.current_num, scrollbar->data.max_num);
		//printf("ScrollBar_Update(), scale: %.2f\n", scale);
		//printf("ScrollBar_Update(), x: %d\n", pos);
		Move_Widget( scrollbar->widget, Pos(pos, 0) );
	}
}
Exemplo n.º 3
0
static void Show_Window(LCUI_Widget *win_p)
/* 功能:在窗口显示时,进行相关处理 */
{
    LCUI_Size size;
    LCUI_Pos pos;
    LCUI_Window *win;

    win = (LCUI_Window*)Get_Widget_PrivData(win_p);
    win->count++;
    if(win->count == 1) {/* 如果是第一次显示 */
        size = _Get_Widget_Container_Size( win_p );
        pos = Align_Get_Pos( size, _Get_Widget_Size(win_p), win->init_align );
        Move_Widget( win_p, pos );
    }
    //有待扩展
}
Exemplo n.º 4
0
static void *Move_Flash_Img(void *arg)
/* 功能:移动进度条中闪光的位置 */
{
	int x=0;
	LCUI_Widget *widget = (LCUI_Widget*)arg;
	LCUI_Widget *flash = Get_ProgressBar_Flash_Img_Widget(widget);
	LCUI_ProgressBar *pb = Get_Widget_PrivData(widget);
	while(1) {
		for(x=(0-flash->size.w); 
			x<=flash->parent->size.w; 
			x+=(pb->img_move_speed/20.0+0.5)) {
			Move_Widget(flash, Pos(x , flash->pos.y));
			usleep(50000);
		}
		usleep(pb->sleep_time);
	}
	LCUI_Thread_Exit(NULL);
}
Exemplo n.º 5
0
static void Move_Window(LCUI_Widget *titlebar, LCUI_DragEvent *event)
/* 功能:处理鼠标移动事件 */
{
    LCUI_Pos pos;
    LCUI_Widget *window;
    if(event->first_click == 0 ) {
        window = titlebar->parent;
        pos = event->new_pos;
        if(window != NULL) {
            /* 减去在窗口中的相对坐标, 得出窗口位置 */
            pos = Pos_Sub(pos, Get_Widget_Pos(titlebar));
            if(window->parent != NULL) {
                pos = Pos_Sub(pos, Get_Widget_Global_Pos(window->parent));
            }
            /* 移动窗口的位置 */
            Move_Widget(window, pos);
        }
    }
}
Exemplo n.º 6
0
static void Exec_Update_ProgressBar(LCUI_Widget *widget)
/* 功能:更新进度条的图形 */
{ 
	LCUI_ProgressBar *pb = (LCUI_ProgressBar*)Get_Widget_PrivData(widget);
	if(Strcmp(&widget->style, "dynamic") == 0) {
		/* 绘制空槽 */
		Draw_Empty_Slot(&widget->graph, widget->size.w, widget->size.h);
		Set_Widget_Border_Style(widget, BORDER_STYLE_NONE);
		/* 载入两个图形 */
		if(!Graph_Valid(&pb->fore_graph)) 
			Load_Graph_ProgressBar_Fore(&pb->fore_graph);  
			
		if(!Graph_Valid(&pb->flash_image)) 
			Load_Graph_ProgressBar_Img(&pb->flash_image);
		
		Resize_Widget(pb->img_pic_box, Get_Graph_Size(&pb->flash_image)); 
		/* 让图片盒子显示这个图形 */
		Set_PictureBox_Image_From_Graph(pb->img_pic_box, &pb->flash_image);
	} else {
		Strcpy(&widget->style, "classic");
		if(!Graph_Valid(&pb->fore_graph)) 
			Graph_Create(&pb->fore_graph, 10, widget->size.h); 
		Graph_Fill_Color(&pb->fore_graph, RGB(80,80,200));
		Graph_Fill_Alpha(&pb->fore_graph, 255);
	}
	
	/* 让图片盒子显示这个图形 */
	Set_PictureBox_Image_From_Graph(pb->fore_pic_box, &pb->fore_graph); 
	
	int width, height;
	/* 计算进度条的长度 */ 
	width = (widget->size.w - widget->border.left - widget->border.right) 
			* pb->value / pb->max_value + 0.5;
	height = widget->size.h - widget->border.top - widget->border.bottom;
	
	Move_Widget(pb->fore_pic_box, Pos(widget->border.left, widget->border.top));
	/* 改变进度条的尺寸 */
	Resize_Widget(pb->fore_pic_box, Size(width, height));
}
Exemplo n.º 7
0
void Window_Widget_Auto_Size(LCUI_Widget *win_p)
/* 功能:在窗口尺寸改变时自动改变标题栏和客户区的尺寸 */
{
    int x, y, width, height;
    LCUI_Widget *titlebar;
    LCUI_Widget *client_area;

    titlebar = Get_Window_TitleBar(win_p);
    client_area = Get_Window_Client_Area(win_p);

    /* 按不同的风格来处理 */
    switch(Get_Widget_Border_Style(win_p)) {
    case BORDER_STYLE_NONE:  /* 没有边框 */
        /* 先计算坐标和尺寸 */
        x = win_p->border.left;
        y = win_p->border.top;
        width = win_p->size.w - x - win_p->border.right;
        height = win_p->size.h - y - win_p->border.bottom;

        Move_Widget( client_area, Pos(x, y) );/* 调整位置 */
        Resize_Widget( client_area, Size(width, height) );/* 调整大小 */
        Hide_Widget( titlebar );/* 隐藏标题栏 */
        Show_Widget( client_area );/* 客户区需要显示 */
        break;

    case BORDER_STYLE_LINE_BORDER: /* 线条边框 */
        Move_Widget( client_area, Pos(0, 0) );
        Resize_Widget( client_area,
                       Size(win_p->size.w, win_p->size.h) );
        Hide_Widget( titlebar);
        Show_Widget( client_area);
        break;

    case BORDER_STYLE_STANDARD: /* 标准边框 */
        /*
         * 说明:由于用户区的尺寸和位置的调整,需要确定标题栏的尺寸,因此,
         * 调用Exec_Resize_Widget()函数立刻调整标题栏尺寸,如果是调用
         * Resize_Widget()函数,那么,确定的尺寸会有误,因为标题栏的尺
         * 寸还是以前的尺寸。
         * */
        Set_Widget_Border(win_p, RGB(50,50,50), Border(1,1,1,1));
        /* 先计算坐标和尺寸 */
        x = win_p->border.left;
        y = win_p->border.top;
        width = win_p->size.w - x - win_p->border.right;
        height = win_p->size.h - y - win_p->border.bottom;

        Move_Widget(titlebar, Pos(x, y) );
        Resize_Widget(titlebar, Size(width, 25));

        Set_Widget_Align(client_area, ALIGN_BOTTOM_CENTER, Pos(0, y));
        Resize_Widget(client_area, Size(width, height - 23));
        /* 标题栏和客户区都需要显示 */
        Show_Widget(titlebar);
        Show_Widget(client_area);
        break;

    default:
        //
        break;
    }
}