傻孩子菜单框架

#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; 
} 

#include "menu.h" //菜单资源头文件 #include "menu_res.h" //外部显示库函数 #include "lcm.h" /* 名称:C语言两级菜单(对于大内存可扩展N级菜单)V1.0 作者:中国传惠 Transmart gongxd@126.com 单位:山东科技大学 时间:2009-3-4 编译环境: IDE-Version: uVision3 V3.33 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc 2006 License Information: gongxd 微软用户 微软中国 LIC=BU373-A1HZU-EZJW0-DRWR6-C682M-E9HMS Tool Version Numbers: 工具链路径:C:\Keil\C51\BIN\ C Compiler: C51.Exe V8.05a Assembler: A51.Exe Linker/Locator: BL51.Exe V6.00 Librarian: LIB51.Exe V4.24 Hex Converter: OH51.Exe V2.6 CPU DLL: S8051.DLL V3.06 Dialog DLL: DP51.DLL V2.48b Target DLL: C:\KEIL\VW_C.DLL Dialog DLL: TP51.DLL V2.48b 使用说明: 1.向"menu_res.h"中添加菜单列表 2.向 "Menu_Function.h"中添加菜单响应函数声明 3.在"lcm.h"中替换自己的外部显示库函数,可以用类似的宏定义#define DisplayFunction(int,int) MyDisplayFunction(int,int) 其中"lcm.h"的X,Y坐标起始定义为0,0 (0,0)X------> Y | | \|/ */ #include "Menu_Function.h" //菜单条目格式 //{要显示的的菜单文本,子菜单号,功能函数地址) MenuItemStruct code MenuMain[]={ {"主1 条目1",1,Null}, {"主1 条目2",2,Null}, {"主1 条目3",3,Null}, {"功能函数1",MenuHasFunction,MenuFuntion1}, {"主1 条目5",0,Null}, }; MenuItemStruct code MenuSub1[]={ {"次1 条目1",0,Null}, {"次1 条目2",0,Null}, {"功能函数2",MenuHasFunction,MenuFuntion2}, {"次1 条目4",0,Null}, {"次1 条目5",0,Null}, {"次1 条目6",0,Null}, }; MenuItemStruct code MenuSub2[]={ {"次2 条目1",0,Null}, {"次2 条目2",0,Null}, {"次2 条目3",0,Null}, }; MenuItemStruct code MenuSub3[]={ {"次3 条目1",0,Null}, {"次3 条目2",0,Null}, {"次3 条目3",0,Null}, {"次3 条目4",0,Null}, {"次3 条目5",0,Null}, {"次3 条目6",0,Null}, {"次3 条目7",0,Null}, {"次3 条目8",0,Null}, {"次3 条目9",0,Null}, }; //菜单板列表 MenuPanelStruct code MenuPanel[]={ {MenuPanelID(MenuMain)}, {MenuPanelID(MenuSub1)}, {MenuPanelID(MenuSub2)}, {MenuPanelID(MenuSub3)}, };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值