|
楼主 |
发表于 2009-12-10 10:03:20
|
显示全部楼层
移植:将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)
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();
}
//================================================================================== |
|