📄 menu.c
字号:
//
// 菜单显示
// by liaonh 2008/1
//
#include "test.h"
char gi_MenuReshow = 0;
void SetMenuReShow(int reshow)
{
gi_MenuReshow = reshow;
}
#define MENU_LINE_HEIGHT (FONT_HEIGHT*pset->ey+pset->linespace)
void DrawMenu(const Menu* pMenu,MenuSetting* pset)
{
int i;
int x,y;
x = pset->x;
y = pset->y;
SetBkColor(MENU_BKCOLOR);
SetTextMode(TM_TRANSPARENT);
SetHoriEnlarge(pset->ex);
SetVertEnlarge(pset->ey);
SetTextColor(MENU_CAPTIONCOLOR);
TextOut(pset->captionx,pset->captiony,pset->maincaption);
for( i = 0; i < pset->ItemCount; i++)
{
SetTextColor(( i == pset->CurrentItem ) ? MENU_SELCOLOR : MENU_TEXTCOLOR);
SetBkColor(( i == pset->CurrentItem ) ? MENU_SELBKCOLOR : MENU_BKCOLOR);
sprintf((char*)buf,"%c.%s",(i<10) ? (i+'0') : (i-10+'a'),pMenu[i].caption);
TextOut(x,y+i*MENU_LINE_HEIGHT,(char*)buf);
}
ResetTextOut();
}
void GetMenuItemSize(const Menu* pMenu,const MenuSetting* pset,int index,int* w,int* h)
{
*w = pset->ex*FONT_WIDTH*strlen(pMenu[index].caption);
*h = pset->ey*FONT_HEIGHT;
}
int GetMouseInItem(const Menu* pMenu,const MenuSetting* pset)
{
int i;
int x,y,w,h,rx,ry;
GetMouseLastPos(&x,&y);
Touch2Screen(&x,&y);
rx = pset->x;
ry = pset->y;
for( i = 0; i < pset->ItemCount; i++)
{
GetMenuItemSize(pMenu,pset,i,&w,&h);
if( IsPtInRect(x,y,rx,ry,w,h) )
{
// Tell4(x,y,rx,ry);
// Tell4(i,w,h,0);
return i;
}
ry += MENU_LINE_HEIGHT;
}
return -1;
}
int ExecMenuItem(const Menu* pMenu,MenuSetting* pset)
{
int ret;
if( pMenu[pset->CurrentItem].pAction != NULL )
{
gi_MenuReshow = 1;
ret = (*pMenu[pset->CurrentItem].pAction)(pMenu[pset->CurrentItem].para);
switch(ret)
{
case MENU_RETAIN: break;
case MENU_EXIT:
pset->toExit = 1;
pset->ExitCode = 0;
break;
}
if( gi_MenuReshow != 0 )
{
RestoreDesktop();
pset->NeedDrawMenu = 1;
}
}
else
{
if( pMenu[pset->CurrentItem].para != 0 )
{
pset->toExit = 1;
pset->ExitCode = pMenu[pset->CurrentItem].para;
}
else
{
printf("undefined MenuAction\r\n");
}
}
return 0;
}
int ExecMenu(const Menu* pMenu,MenuSetting* pset)
{
int ch = 0,bakch;
int myevent = 0;
pset->NeedDrawMenu = 1;
pset->ItemCount = 0;
while( pMenu[pset->ItemCount].caption != NULL )
{
pset->ItemCount++;
}
while( !pset->toExit)
{
if( pset->NeedDrawMenu )
{
DrawMenu(pMenu,pset);
pset->NeedDrawMenu = 0;
}
ch = FetchChar();
myevent = 1;
bakch = ch;
switch(ch)
{
case KEY_ESC:
pset->toExit = 1;
break;
case KEY_UP:
if( pset->CurrentItem > 0 )
pset->CurrentItem--;
else
pset->CurrentItem = pset->ItemCount-1;
pset->NeedDrawMenu = 1;
break;
case KEY_DOWN:
if( pset->CurrentItem < pset->ItemCount-1 )
pset->CurrentItem++;
else
pset->CurrentItem = 0;
pset->NeedDrawMenu = 1;
break;
case MOUSE_DOWN:
if( (ch = GetMouseInItem(pMenu,pset)) > -1 )
{
pset->CurrentItem = ch;
pset->NeedDrawMenu = 1;
}
else
{
myevent = 0;
}
pset->MouseDownItem = ch;
break;
case MOUSE_MOVE:
if( (ch = GetMouseInItem(pMenu,pset)) > -1 )
{
pset->NeedDrawMenu = 1;
pset->CurrentItem = ch;
}
else
{
myevent = 0;
}
break;
case MOUSE_RELEASE:
if( (ch = GetMouseInItem(pMenu,pset)) > -1 )
{
pset->CurrentItem = ch;
//Tell2(ch,pset->MouseDownItem);
if( ch == pset->MouseDownItem )
{
ExecMenuItem(pMenu,pset);
}
}
else
myevent = 0;
pset->MouseDownItem = -1;
break;
case KEY_ENTER:
ExecMenuItem(pMenu,pset);
break;
default:
if( ch >= '0' && ch <= '9' )
{
ch -= '0';
}
else if( ch >= 'A' && ch <= 'Z' )
{
ch -= 'A';
ch += 10;
}
else if( ch >= 'a' && ch <= 'z' )
{
ch -= 'a';
ch += 10;
}
else
{
myevent = 0;
}
if ( ch > -1 && ch < pset->ItemCount && myevent)
{
pset->NeedDrawMenu = 1;
pset->CurrentItem = ch;
if( pset->ExtraFlag & 0x01 )
ExecMenuItem(pMenu,pset);
}
break;
}
if( myevent == 0 )
{
if( pset->pIdleAction )
(*pset->pIdleAction)(bakch);
}
}
return pset->ExitCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -