移植:将GUI_hw.c 中接口函数替换即可.
功能:其它画线就不用讲了,菜单编程简单说明一下.程序亮点也在此(自认为)
- //----------------------------------------------------------------------------------
- //菜单结构
- typedef struct
- {
- INT8U x; //菜单框架左上角X坐标
- INT8U y; //菜单框架左上角Y坐标
- INT8U width; //菜单框架宽度
- INT8U height; //菜单框架高度
- INT8U itemTop; //显示菜单框中最上面项
- INT8U sItem; //当前选择项
- INT8U itemMax; //最大顶数
- const char *title; //菜单标题
- const BMP **pbmp; //菜单项位图列表
- const char ***ptext; //菜单项文本列表
- void(*Paint)(void); //重绘菜单
- void(*MegProc)(INT8U); //消息处理
- }MENU;
- 1.每个菜单项都有一个重绘菜单函数void(*Paint)(void); 通过它可画出想要的任何菜单样式。源码中画了大图标菜单和选择条菜单样式。每个菜单都有一个消息响应函数void(*MegProc)(INT8U); 传入消息如上页下页返回等操作。
- 2.定义菜单中的项采用分开方式编程,可读性强如:
- //==================================================================================
- //定义菜单字符串
- const char *sCtrl = "控制";
- const char *sSet = "设置";
- const char *sGame = "游戏";
- const char *sHelp = "帮助";
- const char *sCtrl2 = "智能插座 ";
- const char *sCtrl3 = "浴缸 ";
- const char *sCtrl4 = "脸盆 ";
- const char *sCtrl5 = "空调 ";
- //==================================================================================
- //定义菜单文本
- const char **MMenuText[] ={&sCtrl,&sSet,&sGame,&sHelp};
- const char **SCtrlText[] ={&sCtrl2,&sCtrl3,&sCtrl4,&sCtrl5};
- //==================================================================================
- //定义菜单位图列表
- const BMP *MMenuBmp[] ={&ctrl,&set,&game,&help};
- //==================================================================================
- //声明菜单消息处理事件
- void MMegProc(INT8U meg);
- void SCtrlMegProc(INT8U meg);
- //==================================================================================
- //定义菜单项
- MENU MMenu=
- {
- 0,
- 0,
- 128,
- 48,
- 0,
- 0,
- 4,
- "Main menu",
- MMenuBmp,
- MMenuText,
- GUI_MenuBmpPaint,
- MMegProc
- };
- MENU SCtrl=
- {
- 0,
- 0,
- 128,
- 48,
- 0,
- 0,
- 4,
- "控制",
- 0,
- SCtrlText,
- GUI_MenuPaint,
- SCtrlMegProc
- };
- //----------------------------------------------------------------------------------
- // 主菜单消息处理
- //描述: 处理主菜单消息
- //参数:meg :消息
- //返回: 无
- //----------------------------------------------------------------------------------
- void MMegProc(INT8U meg)
- {
- if(meg==KEY_UP)
- {
- if(MMenu.sItem>0)
- MMenu.sItem--;
- else
- MMenu.sItem = MMenu.itemMax-1;
- }
- else if(meg==KEY_DOWN)
- {
- if(MMenu.sItem<(MMenu.itemMax-1))
- MMenu.sItem++;
- else
- MMenu.sItem = 0;
- }
- else if(meg==KEY_EN)
- {
- if(MMenu.sItem==0)
- {
- pCMenu=&SCtrl;
- GUI_Clear();
- }
- if(MMenu.sItem==2)
- {
- TetrisMain();
- GUI_Clear();
- BuzzerOn;
- OSTimeDly(5);
- BuzzerOff;
- }
- }
- else if(meg==KEY_CLR)
- {
- GUI_Clear();
- pCMenu = 0;
- return;
- }
- pCMenu->Paint();
- }
- //----------------------------------------------------------------------------------
- // 控制菜单消息处理
- //描述: 处理控制菜单菜单消息
- //参数:meg :消息
- //返回: 无
- //----------------------------------------------------------------------------------
- void SCtrlMegProc(INT8U meg)
- {
- if(meg==KEY_UP)
- {
- if(SCtrl.sItem>0)
- SCtrl.sItem--;
- else
- SCtrl.sItem = SCtrl.itemMax-1;
- if(SCtrl.sItem
- SCtrl.itemTop--;
- if(SCtrl.sItem>SCtrl.itemTop+1)
- SCtrl.itemTop= SCtrl.sItem-1;
- pCMenu->Paint();
- }
- else if(meg==KEY_DOWN)
- {
- if(SCtrl.sItem<(SCtrl.itemMax-1))
- SCtrl.sItem++;
- else
- SCtrl.sItem = 0;
- if(SCtrl.sItem>1)
- SCtrl.itemTop=SCtrl.sItem-1;
- else
- SCtrl.itemTop=0;
- pCMenu->Paint();
- }
- else if(meg==KEY_CLR)
- {
- pCMenu=&MMenu;
- GUI_Clear();
- pCMenu->Paint();
- }
- else LCD_Refresh();
- }
- //==================================================================================