📄 menu.c
字号:
// menu.c
//
#include "includes.h"
// 菜单信息结构
MenuInfor MenuInforFile = {"文件",1,20,10,24,12,1,4};
MenuInfor MenuInforNew = {"新建",1,20,10,24,12,1,2};
MenuInfor MenuInforEmpy = {"空白",1,20,10,24,12,1,0};
MenuInfor MenuInforTemplate = {"模板",1,20,50,24,12,0,0};
MenuInfor MenuInforOpen = {"打开",1,20,40,24,12,0,0};
MenuInfor MenuInforClose = {"关闭",1,20,70,24,12,0,0};
MenuInfor MenuInforSave = {"保存",1,20,100,24,12,0,0};
MenuInfor MenuInforEdit = {"编辑",1,20,50,24,12,0,4};
MenuInfor MenuInforCut = {"剪切",1,20,10,24,12,1,0};
MenuInfor MenuInforCopy = {"复制",1,20,40,24,12,0,0};
MenuInfor MenuInforPaste = {"粘贴",1,20,70,24,12,0,0};
MenuInfor MenuInforFind = {"查找",1,20,100,24,12,0,0};
MenuInfor MenuInforRoot = {"欢迎",1,20,40,24,12,0,2};
// 父菜单---文件
struct Menu MenuFile = {&MenuInforFile,&MenuRoot,&MenuNew,&MenuEdit,&MenuEdit};
struct Menu MenuNew = {&MenuInforNew,&MenuFile,&MenuEmpy,&MenuSave,&MenuOpen}; // 新建
struct Menu MenuEmpy = {&MenuInforEmpy,&MenuNew,0,&MenuTemplate,&MenuTemplate}; // 空白文件
struct Menu MenuTemplate = {&MenuInforTemplate,&MenuNew,0,&MenuEmpy,&MenuEmpy}; // 模板
struct Menu MenuOpen = {&MenuInforOpen,&MenuFile,0,&MenuNew,&MenuClose}; // 打开
struct Menu MenuClose= {&MenuInforClose,&MenuFile,0,&MenuOpen,&MenuSave}; // 关闭
struct Menu MenuSave = {&MenuInforSave,&MenuFile,0,&MenuClose,&MenuNew}; // 保存
// 父菜单
struct Menu MenuEdit ={&MenuInforEdit,&MenuRoot,&MenuCut,&MenuFile,&MenuFile}; // 编辑
struct Menu MenuCut ={&MenuInforCut,&MenuEdit,0,&MenuFind,&MenuCopy}; // 剪切
struct Menu MenuCopy ={&MenuInforCopy,&MenuEdit,0,&MenuCut,&MenuPaste}; // 复制
struct Menu MenuPaste ={&MenuInforPaste,&MenuEdit,0,&MenuCopy,&MenuFind}; // 粘贴
struct Menu MenuFind ={&MenuInforFind,&MenuEdit,0,&MenuPaste,&MenuCut}; // 查找
struct Menu MenuRoot = {&MenuInforRoot,0,&MenuFile,0,0}; // 开始时候的菜单
void onBeforeKey(struct Menu* pCurMenu)
{
uchar uLeft,uTop,uRight,uBottom;
uLeft = pCurMenu->PMenuInfor->offX;
uTop = pCurMenu->PMenuInfor->offY;
uRight = uLeft + pCurMenu->PMenuInfor->Height;
uBottom = uTop + pCurMenu->PMenuInfor->Width;
pCurMenu->PMenuInfor->bIsFocus = 0; // 当前子菜单失去焦点
RectBlock(uLeft - 5,uTop - 5,uRight + 5 ,uBottom + 5,0 ); // 当前子菜单失去黑色边框
pCurMenu->pLeftMenu->PMenuInfor->bIsFocus = 1; // 左边兄弟菜单项获得焦点
*pCurMenu = *(pCurMenu->pLeftMenu); // 当前菜单项转为左边兄弟菜单项
}
void onAfterKey(struct Menu* pCurMenu)
{
uchar uLeft,uTop,uRight,uBottom;
uLeft = pCurMenu->PMenuInfor->offX;
uTop = pCurMenu->PMenuInfor->offY;
uRight = uLeft + pCurMenu->PMenuInfor->Height;
uBottom = uTop + pCurMenu->PMenuInfor->Width;
pCurMenu->PMenuInfor->bIsFocus = 0; // 当前子菜单失去焦点
RectBlock(uLeft - 5,uTop - 5,uRight + 5 ,uBottom + 5,0 ); // 当前子菜单失去黑色边框
pCurMenu->pRightMenu->PMenuInfor->bIsFocus = 1; // 右边兄弟菜单项获得焦点
*pCurMenu = *(pCurMenu->pRightMenu); // 当前菜单项转为左边兄弟菜单项
}
void onOkKey(struct Menu* pCurMenu)
{
if(pCurMenu->pChildMenu != 0)
{
pCurMenu->PMenuInfor->bIsFocus = 0; // 当前父菜单项失去焦点
pCurMenu->pChildMenu->PMenuInfor->bIsFocus = 1; // 默认第一子菜单项获得焦点
*pCurMenu = *(pCurMenu->pChildMenu); // 菜单转化为子菜单
}
else
{
return;
}
}
void onCancelKey(struct Menu* pCurMenu)
{
if(pCurMenu->pParentMenu != 0)
{
pCurMenu->PMenuInfor->bIsFocus = 0; // 当前菜单项失去焦点
pCurMenu->pParentMenu->PMenuInfor->bIsFocus = 1; // 父菜单项获得焦点
*pCurMenu = *(pCurMenu->pParentMenu);
}
else
{
return;
}
}
void PutPixel(uchar x, uchar y, uchar mode)
{
fnSetPos(x,y);
if(mode) // mode != 0
fnCW0P(LC_BIT_OP | 0x08 | (7-(y % 8)));
else
fnCW0P(LC_BIT_OP | 0x00 | (7-(y % 8)));
}
uchar ReverPrin(uchar *ptr)
{
uchar c1,c2;
uchar *tmpBuf; // LCD显示数据缓冲区
uchar i=0,j=0,j1=0,k,uLen=0,uRow,uCol,uVal=0;
const typFNT_GB12 data1 ;
uchar uIndex1,uIndex2; // 存储汉字的索引
uchar uMask1,uMask2; // 1个字横向字模信息的2个字节
uchar k1,k2;
while (ptr[uLen]!=0)
{
uLen++; ////探测字串长度
};
tmpBuf = ptr;
i = 0;
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0x20 && c1 <= 0x7f) // 0x20---0x7f
{ // ASCII 的 12行 * 6列 字符显示
for( j = 0; j < 12; j++) // 逐行显示
{
for ( k = 0; k < 6; k++) // 逐列显示
{
cursor(uRow + j,uCol + k); // 置当前显示地址
k1 = (uCol + k) & 0x07 ; // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
// 每字节8个像素点,从左到右为01234567点,
// 对应数据的76543210位
k2 = 7 - k1; // 当前屏幕点属于的字节单元的位
k1 = BIT(7-k); // 当前屏幕点属于的字节单元的数据的第7-k个数据位置1,其余置0
uVal = pgm_read_byte(ASCII_TBL+(c1-0x20)*12 + j);
k1 = ( uVal & k1 ) == k1 ? 1 : 0; // 测试对应字库中字的第j行1字节数据中的7-k个数据位是否为1
if(k1 == 0)
fnCW0P(LC_BIT_OP | 0x08 | k2 ); // 反转显示
else
fnCW0P(LC_BIT_OP | k2 ); // 反转显示
}
}
cursor(uRow ,uCol + 6); // 下一个字符
i++;
}
else // 0x80 -- 0xff
{ // 中文12行*12列汉字显示
for(j1 = 0; j1 < sizeof(GB_12)/sizeof(GB_12[0]);j1 ++) // 找字
{
memcpy_P(&data1, &GB_12[j1], sizeof(typFNT_GB12)); // 从程序区拷贝一个结构体数据
uIndex1 = data1.Index[0];
uIndex2 = data1.Index[1];
if(c1 == uIndex1 && c2 == uIndex2)
break;
}
if(j1 >= sizeof(GB_12)/sizeof(GB_12[0]) ) // 找不到,屏幕就是空白
return 0;
for( j=0;j<12;j++) // 逐行显示
{
for ( k = 0; k < 8; k++) // 逐列显示
{
cursor(uRow + j,uCol + k); // 置当前显示地址
k1 = (uCol + k) & 0x07 ; // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
// 每字节8个像素点,从左到右为01234567点,
// 对应数据的76543210位
k2 = 7 - k1; // 当前屏幕点属于的字节单元的位
k1 = BIT(7 - (k & 0x07)); // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
memcpy_P(&data1, &GB_12[j1], sizeof(typFNT_GB12));
uMask1 = data1.Msk[2*j];
k1 = (uMask1 & k1 ) == k1 ? 1 : 0; // 汉字左边部分
if(k1 == 0) // 反转显示
fnCW0P(LC_BIT_OP | 0x08 | k2 );
else
fnCW0P(LC_BIT_OP | k2 ); // 反转显示
}
for ( k = 0; k < 4; k++) // 逐列显示
{
cursor(uRow + j,uCol + k +8); // 置当前显示地址
k1 = (uCol + k + 8) & 0x07 ; // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
// 每字节8个像素点,从左到右为01234567点,
// 对应数据的76543210位
k2 = 7 - k1; // 当前屏幕点属于的字节单元的位
k1 = BIT(7 - (k & 0x07)); // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
uMask2 = data1.Msk[2*j+1];
k1 = (uMask2 & k1 ) == k1 ? 1 : 0; // 汉字右边部分
if(k1 == 0) // 反转显示
fnCW0P(LC_BIT_OP | 0x08 | k2 );
else
fnCW0P(LC_BIT_OP | k2 ); // 反转显示
}
}
cursor(uRow ,uCol + 13); // 下一个汉字
i +=2; // 在字符串中一个汉字占2个字节
}
}
return uLen;
}
// chRight 画矩形
void RectBlock(uchar chLeft,uchar chTop,uchar chRight,uchar chBottom,uchar mode)
{
uchar i,j;
if( chLeft > chRight) // 使 chLeft 不大于 chRight
{
i = chLeft;
chLeft = chRight;
chRight = i;
}
if( chTop > chBottom) // 使 chTop 不大于 chBottom
{
i = chTop;
chTop = chBottom;
chBottom = i;
}
if(chRight > 64 )
{
chRight = 64;
}
// if(chBottom > 127 )
// {
// chBottom = 110;
// }
for( i = chLeft; i <= chRight; i++) // 逐个点画
for( j = chTop; j <= chBottom;j++)
{
PutPixel(i,j,mode);
}
}
void MenuDis(MenuInfor * pMenuInfor)
{
uchar chX,chY;
if(pMenuInfor == 0)
return;
chX = pMenuInfor->offX;
chY = pMenuInfor->offY;
cursor(chX,chY);
if( pMenuInfor->bIsFocus == 1) // 反转显示
{
RectBlock(chX - 5,chY -5,chX + pMenuInfor->Height + 5,chY + pMenuInfor->Width + 5,1); // 现将背景填黑
ReverPrin(pMenuInfor->strChinese);
}
else // 不反转显示
{
dprintf(pMenuInfor->strChinese);
}
}
void DisPaly(struct Menu * pCurMenu)
{
uchar i=0;
if(pCurMenu->pParentMenu == 0) // 如果是根菜单,直接显示
{
MenuDis(pCurMenu->PMenuInfor); // 根菜单显示
return;
}
uchar ucNum = pCurMenu->pParentMenu->PMenuInfor->subMenuNum; // 兄弟菜单项的个数
for(i = 0; i < ucNum; i++ )
{
MenuDis(pCurMenu->PMenuInfor); // 菜单显示
pCurMenu = pCurMenu->pRightMenu;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -