?? menu.c
字號:
#include "menu.h"
#include "key.h"
#include "utili.h"
#include "lcd.h"
#include "param.h"
#include "query.h"
#include "time.h"
#include "coulometry.h"
#include "objdetect.h"
//第一層菜單:
struct MENU_ITEM code MainMenu[] = {
{1,"手動測試",32,2 ,NULL},//coulometry.c
{2,"自動檢測",32,22 ,NULL},//objdetect.c
{3,"參數(shù)設(shè)定",32,42 ,NULL},//param.c
{4,"數(shù)值查詢",32,2 ,NULL},//query.c
{5,"調(diào)整時間",32,22 ,NULL},//time.c
{6,"儀器標定",32,42 ,NULL},//
{0,NULL,0,0,NULL}
};
//菜單控制
uchar MenuItemCount; //菜單項數(shù), 在初始化一個菜單時計算出來
uchar MenuItemIndex; //當前指向(是相對本頁)
uchar MenuPageCount; //菜單頁數(shù), 每頁顯示3項
uchar MenuCurPage; //當前頁面數(shù).
uchar MenuCurPageItemCount;//當前頁有幾個菜單項
int8 MenuSelectItem;
//指向當前菜單的指針
struct MENU_ITEM *PrevMenu,*PMenu;
void onMenuKeyDown(uchar key);
void MenuInit()
{
MenuItemCount = 0;
MenuItemIndex = 0;
MenuPageCount = 0;
MenuCurPage = 0;
MenuCurPageItemCount = 0;
MenuSelectItem = -1;
PMenu = NULL;
PrevMenu = NULL;
}
//反選一個菜單項
void FocusMenuItem(struct MENU_ITEM *item)
{
uchar len;
uchar x,w;
//項目名字長度
len = strlen(item->name);
//控制最小邊界
if( item->x < 8)
x = 0;
else
x = item->x -8;
//控制最大邊界
if( len + 2 > 16)
w = 16;
else
w = len + 2;
//反選一個區(qū)域
LCD_ReverseRect(x,item->y-1,w,18);
}
//初始化菜單
void InitMenuItem()
{
MenuItemCount = 0;
MenuItemIndex = 0;
MenuPageCount = 0;
MenuCurPage = 0;
MenuCurPageItemCount = 0;
if( PMenu == NULL)
return;
//計算有幾個菜單項
while( PMenu[MenuItemCount++].id != 0);
if( MenuItemCount > 0) MenuItemCount --; //去掉最后一行才正確
//計算一下需要多少頁
MenuPageCount = MenuItemCount / PAGE_ITEM_COUNT;
if( MenuPageCount * PAGE_ITEM_COUNT < MenuItemCount)
MenuPageCount ++;
RefreshMenu(); //刷新菜單
}
//重新加載菜單
void RefreshMenu()
{
uchar index;
uchar count;
if( PMenu == NULL)
return;
LCD_Cls();
MenuCurPageItemCount = 0;
index = MenuCurPage * PAGE_ITEM_COUNT; //頁面起始項的索引號
count = 0;
while( PMenu[index].id != 0 && count < PAGE_ITEM_COUNT)
{
LCD_PrintHz16(PMenu[index].x,PMenu[index].y,PMenu[index].name);
MenuCurPageItemCount ++;
index++;
count ++;
}
if( MenuCurPage < (MenuPageCount - 1))
{
//如果還有下一頁則顯示">>"
LCD_PrintHz12(112,52,">>");
}
if( MenuCurPage > 0)
{
//如果不是第一頁則顯示"<<"
LCD_PrintHz12(0,52,"<<");
}
else //沒有 << 是為退出菜單
{
//
if( PMenu != MainMenu) //主菜單就沒有退出了
{
LCD_PrintHz12(0,52,"<-");
}
}
MenuItemIndex = 0;
//反選第一項
FocusMenuItem(&PMenu[MenuCurPage * PAGE_ITEM_COUNT]);
//LCD_PrintWord(0,0,MenuCurPage,0,0);
}
//選擇頁面
void SelectMenuPage(bool dir)
{
if( dir ) //下一頁
{
if( MenuCurPage < (MenuPageCount - 1))
{
MenuCurPage ++;
RefreshMenu();
}
}
else
{
if( MenuCurPage > 0)
{
MenuCurPage --;
RefreshMenu();
}
else
{
if( PMenu != MainMenu)
{
ReturnMainMenu();
}
}
}
}
void MoveMenuItem(bool dir)
{
uchar FirstItemIndex;
if( PMenu == NULL)
return;
//這是當前頁面首個菜單項的索引號
FirstItemIndex = MenuCurPage * PAGE_ITEM_COUNT;
//取消原來選擇的菜單項
FocusMenuItem(&PMenu[FirstItemIndex + MenuItemIndex]);
//改變到下一項
if( dir )
MenuItemIndex = (MenuItemIndex + 1 ) % MenuCurPageItemCount;
else
{
if( MenuItemIndex == 0)
MenuItemIndex = MenuCurPageItemCount-1;
else
MenuItemIndex = (MenuItemIndex - 1 ) % MenuCurPageItemCount;
}
//選擇當前項
FocusMenuItem(&PMenu[FirstItemIndex + MenuItemIndex]);
}
void SelectMenuItem()
{
if( PMenu == NULL)
return;
//這是當前頁面首個菜單項的索引號
MenuSelectItem = MenuCurPage * PAGE_ITEM_COUNT + MenuItemIndex;
}
void SetMenu(struct MENU_ITEM *p)
{
//if( p == PMenu)
// return;
PrevMenu = PMenu; //保存一下上一層的菜單
PMenu = p;
InitMenuItem();
onKeyUp = onMenuKeyDown;
}
void ReturnBackMenu() //只能返回到前一層菜單
{
if( PrevMenu == NULL)
return;
PMenu = PrevMenu;
PrevMenu = NULL;
InitMenuItem();
//重置鍵盤映射
onKeyUp = onMenuKeyDown;
}
//這個是反回主菜單
void ReturnMainMenu()
{
SetMenu(MainMenu);
//把按鍵事件設(shè)置為菜單按鍵事件處理函數(shù)
//onKeyUp = onMenuKeyDown;
}
//處理菜單鍵盤事件
void onMenuKeyDown(uchar key)
{
switch(key)
{
case KEY_UP:
MoveMenuItem(false); //選擇上一項
break;
case KEY_DOWN:
MoveMenuItem(true); //選擇下一項
break;
case KEY_LEFT:
SelectMenuPage(false);//向前一頁
break;
case KEY_RIGHT:
SelectMenuPage(true); //向后一頁
break;
case KEY_ENTER:
SelectMenuItem();
break;
}
}
//處理菜單命令
void MenuEvent()
{
if( MenuSelectItem != -1 && PMenu != NULL)
{
if(PMenu[MenuSelectItem].func != NULL)
{
PMenu[MenuSelectItem].func(PMenu[MenuSelectItem].id);
}
else
{
LCD_PrintHz16(24,24,"歡迎使用!");
}
}
MenuSelectItem = -1;
}
//
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -