⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.cpp

📁 英创386的LCD控制协议和函数,还有例程
💻 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 + -