完整內(nèi)容下載:
傻孩子菜單歷程.rar
(3.42 KB, 下載次數(shù): 96)
2017-2-10 11:28 上傳
點擊文件名下載附件
液晶顯示 下載積分: 黑幣 -5
這一章,我囫圇吞棗的給大家撤了很多原理的東西,章節(jié)前后時間跨度之大也是前面諸多章節(jié)無法比擬的。本來,按照原來的計劃,整篇文章寫道這里就應該全部結束了。但是,,實際情況是我們擁有了一種方法卻不知道這種方法應該運用的場合。一個GUI創(chuàng)立的目的往往是服務于菜單系統(tǒng),或者是游戲系統(tǒng)。于是接下來的兩張,我就扯一下和本文有千絲萬縷關系卻是主題之外的東西:1、菜單的結構和實現(xiàn);2、GUI在游戲中的簡單應用。
以上的文字就算是一個結尾加上一個附錄的開頭吧。(爭取100樓圓滿結束全文)
ADDENDUM ONE: THE MENU STRUCT AND IT`S USAGE
附錄一:菜單的結構和實現(xiàn)
為什么菜單被叫做菜單,我想起原因已經(jīng)無從查考了,這個問題上我再掉故紙堆,羅列一堆各家之言,怕又是要挨罵了。不管你承認與否,菜單的概念已經(jīng)隨著計算機的普及滲透到了我們生活的各個方面。很多東西都可以被稱作菜單,很多東西從實質(zhì)上都擁有菜單的結構。網(wǎng)頁中有菜單,網(wǎng)頁本身甚至就是一個菜單選項,等等諸如此類。那么菜單擁有怎樣的一種結構,我們?nèi)绾稳崿F(xiàn)這一結構呢?
要說清楚這個問題,我想從兩個方面來說:第一,菜單是由許多具有一定功能的單位按照一定分類組織在一起的圖;第二,如果聽不懂第一條,就假象菜單是互聯(lián)網(wǎng),一個網(wǎng)頁就是一個子菜單,子菜單中很多超鏈接又連接到其他網(wǎng)頁,如此往復,他們之間是通過指針,或者說是通過超鏈接來溝通的。也就是說,我們已經(jīng)搞清楚了一個菜單的基本結構單元組成就是一個多鏈表中的一個結構體單元,他往往被簡化成樹,或者說在執(zhí)行退回上一級菜單這個功能的時候,被看作是一個樹的結構,但是,它實際是圖。菜單之間的任何菜單項之間都有可能產(chǎn)生聯(lián)系。但是記住,菜單一般是多入一出的結構。
說的越來越抽象了哈。其實看不懂前面的文字不要緊,我們看下面的代碼就沒有那么神秘了。
- /***********************
- * 結構體宏定義 *
- ***********************/
- struct MenuItem
- {
- char MenuCount;
- char *DisplayString;
- void (*Subs)();
- struct MenuItem *ChildrenMenus;
- struct MenuItem *ParentMenus;
- }NULL_MENU;
- void NULL_FUNCTION(void){}
- 我們看到,菜單的最小單元MenuItem的組成其實非常簡單:
- 菜單項所在層的菜單項數(shù)目(度);
- 菜單項顯示出來的字符串;
- 菜單需要執(zhí)行的功能的函數(shù)指針(可以為空);
- 孩子指針(表明選擇該菜單項后,跳轉(zhuǎn)到哪個子菜單去);
- 父指針(表明選擇ESC后,跳轉(zhuǎn)到哪個菜單去);
- 看一個菜單實例:
- (源代碼)
- struct MenuItem MainMenu[3];
- struct MenuItem TimeMenu[4];
- struct MenuItem VoiceMenu[5];
- struct MenuItem RobotMenu[5];
- struct MenuItem FlashMenu[5];
- /***********************
- * 函 數(shù) 聲 明 區(qū) *
- ***********************/
- void MainMenuInit(void);
- void TimeMenuInit(void);
- void VoiceMenuInit(void);
- void RobotMenuInit(void);
- void FlashMenuInit(void);
- /**************************************************************
- * 函數(shù)說明:Flash處理目錄初始化函數(shù) *
- **************************************************************/
- void FlashMenuInit(void)
- {
- FlashMenu[0].MenuCount = 5;
- FlashMenu[0].DisplayString = " Flash Record ";
- FlashMenu[0].Subs = FlashRecord;
- FlashMenu[0].ChildrenMenus = &Null;
- FlashMenu[0].ParentMenus = MainMenu;
-
- FlashMenu[1].MenuCount = 5;
- FlashMenu[1].DisplayString = " Play ";
- FlashMenu[1].Subs = FlashPlay;
- FlashMenu[1].ChildrenMenus = &Null;
- FlashMenu[1].ParentMenus = MainMenu;
-
- FlashMenu[2].MenuCount = 5;
- FlashMenu[2].DisplayString = " Pause ";
- FlashMenu[2].Subs = FlashPause;
- FlashMenu[2].ChildrenMenus = &Null;
- FlashMenu[2].ParentMenus = MainMenu;
-
- FlashMenu[3].MenuCount = 5;
- FlashMenu[3].DisplayString = " Flash Delete ";
- FlashMenu[3].Subs = FlashDelete;
- FlashMenu[3].ChildrenMenus = &Null;
- FlashMenu[3].ParentMenus = MainMenu;
-
- FlashMenu[4].MenuCount = 5;
- FlashMenu[4].DisplayString = " Back ";
- FlashMenu[4].Subs = NullSubs;
- FlashMenu[4].ChildrenMenus = MainMenu;
- FlashMenu[4].ParentMenus = MainMenu;
- }
- /**************************************************************
- * 函數(shù)說明:機器人控制目錄初始化函數(shù) *
- **************************************************************/
- void RobotMenuInit(void)
- {
- RobotMenu[0].MenuCount = 5;
- RobotMenu[0].DisplayString = " Turn Left ";
- RobotMenu[0].Subs = RobotTurnLeft;
- RobotMenu[0].ChildrenMenus = &Null;
- RobotMenu[0].ParentMenus = MainMenu;
-
- RobotMenu[1].MenuCount = 5;
- RobotMenu[1].DisplayString = " Turn Right ";
- RobotMenu[1].Subs = RobotTurnRight;
- RobotMenu[1].ChildrenMenus = &Null;
- RobotMenu[1].ParentMenus = MainMenu;
-
- RobotMenu[2].MenuCount = 5;
- RobotMenu[2].DisplayString = " Go Ahead ";
- RobotMenu[2].Subs = RobotGoAhead;
- RobotMenu[2].ChildrenMenus = &Null;
- RobotMenu[2].ParentMenus = MainMenu;
-
- RobotMenu[3].MenuCount = 5;
- RobotMenu[3].DisplayString = " Go Back ";
- RobotMenu[3].Subs = RobotGoBack;
- RobotMenu[3].ChildrenMenus = &Null;
- RobotMenu[3].ParentMenus = MainMenu;
-
- RobotMenu[4].MenuCount = 5;
- RobotMenu[4].DisplayString = " Back ";
- RobotMenu[4].Subs = NullSubs;
- RobotMenu[4].ChildrenMenus = MainMenu;
- RobotMenu[4].ParentMenus = MainMenu;
-
- }
- /**************************************************************
- * 函數(shù)說明:聲音處理目錄初始化函數(shù) *
- **************************************************************/
- void VoiceMenuInit(void)
- {
- VoiceMenu[0].MenuCount = 5;
- VoiceMenu[0].DisplayString = " Voice Record ";
- VoiceMenu[0].Subs = VoiceRecord;
- VoiceMenu[0].ChildrenMenus = &Null;
- VoiceMenu[0].ParentMenus = MainMenu;
-
- VoiceMenu[1].MenuCount = 5;
- VoiceMenu[1].DisplayString = " Play ";
- VoiceMenu[1].Subs = Play;
- VoiceMenu[1].ChildrenMenus = &Null;
- VoiceMenu[1].ParentMenus = MainMenu;
-
- VoiceMenu[2].MenuCount = 5;
- VoiceMenu[2].DisplayString = " Pause ";
- VoiceMenu[2].Subs = Pause;
- VoiceMenu[2].ChildrenMenus = &Null;
- VoiceMenu[2].ParentMenus = MainMenu;
-
- VoiceMenu[3].MenuCount = 5;
- VoiceMenu[3].DisplayString = " Voice Delete ";
- VoiceMenu[3].Subs = VoiceDelete;
- VoiceMenu[3].ChildrenMenus = &Null;
- VoiceMenu[3].ParentMenus = MainMenu;
-
- VoiceMenu[4].MenuCount = 5;
- VoiceMenu[4].DisplayString = " Back ";
- VoiceMenu[4].Subs = NullSubs;
- VoiceMenu[4].ChildrenMenus = MainMenu;
- VoiceMenu[4].ParentMenus = MainMenu;
- }
- /**************************************************************
- * 函數(shù)說明:時間設定子目錄初始化 *
- **************************************************************/
- void TimeMenuInit(void)
- {
- TimeMenu[0].MenuCount = 4;
- TimeMenu[0].DisplayString = " Time Set ";
- TimeMenu[0].Subs = TimeSet;
- TimeMenu[0].ChildrenMenus = &Null;
- TimeMenu[0].ParentMenus = MainMenu;
-
- TimeMenu[1].MenuCount = 4;
- TimeMenu[1].DisplayString = " Date Set ";
- TimeMenu[1].Subs = DateSet;
- TimeMenu[1].ChildrenMenus = &Null;
- TimeMenu[1].ParentMenus = MainMenu;
-
- TimeMenu[2].MenuCount = 4;
- TimeMenu[2].DisplayString = " AlertSet ";
- TimeMenu[2].Subs = AlertSet;
- TimeMenu[2].ChildrenMenus = &Null;
- TimeMenu[2].ParentMenus = MainMenu;
-
- TimeMenu[3].MenuCount = 4;
- TimeMenu[3].DisplayString = " Back ";
- TimeMenu[3].Subs = NullSubs;
- TimeMenu[3].ChildrenMenus = MainMenu;
- TimeMenu[3].ParentMenus = MainMenu;
-
- }
- /**************************************************************
- * 函數(shù)說明:根目錄初始化 *
- **************************************************************/
- void MainMenuInit(void)
- {
- MainMenu[0].MenuCount = 3;
- MainMenu[0].DisplayString = " Time Set ";
- MainMenu[0].Subs = NullSubs;
- MainMenu[0].ChildrenMenus = TimeMenu;
- MainMenu[0].ParentMenus = &Null;
- MainMenu[1].MenuCount = 3;
- MainMenu[1].DisplayString = " Voice Center ";
- MainMenu[1].Subs = NullSubs;
- MainMenu[1].ChildrenMenus = VoiceMenu;
- MainMenu[1].ParentMenus = &Null;
- /*
- MainMenu[2].MenuCount = 3;
- MainMenu[2].DisplayString = " Robot Control ";
- MainMenu[2].Subs = NullSubs;
- MainMenu[2].ChildrenMenus = RobotMenu;
- MainMenu[2].ParentMenus = &Null;
- */
- MainMenu[2].MenuCount = 3;
- MainMenu[2].DisplayString = " Flash Option ";
- MainMenu[2].Subs = NullSubs;
- MainMenu[2].ChildrenMenus = FlashMenu;
- MainMenu[2].ParentMenus = &Null;
- }
-
- struct MenuItem (*MenuPoint) = MainMenu;
- short DisplayStart = 0;
- short UserChoose = 0;
- short DisplayPoint = 0;
- short MaxItems;
- /*****************************
- * Struct MenuItem: *
- * short MenuCount; *
- * char *DisplayString; *
- * void (*Subs)(); *
- * MenuItem *ChildrenMenus;*
- * MenuItem *ParentMenus; *
- *****************************/
- /***********************
- * 函 數(shù) 聲 明 區(qū) *
- ***********************/
- extern void ClearWatchDog();
- void MenuInitialation(void);
- void SystemInitialation(void);
- void ShowMenu(void);
- short GetKeyNum(void);
- /**************************************************************
- * 函數(shù)說明:系統(tǒng)初始化函數(shù) *
- **************************************************************/
- void SystemInitialation(void)
- {
- Init_sys();
- Enable_LCD(); //初始化字庫 函數(shù)定義在Splc501sys.asm
- MenuInitialation(); //初始化菜單
- GRAPH //圖形初始化
- }
- /**************************************************************
- * 函數(shù)說明:目錄初始化函數(shù) *
- **************************************************************/
- void MenuInitialation(void)
- {
- MainMenuInit();
- TimeMenuInit();
- VoiceMenuInit();
- RobotMenuInit();
- FlashMenuInit();
- }
- /**************************************************************
- * 函數(shù)說明:目錄顯示函數(shù) *
- **************************************************************/
- void ShowMenu(void)
- {
- short n = 0;
- MaxItems = MenuPoint[0].MenuCount;
- DisplayPoint = DisplayStart;
- if (MaxItems >= 4)
- {
- for (n = 0;n<4;n++)
- {
-
- LOCATE(n+1,1);
- PRINT(MenuPoint[DisplayPoint].DisplayString);
-
- if ((DisplayPoint) == UserChoose)
- {
- BOX(1,n*16+1,126,(n+1)*16-2,1,1);
- }
-
- DisplayPoint +=1;
- if ((DisplayPoint) == (MaxItems))
- {
- DisplayPoint = 0;
- }
- }
- }
- else
- {
- for (n = 0;n<MaxItems;n++)
- {
-
- LOCATE(n+1,1);
- PRINT(MenuPoint[DisplayPoint].DisplayString);
-
- if ((DisplayPoint) == UserChoose)
- {
- BOX(1,n*16+1,126,(n+1)*16-2,1,1);
- }
-
- DisplayPoint +=1;
- if ((DisplayPoint) == (MaxItems))
- {
- DisplayPoint = 0;
- }
-
- }
- }
- //BOX(0,0,127,63,2,2);
- }
- /**************************************************************
- * 函數(shù)說明:獲得鍵值函數(shù) *
- **************************************************************/
- short GetKeyNum(void)
- {
- short TempKeyNum = 0;
- TempKeyNum = F_Key_Scan(); //獲取按鍵值
- *P_IOA_Dir = 0x01ff;
- *P_IOA_Attrib = 0x01ff;
- *P_IOA_Data = 0x01ff;
-
- return TempKeyNum;
- }
- /**************************************************************
- * 函數(shù)說明:主函數(shù) *
- **************************************************************/
- int main()
- {
- short KeyNum = 0xff;
-
- SystemInitialation(); //系統(tǒng)初始化
-
- ShowMenu();
- while(1)
- {
- ClearWatchDog(); //喂狗
- KeyNum = GetKeyNum(); //獲取按鍵值
- /*******************目錄操作*********************/
-
- /***************************************
- * [按鍵說明] *
- * ----------------------------------- *
- * [K1] UP(向上) *
- * [K5] Down(向下) *
- * [K2] Esc(后退) *
- * [K6] Enter(確定) *
- * [K3] 返回根目錄 *
- ***************************************/
- if (KeyNum != 0xff)
- {
- ShowMenu();
- switch(KeyNum)
- {
- case UP:
- UserChoose --;
- if (UserChoose < 0)
- {
- UserChoose = MaxItems-1;
- }
- break;
- case Esc:
- if (MenuPoint[0].ParentMenus != &Null)
- {
- MenuPoint = MenuPoint[0].ParentMenus;
- UserChoose = 0;
- DisplayStart = 0;
- }
- break;
- case Down:
- UserChoose ++;
- if (UserChoose == MaxItems)
- {
- UserChoose = 0;
- }
-
- break;
- case Enter:
- if (MenuPoint[UserChoose].Subs != NullSubs)
- {
- (*MenuPoint[UserChoose].Subs)();
- }
- else if (MenuPoint[UserChoose].ChildrenMenus != &Null)
- {
- MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
- UserChoose = 0;
- DisplayStart = 0;
- }
- break;
- case Reset:
- MenuPoint = MainMenu;
- UserChoose = 0;
- DisplayStart = 0;
- break;
- }
-
- if ((UserChoose < DisplayStart) || (UserChoose > (DisplayStart+3)))
- {
- DisplayStart = UserChoose;
- }
-
- CLS
- ShowMenu();
-
- }
- /*******************目錄操作*********************/
- }
-
- }
復制代碼
過多的廢話我就不多說了,大家看了就清楚了哈。 |