|

楼主 |
发表于 2014-10-29 17:16:15
|
显示全部楼层
void (*UIFunction[4])(void) = {UI1, UI2, UI3, UI4};
int sel = 0;
void Menu_Key_Deal(unsigned char key)
{
switch(key)
{
case GUI_KEY_ENTER:
{
UIFunction[sel]();
}break;
case GUI_KEY_UP:
{
if ((sel - 1) < 0)
{
sel = 3;
}
else
{
sel--;
}
}break;
case GUI_KEY_DOWN:
sel = (++sel)%4;
break;
default:
break;
}
}
void cbMainMenuWin(WM_MESSAGE * pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
{
GUI_DrawBitmap(&bmMenuGraph, 0, 0); //背景图
GUI_SetBkColor(GUI_BLACK);
Disp_Cursor();
}break;
case WM_KEY:
{
WM_KEY_INFO *key_info = (WM_KEY_INFO *)pMsg->Data.p;
Menu_Key_Deal(key_info->Key);
}break;
default:
WM_DefaultProc(pMsg);
}
}
//主菜单入口函数
void enter_mainmenu(void)
{
WM_SetCallback(WM_HBKWIN, cbMainMenuWin);
WM_SelectWindow(WM_HBKWIN);
WM_SetFocus(WM_HBKWIN);
while(1)
{
GUI_Delay(10);
}
}
//子菜单UI1入口函数
void UI1(void)
{
WM_SetCallback(WM_HBKWIN, cbUI1Win);
WM_SetFocus(WM_HBKWIN);
}
void cbUI1Win(WM_MESSAGE * pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
{
GUI_SetBkColor(BKGROUND_COLOR);
GUI_Clear();
Disp_UI1_List();
}break;
case WM_KEY:
{
WM_KEY_INFO *key_info = (WM_KEY_INFO *)pMsg->Data.p; //按键处理
UI1_Key_Deal(key_info->Key);
}break;
default:
WM_DefaultProc(pMsg);
}
}
void UI1_Key_Deal(unsigned char key)
{
switch(key)
{
case GUI_KEY_ENTER:
{
}break;
case GUI_KEY_ESCAPE:
{
enter_mainmenu(0);
}break;
case GUI_KEY_DOWN:
{
if ((Seting_Cur_Sel + 1) < 4)
{
UI1_Cur_Sel += 1;
}
else
{
UI1_Cur_Sel = 0;
}
}break;
case GUI_KEY_UP:
{
if ((UI1_Cur_Sel - 1)>=0)
{
UI1_Cur_Sel -= 1;
}
else
{
UI1_Cur_Sel = 3;
}
}break;
default:
break;
}
}
就是这样 首先把背景窗口回调函数设置成cbMainMenuWin表示mainmenu窗口, 在mainmenu按enter键进入UI1窗口,即把背景窗口的回调函数设置成cbUI1Win,然后在UI1窗口按ESC键返回到mainmenu,这样往返20次后界面就挂了,用串口还是可以打出获取的按键值,其他窗口UI2, UI3, UI4类似,都是按20次后界面就挂了 |
|