📄 menu.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "item.h"
#include "menu.h"
#include "lcd_api.h"
#define NumMenuItem 24
MenuManager MENUManager;
// member functions of Menu class
Menu::Menu( )
{
X = 1;
Y = 0;
XSize = 64;
TxtColor = 1; // DARKGRAY;
BkColor = 0; // screen background color
ActTxtColor = 0; // BLACK; for active item
ActBkColor = 1; // for active item
NumItem = 0;
for(int i=0; i<MaxMenuItem; i++) pItemTab[i] = NULL;
ActItemIdx = 0;
MenuFormat = 0;
ScreenItem = 8;
StartItem = 0;
NewCnt = 0;
OldCnt = 0;
}
int Menu::ItemX( int ItemIdx )
{
int i;
if( MenuFormat==0 )
{
i = ItemIdx%8;
if( i>3 ) return X+64;
}
return X;
}
void Menu::SetMenuFormat( int i )
{
MenuFormat = i;
if( MenuFormat==0 ) XSize = 64;
else XSize = 128;
}
int Menu::ItemY( int ItemIdx )
{
int i=ItemIdx%4;
int Yi = Y + 16*i;
return Yi;
}
void Menu::ShowAsActive( int ItemIdx )
{
int x, y, HL;
char Str[20], ActStr[20];
if( ItemIdx<0 || ItemIdx>=NumMenuItem ) return;
x = ItemX( ItemIdx );
y = ItemY( ItemIdx ); // start position of string
HL = pItemTab[ItemIdx]->GetHighLight( ); // 0<= HL <14
pItemTab[ItemIdx]->GetOutStr( Str );
int l=strlen(Str);
if( HL > 0 )
{
ActStr[0] = Str[HL]; ActStr[1] = '\0';
//LCD_FillBar( x, y, XSize, y+16, BkColor );
LCD_WriteString( x, y, Str, TxtColor );
LCD_WriteString(x+8*HL, y, ActStr, ActTxtColor );
}
else
{
//LCD_FillBar( x, y, XSize, y+16, BkColor );
LCD_WriteString( x, y, Str, ActTxtColor, 10);
}
}
void Menu::ShowAsNormal( int ItemIdx )
{
int x, y;
char Str[20];
if( ItemIdx<0 || ItemIdx>=NumMenuItem ) return;
x = ItemX( ItemIdx );
y = ItemY( ItemIdx ); // start position of string
pItemTab[ItemIdx]->GetOutStr( Str );
int l=strlen(Str);
LCD_WriteString( x, y, Str, TxtColor, 10 );
}
void Menu::PutOnScreen( )
{
if( MenuFormat==0 ) ScreenItem = 8;
else ScreenItem = 4;
for( int i=StartItem; i<StartItem+ScreenItem; i++ )
{
if( i >= NumItem ) break;
if( i!= ActItemIdx ) ShowAsNormal( i );
else ShowAsActive( i );
}
}
int Menu::AddItem( Item* NewItemPtr )
{
if( NewItemPtr == NULL ) // clear display item table
{
NumItem = 0;
ActItemIdx = 0;
for( int i=0; i<MaxMenuItem; i++ ) pItemTab[i] = NULL;
return 0;
}
if(NumItem>=MaxMenuItem) return -1; // the table is full
pItemTab[NumItem] = NewItemPtr;
NumItem++;
return NumItem;
}
void Menu::MenuItemBarUp( )
{
ShowAsNormal( ActItemIdx );
for( int i=0; ; i++ )
{
ActItemIdx--;
if( ActItemIdx < 0 ) ActItemIdx = NumItem - 1;
NewCnt = ActItemIdx/ScreenItem;
if( pItemTab[ActItemIdx]->OutStrAvailable( ) == 1 ) break;
if( i >= NumItem ) return;
}
if( NewCnt!=OldCnt ) //clrscr
{
StartItem = NewCnt*ScreenItem;
OldCnt = NewCnt;
LCD_Clearup( );
PutOnScreen( );
}
ShowAsActive( ActItemIdx );
}
void Menu::MenuItemBarDn( )
{
ShowAsNormal( ActItemIdx );
for( int i=0; ; i++ )
{
ActItemIdx++;
if( ActItemIdx >= NumItem ) ActItemIdx = 0;
NewCnt = ActItemIdx/ScreenItem;
if( pItemTab[ActItemIdx]->OutStrAvailable( ) == 1 ) break;
if( i >= NumItem ) return;
}
if( NewCnt!=OldCnt ) //clrscr
{
StartItem = NewCnt*ScreenItem;
OldCnt = NewCnt;
LCD_Clearup( );
PutOnScreen( );
}
ShowAsActive( ActItemIdx );
}
void Menu::MenuItemInc( )
{
pItemTab[ActItemIdx]->ValueInc( );
ShowAsActive( ActItemIdx );
//if( !ItemChanged ) { ItemChanged = TRUE; ShowConfirmIcon( ); }
}
void Menu::MenuItemDec( )
{
pItemTab[ActItemIdx]->ValueDec( );
ShowAsActive( ActItemIdx );
//if( !ItemChanged ) { ItemChanged = TRUE; ShowConfirmIcon( ); }
}
void Menu::MenuItemINC( )
{
pItemTab[ActItemIdx]->ValueINC( );
ShowAsActive( ActItemIdx );
//if( !ItemChanged ) { ItemChanged = TRUE; ShowConfirmIcon( ); }
}
void Menu::MenuItemDEC( )
{
pItemTab[ActItemIdx]->ValueDEC( );
ShowAsActive( ActItemIdx );
//if( !ItemChanged ) { ItemChanged = TRUE; ShowConfirmIcon( ); }
}
void Menu::Hide( )
{
//if( !IsVisible ) return;
//IsVisible = FALSE;
//Bar( X-1, Y-1, X+Xsize+1, Y+Ysize+1, SysColorTable.Menu_Bk );
}
void Menu::Show( )
{
//VarItemInit( );
PutOnScreen( );
//IsVisible = TRUE;
}
MainMenu::MainMenu( ) : Menu( )
{
int i;
Menu1.SetNameUnit( "菜单1" );
Menu2.SetNameUnit( "菜单2" );
Menu3.SetNameUnit( "菜单3" );
Menu4.SetNameUnit( "菜单4" );
Menu5.SetNameUnit( "菜单5" );
Menu6.SetNameUnit( "菜单6" );
Menu7.SetNameUnit( "菜单7" );
Menu8.SetNameUnit( "菜单8" );
AddItem( (Item*)&Menu1 );
AddItem( (Item*)&Menu2 );
AddItem( (Item*)&Menu3 );
AddItem( (Item*)&Menu4 );
AddItem( (Item*)&Menu5 );
AddItem( (Item*)&Menu6 );
AddItem( (Item*)&Menu7 );
AddItem( (Item*)&Menu8 );
}
void MainMenu::VarItemInit( )
{
}
int MainMenu::ManualPro( )
{
switch( ActItemIdx )
{
case 0: MENUManager.ShowMenu( 1 ); break;
default: break;
}
return 0;
}
void MainMenu::AbnormalPro( )
{
}
Menu1::Menu1( ) : Menu( )
{
int i;
static char* Item1Str[3] = { "Str1" , "Str2", "" };
static char* Item4Str[5] = { "Str1" , "Str2", "Str3", "Str4", "" };
SetMenuFormat( 1 );
Item1.SetNameUnit( "Item1 " );
Item2.SetNameUnit( "Item2 ", "A" );
Item3.SetNameUnit( "Item3 ", "S" );
Item4.SetNameUnit( "Item4 " );
Item5.SetNameUnit( "Item5 ", "Hz" );
Item6.SetNameUnit( "Item6 " );
Item1.DefineItem( 0, 2, Item1Str);
Item4.DefineItem( 0, 4, Item4Str);
Item2.DefineItem( 0, 2000, 0, 1, 10);
Item3.DefineItem( 0, 2000, 0, 1, 10);
//Item5.DefineItem( 0, 2000, 0, 1, 10);
Item5.DefineItem( 1.0, 4, 0);
Item6.DefineItem( 0, 2000, 0, 1, 10);
AddItem( (Item*)&Item1 );
AddItem( (Item*)&Item2 );
AddItem( (Item*)&Item3 );
AddItem( (Item*)&Item4 );
AddItem( (Item*)&Item5 );
AddItem( (Item*)&Item6 );
}
void Menu1::VarItemInit( )
{
}
int Menu1::ManualPro( )
{
return 0;
}
void Menu1::AbnormalPro( )
{
MENUManager.ShowMenu( 0 );
}
MenuManager::MenuManager( )
{
//MenuVisible = FALSE;
X = 1;
Y = 0;
NumMenu = 0;
ActMenuIdx = 0;
AutoProIdx = 0;
//MultiWave = FALSE;
}
MenuManager::~MenuManager( )
{
if( EtrMenu != NULL ) delete EtrMenu;
}
int MenuManager::SysMenuInit( )
{
NumMenu = 0;
EtrMenu = new MainMenu( );
if( EtrMenu == NULL ) return -(NumMenu+1);
pMenuTab[NumMenu] = (Menu*)EtrMenu;
ActMenuIdx = 0;
NumMenu++;
EtrMenu1 = new Menu1( );
if( EtrMenu1 == NULL ) return -(NumMenu+1);
pMenuTab[NumMenu] = (Menu*)EtrMenu1;
NumMenu++;
return 0;
}
int MenuManager::AddMenu( Menu* AppMenu )
{
if(NumMenu>=10) return -NumMenu;
pMenuTab[NumMenu] = AppMenu;
NumMenu++;
return 0;
}
void MenuManager::ShowMenu( int MenuIdx )
{
LCD_Clearup( );
ActMenuIdx = MenuIdx%NumMenu;
pMenuTab[ActMenuIdx]->Show( );
}
void MenuManager::HideMenu( )
{
//if( !MenuVisible ) return;
pMenuTab[ActMenuIdx]->Hide( );
}
void MenuManager::MenuItemBarUp( )
{
pMenuTab[ActMenuIdx]->MenuItemBarUp( );
}
void MenuManager::MenuItemBarDn( )
{
pMenuTab[ActMenuIdx]->MenuItemBarDn( );
}
void MenuManager::MenuItemInc( )
{
pMenuTab[ActMenuIdx]->MenuItemInc( );
}
void MenuManager::MenuItemDec( )
{
pMenuTab[ActMenuIdx]->MenuItemDec( );
}
void MenuManager::MenuItemINC( )
{
pMenuTab[ActMenuIdx]->MenuItemINC( );
}
void MenuManager::MenuItemDEC( )
{
pMenuTab[ActMenuIdx]->MenuItemDEC( );
}
void MenuManager::MenuDrivedManualPro( )
{
pMenuTab[ActMenuIdx]->ManualPro( );
}
void MenuManager::AbnormalPro( )
{
pMenuTab[ActMenuIdx]->AbnormalPro( );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -