📄 menu.c
字号:
/****************************************************************************************
* 文件名:MENU.C
* 功能:菜单显示及操作(下拉式菜单)。
* 备注:使用GUI_SetBackColor()函数设置显示颜色及背景色。
****************************************************************************************/
#include "..\APP\config.h"
#ifndef GUI_MenuDown_EN
#define GUI_MenuDown_EN 0
#endif
/****************************************************************************
* 名称:GUI_ExchangeColor()
* 功能:交换前景色与背景色。用于反相显示。
* 入口参数:无
* 出口参数:无
* 说明:
****************************************************************************/
void GUI_ExchangeColor(void)
{ // uint8 bakc;
// bakc = Back_G;
// Back_G = other_C;
// other_C = bakc;
/* GUI_CopyColor(&bakc, disp_color);
GUI_CopyColor(&disp_color, back_color);
GUI_CopyColor(&back_color, bakc);
*/
}
#if GUI_MenuDown_EN==1
/****************************************************************************
* 名称:GUI_MMenuDraw()
* 功能:显示主菜单,加上边框。
* 入口参数:men 主菜单句柄
* 出口参数:返回0表示操作失败,返回1表示操作成功
****************************************************************************/
uint8 GUI_MMenuDraw(MMENU *men)
{ WINDOWS *mwin;
uint8 i;
uint8 xx;
/* 参数过滤 */
if( (men->no)==0 ) return(0);
mwin = men->win; // 取得窗口句柄
/* 判断是否可以显示主菜单 */
if( (mwin->hight)<50 ) return(0);
if( (mwin->with)<50 ) return(0);
/* 画菜单条,并显示菜主单 */
GUI_HLine(mwin->x, mwin->y + 19, mwin->x + mwin->with - 1, Windows_C);
xx = mwin->x;
for(i=0; i<(men->no); i++)
{ if( (xx+MMENU_WIDTH) > (mwin->x + mwin->with) ) return(0);
GUI_PutNoStr(xx+4, mwin->y + 12, men->str[i], 4); // 书写主菜单文字
xx += MMENU_WIDTH;
GUI_RLine(xx, mwin->y + 12, mwin->y + 19, Windows_C); // 显示主菜单分界线
}
return(1);
}
/****************************************************************************
* 名称:GUI_MMenuSelect()
* 功能:当前主菜单,反色,表示当前主菜单。
* 入口参数:men 主菜单句柄
* no 所选的主菜单项
* 出口参数:无
****************************************************************************/
void GUI_MMenuSelect(MMENU *men, uint8 no)
{ WINDOWS *mwin;
uint8 xx;
/* 参数过滤 */
if( (men->no)==0 ) return;
if( no>(men->no) ) return;
mwin = men->win; // 取得窗口句柄
/* 判断是否可以显示主菜单 */
if( (mwin->hight)<50 ) return;
if( (mwin->with)<50 ) return;
/* 显示下划线 */
xx = mwin->x + (no)*MMENU_WIDTH;
GUI_ExchangeColor();
GUI_PutNoStr(xx+4, mwin->y + 12, men->str[no], 4); // 书写主菜单文字
GUI_ExchangeColor();
// GUI_HLine(xx+1, mwin->y + 22-1, xx+MMENU_WIDTH- 1, Windows_C);
}
/****************************************************************************
* 名称:GUI_MMenuNSelect()
* 功能:取消当前主菜单,去除反色
* 入口参数:men 主菜单句柄
* no 所选的主菜单项
* 出口参数:无
****************************************************************************/
void GUI_MMenuNSelect(MMENU *men, uint8 no)
{ WINDOWS *mwin;
uint8 xx;
/* 参数过滤 */
if( (men->no)==0 ) return;
if( no>(men->no) ) return;
mwin = men->win; // 取得窗口句柄
/* 判断是否可以显示主菜单 */
if( (mwin->hight)<50 ) return;
if( (mwin->with)<50 ) return;
/* 显示下划线 */
xx = mwin->x + no*MMENU_WIDTH;
GUI_PutNoStr(xx+4, mwin->y + 12, men->str[no], 4); // 书写主菜单文字
}
/****************************************************************************
* 名称:GUI_SMenuDraw()
* 功能:显示子菜单,加上边框。
* 入口参数:men 子菜单句柄
* 出口参数:返回0表示操作失败,返回1表示操作成功
****************************************************************************/
uint8 GUI_SMenuDraw(SMENU *men)
{ WINDOWS *mwin;
uint8 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 + 19;
yy += (men->no) * 8 + 2;
if( (xx+SMENU_WIDTH) <= (mwin->x + mwin->with - 1) )
{ /* 以左下拉为原则显示子菜单 */
if( (men->mmenu_no) == 0 )
{
GUI_RLine(xx+SMENU_WIDTH, mwin->y + 19, yy, Windows_C);
GUI_HLine(xx, yy, xx+SMENU_WIDTH, Windows_C);
}
else
{ GUI_Rectangle(xx, mwin->y + 19, xx+SMENU_WIDTH, yy, Windows_C);
}
GUI_HLine(xx+1, mwin->y + 19, xx+MMENU_WIDTH-1, Back_G );
}
else
{ /* 以右下拉为原则 */
if( (xx+MMENU_WIDTH) == (mwin->x + mwin->with - 1) )
{ GUI_RLine(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 19, yy, Windows_C);
GUI_HLine(xx-(SMENU_WIDTH-MMENU_WIDTH), yy, xx+MMENU_WIDTH, Windows_C);
}
else
{
GUI_Rectangle(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 19, xx+MMENU_WIDTH, yy,Windows_C);
}
GUI_HLine(xx+1, mwin->y + 19, xx+MMENU_WIDTH-1,Back_G );
xx = xx-(SMENU_WIDTH-MMENU_WIDTH);
}
/* 显示菜单文字 */
xx++;
yy = mwin->y + 19 + 2;
for(i=0; i<(men->no); i++)
{ if( i == (men->state) ) // 判断所选择的菜单项
{ /* 显示背景色 */
GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+8, Windows_C);
/* 显示菜单字符 */
GUI_ExchangeColor();
GUI_PutNoStr(xx+1, yy+1, men->str[i], 8); // 书写子菜单文字
GUI_ExchangeColor();
}
else
{ /* 显示背景色 */
GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+8,Windows_C);
/* 显示菜单字符 */
GUI_PutNoStr(xx+1, yy+1, men->str[i], 8); // 书写子菜单文字
}
yy += 8;
}
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 + 19 + 2;
yy += old_no*8;
GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+8, Windows_C);
GUI_PutNoStr(xx+1, yy+1, men->str[old_no], 8);
/* 选择新的子菜单 */
yy = mwin->y + 19 + 2;
yy += new_no*8;
GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+8, Windows_C);
GUI_ExchangeColor();
GUI_PutNoStr(xx+1, yy+1, men->str[new_no], 8);
GUI_ExchangeColor();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -