?? menutop.c
字號:
/******************************************************************************
* MenuTop.C - 頂層菜單 條項菜單核心函數 圖標層函數等
*
*
* DESCRIPTION: -
*
* modification history
* --------------------
* 01a, 04/sep/2007, 梁炎昌 written
* --------------------
******************************************************************************/
#include "CPU.H"
#include "Ks0108.H"
#include "Menu.H"
//void Bar(U8 Item_,U8 ItemNum_);
void DispBuildTime(void);//編譯時間
/*
*****************************************************************************
* InitMenuVal - 初始化菜單系統
* DESCRIPTION: -
* 該函數必須在進入菜單前被調用 初始化全局變量
* @Para void:
* Return :
*
*****************************************************************************
*/
void InitMenuVal(void)
{
WhereBackup_i = 0;
ItemBackup_i = 0;
Layer = 0;
FatherIndex[Layer++] = MenuTopIndex; //push index 待機界面作為起點
}
/*
*****************************************************************************
* DispMenuTop - 待機界面層5個函數
* DESCRIPTION: -
* DispMenuTop DispMenuTopUp DispMenuTopDown DispMenuTopLeft DispMenuTopRight
*
*
*
*****************************************************************************
*/
void DispMenuTop(void)//待機界面
{
GUI_Clear();
GUI_DispStringAtBar("Desktop",0,0,126,GUI_TA_HCENTER);
//顯示按鍵對應的文字提示,0-->"菜單"
GUI_DispStringAtBar(*(Tip[language].Text),0,Enter_PosY,126,GUI_TA_HCENTER);
}
//待機界面下Up鍵的處理
void DispMenuTopUp(void)
{
//-------------------
KeyPressCount = 0;
//-------------------
GUI_Clear();
//-------------------
//這里是頂層菜單,因此在進入子菜單前需要初始化變量
InitMenuVal();
//--------------------------
//狀態跳轉,進入子菜單
//jump to Menu index
Jump2Menu(MenuIndex,FlashMode_AutoInit);
return;
}
//待機界面下Down鍵的處理
void DispMenuTopDown(void)
{
if((KeyPressCount++)==0x0F){
GUI_Clear();
DispBuildTime();
GUI_Delay(6500);
KeyPressCount = 0;
// we need reflash screen
Jump2Menu(MenuTopIndex,FlashMode_ReFlash);
return;
}
//return to MenuTop index
Jump2Menu(MenuTopIndex,FlashMode_NoAction);
return;
}
//待機界面下Left鍵的處理
void DispMenuTopLeft(void)
{
KeyPressCount = 0;
/*
* 這里可以做這個按鍵的功能定義,因為這是在待機界面下
* 比如,做某個子菜單的快捷鏈接--按下該按鍵就直接跳轉到某個子菜單
*/
//-------------------
//這里是頂層菜單,因此在進入子菜單前需要初始化變量
// InitMenuVal();
//--------------------------
//狀態跳轉,進入子菜單
Jump2Menu(MenuTopIndex,FlashMode_NoAction);
return;
}
//待機界面下Right鍵的處理
void DispMenuTopRight(void)
{
KeyPressCount = 0;
//----------------------
// ClearLCD();
// DispRate(0); //功能函數的"快捷方式" 到測量顯示
//功能函數執行完畢后重新回到待機界面
// Jump2Menu(MenuTopIndex);
Jump2Menu(MenuTopIndex,FlashMode_NoAction);
return;
}
/*
********************************************************
********************************************************
*/
//-----------------------
//菜單備份函數
//備份當前菜單的各個參數
void PUSH(void)
{
WhereBackup[WhereBackup_i++] = Where; //備份Where--->高亮顯示的位置
ItemBackup[ItemBackup_i++] = Item; //備份Item--->當前項的位置
FatherIndex[Layer++] = KeyFuncIndex; //備份KeyFuncIndex--->狀態機的狀態
//-------------------------------
//-------------------------------
}
//菜單還原函數
void POP(void)
{
Layer--; //先彈出一層,因為使用的是++,因此當前Layer指向下一個數組位置
KeyFuncIndex = FatherIndex[Layer-1]; //恢復KeyFuncIndex
Where = WhereBackup[--WhereBackup_i]; //恢復高亮顯示位置Where
Item = ItemBackup[--ItemBackup_i]; //恢復項位置Item
//-------------------------------
//-------------------------------
Flash = FlashMode_ReFlash; //子項返回,請求刷新
}
/*
*****************************************************************************
* BarDisp - Bar型菜單顯示
* DESCRIPTION: -
*
* @Para s:BAR顯示的文字內容
* @Para X:X軸坐標
* @Para Y:Y軸坐標
* @Para HighLight:1--->高亮顯示當前項 0--->普通顯示當前項
//HightLight = 1--->HightLight Disp
//HightLight = 0--->Normal Disp
* Return :
*
*****************************************************************************
*/
//void BarDisp(U8 _CONST_ *s,U8 X,U8 Y,U8 HighLight)
void BarDisp(U8 *s,U8 X,U8 Y,U8 HighLight)
{
#ifdef LessCPUUseage
if (HighLight == 1) { //高亮顯示
GUI_DispStringAtBar(s,X+8,Y,120,GUI_TA_LEFT);
GUI_SetEnFont(En_8x16);
GUI_DispCharAt('>',X,Y);
} else { //通常顯示
//顯示Bar的Text
GUI_DispStringAtBar(s,X+8,Y,120,GUI_TA_LEFT);
GUI_SetEnFont(En_8x16);
GUI_DispCharAt(' ',X,Y);
}
#else
if (HighLight == 1) { //高亮顯示
//------------------------------------
GUI_SetTextMode(GUI_TEXTMODE_REVERSE);//更改字體顏色來突出顯示
GUI_DispStringAtBar(s,X,Y,120,GUI_TA_LEFT);
GUI_SetTextMode(GUI_TEXTMODE_NORMAL); //恢復原有字體顏色和背景顏色
//------------------------------------
} else { //通常顯示
//顯示Bar的Text
GUI_DispStringAtBar(s,X,Y,120,GUI_TA_LEFT);
}
#endif
}
/*
FIXME!!!
如何修改BarMenuInit和如何處理Item Where的初始化來達到如此一個目的?
當前系統語言設定是英語,而英語這個項在第2項位置,因此如何能做到當菜單進入語言選擇時,反顯位置就在英語那里?
1。修改BarMenuInit代碼,處理第一次進入時的處理方式,也許就可以僅僅使用從子菜單退出時的處理方法
*/
//Bar型菜單初始化 公共部分
void BarMenuInit(void)
{
U8 Menu_i; //計數變量 在菜單函數中用到
U8 Menu_j; //計數變量
//-------------------
//比較"顯示屏可以顯示的項的數目(DispMax)"跟"需要顯示的數目(ItemNum)"
//找出小者,以小者為顯示上限
//例如顯示屏可以顯示3項,需要顯示的項有2項,那么顯示2項,有3項,顯示3項,有4項的話,顯示3項
if (ItemNum > DispMax) {
DispMin = DispMax;
} else {
DispMin = ItemNum;
}
//--------------------
// if (Flash) {//從父菜單進入 初始化
if(Flash == FlashMode_AutoInit){//常規進入 做備份
PUSH();//在修改Item Where之前備份這些參數數據!!
Item = 0;
Where = 0;
} else if (Flash == FlashMode_ManualInit){ //非常規進入 在之前已經備份了,這里做邊界檢查
if(Where > DispMin-1){//檢查是否出界
//Where = DispMin-1;//A.最底部的顯示位置
Where = 0; //B.最頂部的顯示位置
}
if(Item > ItemNum-1){//檢查是否出界
//Item = ItemNum-1;//A.最后的一個項
Item = 0; //B.最開始的一個項
}
}
// }
//-------------------
//既然Item Where均是未定的,那么我們使用從子菜單退出的方法來找到應該再Where=0位置顯示的Item項
//----------------
//方法2
if (Item >= Where) {//未跨越零點
Menu_j = Item -Where;
} else { //跨越零點
Menu_j = ItemNum - (Where - Item);
}
//此時Menu_J的值就是頂部(Where=0)顯示的Item值
//----------------
//顯示全部的子菜單項
for (Menu_i = 0; Menu_i < DispMin; Menu_i++) {
if (Menu_j == Item){ //反顯第Item項,位置是Where
BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
} else { //其它項 正常顯示
BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
}
if (Menu_j == (ItemNum-1)) {//到了最后一項,回環到最開始的一項
Menu_j = 0;
} else { //下一項
Menu_j++;
}
}
Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX); //維護滾動條
}
//Bar項菜單向左按鍵的行為
/*
可能的幾種情況:
A.原有Bar的頂部,按鍵是向上,那么就需要刷新全部的顯示
A1.若是需要顯示的Bar多于單屏可以顯示的Bar,那么重新顯示全部
A2.若是需要顯示的Bar不多于單屏可以顯示的Bar,取消頂部高亮顯示,高亮顯示最后一項Bar
B.原有Bar不是在頂部,按鍵向上,那么取消原有Bar的高亮,高亮顯示上一個Bar項
當然還需要維護:高亮顯示的位置where/高亮顯示Bar項的Item
*/
//維護Bar顯示
void BarMenuLeft(void)
{
U8 Menu_i; //計數變量 在菜單函數中用到
U8 Menu_j; //計數變量
U8 ItemBack;
ItemBack = Item;//備份原有的Item,取消原有反顯時需要使用
//維護Item,得到需要反顯的Item
if (Item == 0) {
Item = ItemNum-1;
} else {
Item--;
}
//維護顯示
if (Where) {//當前位置不為0,就是說不是在頂部,兩次反顯
#ifdef LessCPUUseage
GUI_SetEnFont(En_8x16);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -