/**************************** 私有函数 **********************************/ 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 ); }
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) ); } }
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 ); } //有待扩展 }
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); }
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); } } }
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)); }
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; } }