- #include <stdio.h>
- #include <string.h>
-
- #define Null 0
- char over=0; //結束標志
-
- //結構體類型定義
- struct MenuItem
- {
- char MenuCount; //結構體數組的元素個數
- char *DisplayString; //當前LCD顯示的信息
- void (*Subs)(); //執行的函數的指針.
- struct MenuItem *Childrenms; //指向子節點的指針
- struct MenuItem *Parentms; //指向父節點的指針
- };
-
- //函數聲明
- void Nop(void);
- void DoSomething(struct MenuItem *manyou);
- void GameOver(void);
- void Locate(struct MenuItem *manyou);
- void Run(struct MenuItem *manyou);
-
- //====================================
- //結構體聲明
- struct MenuItem m0_main[4];
- struct MenuItem m1_file[5];
- struct MenuItem m1_edit[4];
- struct MenuItem m1_view[2];
- struct MenuItem m2_font[3];
- struct MenuItem m1_help[3];
-
- //====================================
- //結構體實現
- struct MenuItem m0_main[4]=
- {
- {4,"file",Nop,m1_file,Null},
- {4,"edit",Nop,m1_edit,Null},
- {4,"view",Nop,m1_view,Null},
- {4,"help",Nop,m1_help,Null},
- };
-
- struct MenuItem m1_file[5]=
- {
- {5,"open",DoSomething,Null,m0_main},
- {5,"save",DoSomething,Null,m0_main},
- {5,"save as",DoSomething,Null,m0_main},
- {5,"print",DoSomething,Null,m0_main},
- {5,"exit",GameOver,Null,m0_main},
- };
-
- struct MenuItem m1_edit[4]=
- {
- {4,"undo",DoSomething,Null,m0_main},
- {4,"redo",DoSomething,Null,m0_main},
- {4,"copy",DoSomething,Null,m0_main},
- {4,"paste",DoSomething,Null,m0_main},
- };
-
- struct MenuItem m1_view[2]=
- {
- {2,"font",Nop,m2_font,m0_main},
- {2,"color",DoSomething,Null,m0_main},
- };
-
- struct MenuItem m2_font[3]=
- {
- {3,"songti",DoSomething,Null,m1_view},
- {3,"heiti",DoSomething,Null,m1_view},
- {3,"youyuan",DoSomething,Null,m1_view},
- };
-
- struct MenuItem m1_help[3]=
- {
- {3,"index",DoSomething,Null,m0_main},
- {3,"online",DoSomething,Null,m0_main},
- {3,"about",DoSomething,Null,m0_main},
- };
-
- //====================================
- //函數實現
- void Locate(struct MenuItem *manyou)
- {
- printf("Now we at %s\n" ,manyou->DisplayString);
- }
-
- void Run(struct MenuItem *manyou)
- {
- (*(manyou->Subs))(manyou);
- }
-
- void Nop(void)
- {}
-
- void DoSomething(struct MenuItem *manyou)
- {
- printf("we have done %s\n" ,manyou->DisplayString);
- }
-
- void GameOver(void)
- {
- over=1;
- printf("Now Game is Over ");
- getchar();
- }
-
- //====================================
- //主函數
- int main(int argc, char *argv[])
- {
- char charin; //輸入的字符
- char menuid[3]={0,0,0}; //某一級的菜單的偏移量的記錄數組
- char i=0; //上面數組的下標值
-
- struct MenuItem *manyou; //漫游,在菜單中漫游
-
- manyou=&m0_main[0]; //開始的位置
- Locate(manyou); //輸出
-
- while (!over) //如果還沒完
- {
- charin=getchar(); //讀取鍵盤字符
- switch (charin) //根據字符跳轉
- {
- case '0': //到同級菜單的后一項
- {
- menuid[i]++;
- if (menuid[i]>manyou->MenuCount-1) menuid[i]=0;//可以看到MenuCount項是必要的
- Locate(manyou+menuid[i]);
- break;
- }
- case '1': //到同級菜單的前一項
- {
- if (menuid[i]==0) menuid[i]=manyou->MenuCount-1;//可以看到MenuCount項是必要的
- else menuid[i]--;
- Locate(manyou+menuid[i]);
- break;
- }
- case '+': //到下一級菜單,無下級時執行某功能
- {
- if ((manyou+menuid[i])->Childrenms !=Null)
- {
- manyou=(manyou+menuid[i])->Childrenms;
- i++;
- menuid[i]=0;
- Locate(manyou+menuid[i]);
- }
- else
- {
- Run(manyou+menuid[i]);
- }
- break;
- }
- case '-': //到上一級菜單,無上級時給出些提示
- {
- if ((manyou+menuid[i])->Parentms !=Null)
- {
- manyou=(manyou+menuid[i])->Parentms;
- i--;
- Locate(manyou+menuid[i]);
- }
- else
- {
- printf("You are at the top of menu");
- }
- break;
- }
- default: break;
- }
- }
- return 0;
- }
復制代碼 |