/**************************************************************************** * 名称: DispLogin() * 功能: 闪动显示"Loading...",并显示进度条。 * 入口参数: 无 * 出口参数: 无 ****************************************************************************/ void DispLogin(void) { int i; // 显示loding... GUI_PutString(30, 25, "Loading..."); // 显示进度条 GUI_Rectangle( PROG_STARTX, PROG_STARTY, PROG_STARTX+PROG_LENGTH, PROG_STARTY+PROG_HIGH, 1); // 循环增长进度 for(i=3; i<100; i+=1) { // 改变进度条显示 GUI_RectangleFill( PROG_STARTX, PROG_STARTY, PROG_STARTX+i, PROG_STARTY+PROG_HIGH, 1); // 若进度到尾数为5时,则使能"Loading..."显示 if((i%10) == 5) { GUI_PutString(30, 25, "Loading..."); } // 若进度到尾数为0时,则禁止"Loading..."显示 if((i%10) == 0) { GUI_PutString(30, 25, " "); } //vTaskDelay(100); } }
/**************************************************************************** * 名称:GUI_WindowsDraw() * 功能:显示窗口。根据提供的窗口参数进行画窗口。 * 入口参数:win 窗口句柄 * 出口参数:返回0表示操作失败,返回1表示操作成功 ****************************************************************************/ uint8 GUI_WindowsDraw(WINDOWS *win) { uint8 *str; int32 bak, bak1, bak2; /* 参数过滤,若窗口起出范围,则返回0 */ if( ( (win->with)<20 ) || ( (win->hight)<20 ) ) return(0); // 宽度、高度检查,限制最小窗口 if( (win->x + win->with ) > GUI_LCM_XMAX ) return(0); // 窗口宽度是否溢出 if( (win->y + win->hight ) > GUI_LCM_YMAX ) return(0); // 窗口高度是否溢出 /* 开始画窗口 */ GUI_RectangleFill(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, back_color); GUI_Rectangle(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, disp_color); // 画窗口 GUI_HLine(win->x, win->y + 12, win->x + win->with - 1, disp_color); // 画标题目栏 GUI_RLine(win->x + 12, win->y, win->y + 12, disp_color); // 画关闭窗号按钮 GUI_Line(win->x, win->y, win->x + 12, win->y + 12, disp_color); GUI_Line(win->x + 12, win->y, win->x, win->y + 12, disp_color); /* 写标题 */ if( win->title != NULL ) { str = win->title; bak = win->x + 15; bak1 = win->y + 3; bak2 = win->x + win->with -1; while(1) { if( (bak+8) > bak2 ) break; // 判断标题是否溢出 if(*str=='\0') break; // 判断字符串是否结束 GUI_PutChar(bak, bak1, *str++); // 显示标题 bak += 6; } } /* 写状态栏 */ if( win->state != NULL ) { if( win->hight < 60) return(0); // 判断是否可以画状态栏 /* 画状态栏 */ GUI_HLine(win->x, win->y + win->hight - 11, win->x + win->with - 1, disp_color); str = win->state; bak = win->x + 3; bak1 = win->y + win->hight - 9; bak2 = win->x + win->with -1; while(1) { if( (bak+8) > bak2 ) break; // 判断标题是否溢出 if(*str=='\0') break; // 判断字符串是否结束 GUI_PutChar(bak, bak1, *str++); // 显示标题 bak += 6; } } return(1); }
/**************************************************************************** * 名称:GUI_SMenuHide() * 功能:消隐子菜单项。 * 入口参数:men 子菜单句柄 * 出口参数:返回0表示操作失败,返回1表示操作成功 ****************************************************************************/ uint8 GUI_SMenuHide(SMENU *men) { WINDOWS *mwin; uint8 xx, yy; mwin = men->win; /* 判断是否可以显示主菜单 */ if( (mwin->hight)<50 ) return(0); if( (mwin->with)<50 ) return(0); /* 画菜子单项。下拉子菜单,以向左下拉为原则,若右边溢出则以右下拉显示 */ xx = mwin->x; xx += (men->mmenu_no)*MMENU_WIDTH; yy = mwin->y + 22; yy += (men->no) * 11 + 2; if( (xx+SMENU_WIDTH) <= (mwin->x + mwin->with - 1) ) { /* 以左下拉为原则显示子菜单 */ if( (men->mmenu_no) == 0 ) { GUI_RectangleFill(xx+1, mwin->y + 22+1, xx+SMENU_WIDTH, yy, back_color); } else { GUI_RectangleFill(xx, mwin->y + 22+1, xx+SMENU_WIDTH, yy, back_color); } GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, disp_color); } else { /* 以右下拉为原则 */ if( (xx+MMENU_WIDTH) == (mwin->x + mwin->with - 1) ) { GUI_RectangleFill(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22+1, xx+MMENU_WIDTH-1, yy, back_color); } else { GUI_RectangleFill(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22+1, xx+MMENU_WIDTH, yy, back_color); } GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, disp_color); } return(1); }
/**************************************************************************** * 名称:GUI_WindowsHide() * 功能:消隐窗口。 * 入口参数:win 窗口句柄 * 出口参数:返回0表示操作失败,返回1表示操作成功 ****************************************************************************/ uint8 GUI_WindowsHide(WINDOWS *win) { /* 参数过滤,若窗口起出范围,则返回0 */ if( ( (win->with)<20 ) || ( (win->hight)<20 ) ) return(0); // 宽度、高度检查,限制最小窗口 if( (win->x + win->with ) > GUI_LCM_XMAX ) return(0); // 窗口宽度是否溢出 if( (win->y + win->hight ) > GUI_LCM_YMAX ) return(0); // 窗口高度是否溢出 /* 消隐窗口 */ GUI_RectangleFill(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, back_color); return(1); }
/**************************************************************************** * 名称:GUI_SMenuSelect() * 功能:选择新的子菜单。 * 入口参数:men 子菜单句柄 * old_no 原先选择的子菜单项 * new_no 现要选择的子菜单项 * 出口参数:无 ****************************************************************************/ void GUI_SMenuSelect(SMENU *men, uint8 old_no, uint8 new_no) { WINDOWS *mwin; uint8 xx, yy; /* 参数过滤 */ if(old_no==new_no) return; xx = men->no; if( (old_no>xx) || (new_no>xx) ) return; /* 设置新的选择的子菜单项 */ men->state = new_no; /* 进行菜单反相显示 */ mwin = men->win; xx = mwin->x; xx += (men->mmenu_no)*MMENU_WIDTH; if( (xx+SMENU_WIDTH) > (mwin->x + mwin->with - 1) ) { /* 以右下拉为原则显示子菜单,所以xx设置在左端 */ xx = xx-(SMENU_WIDTH-MMENU_WIDTH); } xx++; /* 取消原子菜单选择 */ yy = mwin->y + 22 + 2; yy += old_no*11; GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, back_color); GUI_PutNoStr(xx+1, yy+1, men->str[old_no], 8); /* 选择新的子菜单 */ yy = mwin->y + 22 + 2; yy += new_no*11; GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, disp_color); GUI_ExchangeColor(); GUI_PutNoStr(xx+1, yy+1, men->str[new_no], 8); GUI_ExchangeColor(); }
/**************************************************************************** * 名称:GUI_WindowsClr() * 功能:清屏窗口。 * 入口参数:win 窗口句柄 * 出口参数:无 * 说明:使用此函数前要先使用GUI_WindowsDraw()将窗口画出。 ****************************************************************************/ void GUI_WindowsClr(WINDOWS *win) { uint8 x0, y0; uint8 x1, y1; /* 设置要清屏的区域 */ x0 = win->x + 1; x1 = win->x + win->with - 2; y0 = win->y + 13; y1 = win->y + win->hight - 2; if( win->state != NULL ) // 判断是否有状态栏 { if( win->hight >= 60) { y1 = win->y + win->hight - 12; } } /* 使用填充矩形实现清屏 */ GUI_RectangleFill(x0, y0, x1, y1, back_color); }
/**************************************************************************** * 名称:GUI_SMenuDraw() * 功能:显示子菜单,加上边框。 * 入口参数:men 子菜单句柄 * 出口参数:返回0表示操作失败,返回1表示操作成功 ****************************************************************************/ uint8 GUI_SMenuDraw(SMENU *men) { WINDOWS *mwin; uint32 xx, yy; uint8 i; mwin = men->win; /* 判断是否可以显示主菜单 */ if( (mwin->hight)<50 ) return(0); if( (mwin->with)<50 ) return(0); /* 画菜子单项。下拉子菜单,以向左下拉为原则,若右边溢出则以右下拉显示 */ xx = mwin->x; xx += (men->mmenu_no)*MMENU_WIDTH; yy = mwin->y + 22; yy += (men->no) * 11 + 2; if( (xx+SMENU_WIDTH) <= (mwin->x + mwin->with - 1) ) { /* 以左下拉为原则显示子菜单 */ if( (men->mmenu_no) == 0 ) { GUI_RLine(xx+SMENU_WIDTH, mwin->y + 22, yy, disp_color); GUI_HLine(xx, yy, xx+SMENU_WIDTH, disp_color); } else { GUI_Rectangle(xx, mwin->y + 22, xx+SMENU_WIDTH, yy, disp_color); } GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, back_color); } else { /* 以右下拉为原则 */ if( (xx+MMENU_WIDTH) == (mwin->x + mwin->with - 1) ) { GUI_RLine(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22, yy, disp_color); GUI_HLine(xx-(SMENU_WIDTH-MMENU_WIDTH), yy, xx+MMENU_WIDTH, disp_color); } else { GUI_Rectangle(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22, xx+MMENU_WIDTH, yy, disp_color); } GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, back_color); xx = xx-(SMENU_WIDTH-MMENU_WIDTH); } /* 显示菜单文字 */ xx++; yy = mwin->y + 22 + 2; for(i=0; i<(men->no); i++) { if( i == (men->state) ) // 判断所选择的菜单项 { /* 显示背景色 */ GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, disp_color); /* 显示菜单字符 */ GUI_ExchangeColor(); GUI_PutNoStr(xx+1, yy+1, men->str[i], 8); // 书写子菜单文字 GUI_ExchangeColor(); } else { /* 显示背景色 */ GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, back_color); /* 显示菜单字符 */ GUI_PutNoStr(xx+1, yy+1, men->str[i], 8); // 书写子菜单文字 } yy += 11; } return(1); }