📄 menu.c
字号:
/*
********************************************************************************
*
* LCD控制程序
*
* 这是一个菜单模块
*
* 文件名 : MENU.C
* 设计者 : Terry
********************************************************************************
* 功 能 描 述
*
* 完成自动调整处理,该自动调整包括:
* 时钟,时钟相位,水平位置,垂直位置
********************************************************************************
*/
#include "osd.h"
#include "global.h"
#include "scalar.h"
#define ShortAdjStrColor YELLOW
uint8 KeyMenuCursor;
uint8 SubMenuCursor;
uint8 xdata MaxSubMenuItem;
uint8 MenuState; // 菜单状态
uint8 xdata FontIndexBuf;
static void MenuShowKey(void);
static void MenuVgaSubItem(void);
static void MenuDviSubItem(void);
static void MenuShowExit(void);
static void MenuShowSubItem5(void);
static void ShowSubItemAudio(void);
static void MenuShowShortBri(void);
static void MenuShowShortCon(void);
#if EN_ACEROSD
static void MenuShowSubItemOSD(void);
#endif
static void MenuShowSubItemAudio(void);
static void MenuShowSubItemTools(void);
#if EN_ACEROSD
#else
static void MenuShowReturn(void);
static void MenuShowSubItemGBC(void);
static void MenuShowSubItemColor(void);
#endif
void MenuShowRes(void);
// No; 窗口号
// Hs; 水平起始位置,单位是字符
// He; 水平结束位置,单位是字符
// Vs; 垂直起始位置,单位是字符
// Ve; 垂直结束位置,单位是字符
// Attr; 窗口属性
// Color; 窗口的背景颜色,将取代字符的背景色
// SdColor; 阴影的颜色
// BL_Width; 窗口边框的宽度
// BL_RCL; 窗口边框的右边颜色
// BL_LCL; 窗口边框的左边颜色
/*
********************************************************************************
* 函 数 名: MenuInit
* 功能描述: 菜单系统初始化
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void MenuInit(void)
{
MenuState = MENU_OFF; // 菜单状态
KeyMenuCursor = 0;
}
uint8 code LangIndex[] = {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9};
/*
********************************************************************************
* 函 数 名: MenuGetStrPos
* 功能描述: 根据系统当前所选择的语言,从变长字符串当中返回字符串的起始位置
* 输 入: str : 字符型指针,指向要处理的字符数组
* 返 回: 变长的多国语言字符的起始位置。起始的第一个字符是字符串的长度,紧
* 接着是字符的内容。
********************************************************************************
*/
uint16 MenuGetStrPos(uint8 *str)
{
uint16 Pos;
uint8 i,lang;
Pos = 0;
lang = LangIndex[Language];
for (i = 0; i< lang; i++) {
Pos += str[Pos] + 1;
}
return Pos;
}
/*
********************************************************************************
* 函 数 名: MenuShowStr
* 功能描述: 显示多国语言字符串,
* 输 入: x : 水平位置
* y : 垂直位置
* str : 字符串指针
* color : 显示颜色
* 返 回: str指向多国语变长字符串。起始的第一个字符是字符串的长度,紧
* 接着是字符的内容。
********************************************************************************
*/
void MenuShowStr(uint8 x, uint8 y, uint8 *str, uint8 color)
{
uint16 Pos;
uint8 i, lang;
Pos = 0;
lang = LangIndex[Language];
for (i = 0; i< lang; i++) {
Pos += str[Pos] + 1;
}
OsdAttrib(OSD_1BITFONT, color);
OsdSpecPrint(x, y, str + Pos);
}
#if USE_AUDIO
#if EN_ACEROSD
uint8 code VgaKeyItem[6][2][2] = {
{{0x10, ICON_PICTURE}, {0x14, ICON_PICTURE}}, //Picture
{{0x18, ICON_OSD}, {0x14, ICON_OSD}}, //OSD
{{0x18, ICON_AUDIO}, {0x1C, ICON_AUDIO}}, //Audio
{{0x20, ICON_TOOLS}, {0x24, ICON_TOOLS}}, //Tools
{{0x28, ICON_INFORMATION}, {0x2C, ICON_INFORMATION}}, //Information
{{0x30, ICON_KEYFRAME}, {0x34, ICON_KEYFRAME}}, //KeyFrame
};
#else
uint8 code VgaKeyItem[6][2] = {
{0x10, 0}, //Picture
{0x14, 1}, //OSD
{0x18, 2}, //Audio
{0x20, 3}, //Tools
{0x24, 4}, //Information
{0x28, 5}, //KeyFrame
};
#endif
#else
#if EN_ACEROSD
uint8 code VgaKeyItem[5][2][2] = {
{{0x10, ICON_PICTURE}, {0x14, ICON_PICTURE}}, //Picture
{{0x18, ICON_OSD}, {0x14, ICON_OSD}}, //OSD
// {{0x18, ICON_AUDIO}, {0x1C, ICON_AUDIO}}, //Audio
{{0x20, ICON_TOOLS}, {0x24, ICON_TOOLS}}, //Tools
{{0x28, ICON_INFORMATION}, {0x2C, ICON_INFORMATION}}, //Information
{{0x30, ICON_KEYFRAME}, {0x34, ICON_KEYFRAME}}, //KeyFrame
};
#else
uint8 code VgaKeyItem[5][2] = {
{0x10, 0},
{0x14, 1},
{0x18, 2},
{0x20, 4},
{0x24, 5},
};
#endif
#endif
OSDWIN code KeyMenuWin = {
WIN7, // No; 窗口号
0, // Hs; 水平起始位置,单位是字符
OSD_FRAME_WIDTH-1, // He; 水平结束位置,单位是字符
0, // Vs; 垂直起始位置,单位是字符
1, // Ve; 垂直结束位置,单位是字符
0x00, // Attr; 窗口属性
LIGHTGRAY, // Color; 窗口的背景颜色,将取代字符的背景色
DARKGRAY, // SdColor; 阴影的颜色
0x02, // BL_Width; 窗口边框的宽度
DARKGRAY, // BL_RCL; 窗口边框的右边颜色
WHITE, // BL_LCL; 窗口边框的左边颜色
};
OSDWIN code BackMenuWin = {
#if EN_ACEROSD
WIN8, // No; 窗口号
0, // Hs; 水平起始位置,单位是字符
OSD_FRAME_WIDTH-1, // He; 水平结束位置,单位是字符
0, // Vs; 垂直起始位置,单位是字符
OSD_FRAME_HEIGHT-1, // Ve; 垂直结束位置,单位是字符
0,// WIN_EN_BEVEL + WIN_BL_TYPE2, // Attr; 窗口属性
BACKWINPALETTE, // Color; 窗口的背景颜色,将取代字符的背景色
DARKGRAY, // SdColor; 阴影的颜色
0x00, // BL_Width; 窗口边框的宽度
DARKGRAY, // BL_RCL; 窗口边框的右边颜色
WHITE, // BL_LCL; 窗口边框的左边颜色
#else
WIN8, // No; 窗口号
0, // Hs; 水平起始位置,单位是字符
OSD_FRAME_WIDTH-1, // He; 水平结束位置,单位是字符
0, // Vs; 垂直起始位置,单位是字符
OSD_FRAME_HEIGHT-1, // Ve; 垂直结束位置,单位是字符
WIN_EN_BEVEL + WIN_BL_TYPE2, // Attr; 窗口属性
LIGHTGRAY, // Color; 窗口的背景颜色,将取代字符的背景色
DARKGRAY, // SdColor; 阴影的颜色
0x00, // BL_Width; 窗口边框的宽度
DARKGRAY, // BL_RCL; 窗口边框的右边颜色
WHITE, // BL_LCL; 窗口边框的左边颜色
#endif
};
#if EN_ACEROSD
/*
********************************************************************************
* 函 数 名: MenuShowMainCornerIcon
* 功能描述: 显示主菜单四个倒角的图标+ 主菜单背景图标
* 输 入: 无
* 返 回: 无 //08-04-17
********************************************************************************
*/
static void MenuShowMainCornerIcon(void)
{
uint8 Icon;
uint8 xdata buf[7];
OsdAttrib(OSD_2BITFONT, PALETTE_MAINCORNER);
Icon = ICON_MAINCORNER;
buf[0] = Icon++;
OsdShowStr(BackMenuWin.Hs,BackMenuWin.Vs,buf,1);
buf[0] = Icon++;
OsdShowStr(BackMenuWin.He,BackMenuWin.Vs,buf,1);
buf[0] = Icon++;
OsdShowStr(BackMenuWin.Hs,BackMenuWin.Ve,buf,1);
buf[0] = Icon++;
OsdShowStr(BackMenuWin.He,BackMenuWin.Ve,buf,1);
OsdAttrib(OSD_2BITFONT, WHITE - 1);
for(Icon=0; Icon<7; Icon++) buf[Icon] = ICON_LOGOTEST + Icon;
OsdShowStr(BackMenuWin.Hs+1, BackMenuWin.Vs+1,buf,7);
}
#endif
/*
********************************************************************************
* 函 数 名: MenuShowKey
* 功能描述: 显示主菜单项目,6个3*2的图标,
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
static void MenuShowKey(void)
{
uint8 i;
#if EN_ACEROSD
#if USE_AUDIO
for (i = 0; i < 5; i++)
{
OsdAttrib(OSD_2BITFONT, VgaKeyItem[i][0][0]);
OsdShowIcon(BackMenuWin.Hs + 1, BackMenuWin.Vs + SubMenuWin.Vs + 1 + i * 4, VgaKeyItem[i][0][1]);
OsdAttrib(OSD_2BITFONT, VgaKeyItem[5][0][0]);
OsdShowIconFrame(BackMenuWin.Hs, BackMenuWin.Vs + SubMenuWin.Vs + i * 4, VgaKeyItem[5][0][1]);
}
#else
for (i = 0; i < 4; i++)
{
OsdAttrib(OSD_2BITFONT, VgaKeyItem[i][0][0]);
OsdShowIcon(BackMenuWin.Hs + 1, BackMenuWin.Vs + SubMenuWin.Vs + 1 + i * 4, VgaKeyItem[i][0][1]);
OsdAttrib(OSD_2BITFONT, VgaKeyItem[4][0][0]);
OsdShowIconFrame(BackMenuWin.Hs, BackMenuWin.Vs + SubMenuWin.Vs + i * 4, VgaKeyItem[4][0][1]);
}
#endif
#else
#if USE_AUDIO
for (i = 0; i < 6; i++)
{
OsdAttrib(OSD_2BITFONT, VgaKeyItem[i][0]);
OsdShowIcon(BackMenuWin.Hs + 2 + (i<<2), BackMenuWin.Vs + 1, VgaKeyItem[i][1]);
}
#else
for (i = 0; i < 5; i++) {
OsdAttrib(OSD_2BITFONT, VgaKeyItem[i][0]);
OsdShowIcon(BackMenuWin.Hs + 2 + i * 5, BackMenuWin.Vs + 1, VgaKeyItem[i][1]);
}
#endif
#endif
}
OSDWIN code SubMenuWin = {
#if EN_ACEROSD
WIN7, // No; 窗口号
6, // Hs; 水平起始位置,单位是字符
OSD_FRAME_WIDTH-1, // He; 水平结束位置,单位是字符
3, // Vs; 垂直起始位置,单位是字符
OSD_FRAME_HEIGHT-4, // Ve; 垂直结束位置,单位是字符
//WIN_EN_BEVEL + WIN_BL_TYPE2 + WIN_EN_MIX, // Attr; 窗口属性
0, //WIN_EN_BEVEL + WIN_BL_TYPE2,
SUBWINPALETTE,
DARKGRAY, // SdColor; 阴影的颜色
0x00, // BL_Width; 窗口边框的宽度
WHITE, // BL_RCL; 窗口边框的右边颜色
DARKGRAY,
#else
WIN7, // No; 窗口号
1, // Hs; 水平起始位置,单位是字符
OSD_FRAME_WIDTH-2, // He; 水平结束位置,单位是字符
4, // Vs; 垂直起始位置,单位是字符
OSD_FRAME_HEIGHT-2, // Ve; 垂直结束位置,单位是字符
//WIN_EN_BEVEL + WIN_BL_TYPE2 + WIN_EN_MIX, // Attr; 窗口属性
WIN_EN_BEVEL + WIN_BL_TYPE2,
LIGHTGRAY, // Color; 窗口的背景颜色,将取代字符的背景色
DARKGRAY, // SdColor; 阴影的颜色
0x00, // BL_Width; 窗口边框的宽度
WHITE, // BL_RCL; 窗口边框的右边颜色
DARKGRAY, // BL_LCL; 窗口边框的左边颜色
#endif
};
/*
********************************************************************************
* 函 数 名: MenuShowSubItem
* 功能描述: 显示不同输入信号条件下,各个子菜单的条目
* 输 入: 无
* 返 回: 无
* 注 意: 不同的输入条件下采用不同的菜单内容
********************************************************************************
*/
#if EN_ACEROSD
void MenuShowSubBlankIcon(uint8 x, uint8 y, uint8 Height)
{
uint8 i;
uint8 xdata buf[10];
for(i=0;i<10;i++) buf[i] = ICON_BLANK;
OsdAttrib(OSD_2BITFONT, BACKWINPALETTE);
for(i=y; i<Height+1; i=i+2)
OsdShowStr(x,i,buf,10);
}
#endif
void MenuShowSubItem(void)
{
#if EN_ACEROSD
OSDWIN xdata CursonWin;
OsdDisWindow(WIN1);
CursonWin.No = WIN1;
CursonWin.Hs = SubMenuWin.He - 14;
CursonWin.He = CursonWin.Hs + 9;
CursonWin.Vs = 0;
CursonWin.Ve = 0;
CursonWin.Attr = 0;//WIN_EN_BEVEL + WIN_BL_TYPE2;
CursonWin.BL_LCL = PALETTE_VALSCROLL;
CursonWin.BL_RCL = PALETTE_VALSCROLL;
CursonWin.BL_Width = 0x00;
CursonWin.Color = PALETTE_VALSCROLL;
#endif
FontIndex = FontIndexBuf;
Alignment = LEFT;
#if EN_ACEROSD
StringWidth = SubMenuWin.He - SubMenuWin.Hs - 1;
FontIndexBackup[9] = FontIndex;
#else
StringWidth = OSD_FRAME_WIDTH - 4;
#endif
switch (KeyMenuCursor) {
#if EN_ACEROSD
case 0:
#if USE_DAEWOO
CursonWin.Vs = SubMenuWin.Vs + 2;
CursonWin.Ve = CursonWin.Vs + 12;
#else
CursonWin.Vs = SubMenuWin.Vs + 4;
CursonWin.Ve = CursonWin.Vs + 12;
#endif
MenuShowSubItemImage(); //须增加部分参数 08-04-16
OsdSetWin(&CursonWin);
MenuShowSubBlankIcon(CursonWin.Hs, CursonWin.Vs, CursonWin.Vs + 2 * 6);
break;
case 1:
CursonWin.Vs = SubMenuWin.Vs + 2;
CursonWin.Ve = CursonWin.Vs + 6;
MenuShowSubItemOSD();
OsdSetWin(&CursonWin);
MenuShowSubBlankIcon(CursonWin.Hs, CursonWin.Vs, CursonWin.Vs + 2 * MaxSubMenuItem);
// MenuShowSubItemColor();
break;
#if USE_AUDIO
case 2:
CursonWin.Vs = SubMenuWin.Vs + 4;
CursonWin.Ve = CursonWin.Vs + 2;
MenuShowSubItemAudio();
OsdSetWin(&CursonWin);
MenuShowSubBlankIcon(CursonWin.Hs, CursonWin.Vs, CursonWin.Vs + 2);
break;
case 3:
CursonWin.Vs = SubMenuWin.Vs + 12;
CursonWin.Ve = CursonWin.Vs + 2;
MenuShowSubItemTools();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -