ucgui_菜单屏幕切换_解决方案:
以前也注意到,有些嵌入式开发人员,在使用ucgui做控制界面的时候,使用菜单功能,在反复切换几次后,都出现崩溃的情况。
可是他们到最后都没有彻底解决这些问题,就只好放弃使用这个Menu的功能了。
这两天,也在使用ucgui做一个项目功能,由于使用的屏幕比较小(5英寸的TFT彩屏),显示的内容又比较多,按钮也是比较多。
所以就考虑在主控界面上使用Menu的功能。结果问题就来了,也就是出现了和他们曾经遇到的一样的问题: 反复切换几次后,就无法
正常切换到应该切换的界面上去,我的程序,倒是没有严重到完全崩溃的地步。
遇到问题,绝不退却,这是我做事的一贯风格。终于也就把这个问题解决了,在此分享给大家,望使用此功能的人去借鉴。
通过调节分配给ucgui的内存大小,也是无济于事。反复测试过的了,在此特别说明。
解决的主要途径就是:
在使用菜单切换到其它界面上去的时候,先删除原有屏幕上的菜单,以释放内存。从其它屏幕切换到具有Menu功能的
界面上的时候,再创建原有的菜单即可。
附件: 1、界面_屏幕切换_示意图:
2、 菜单函数如下:
DFen_CCS_Menu.rar
(1.58 KB)
3 、主控界面下调用如下:
void TCtrl_TFT4827_MainFrame(void)
{
TCtrl_hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
#if DFCCS_MENU_USED_EN >0
DFen_CreateMenu(TCtrl_hWin);
#endif
WM_SetFocus(WM_GetDialogItem(TCtrl_hWin, GUI_ID_BUTTON2));
}
static void _cbCallback(WM_MESSAGE * pMsg) //回调函数
{
int NCode, Id;
#if DFCCS_MENU_USED_EN >0
MENU_MSG_DATA * pData;
int Index;
#endif
WM_HWIN hItem;
WM_HWIN hDlg = pMsg->hWin;
switch (pMsg->MsgId)
{
......
......
......
#if DFCCS_MENU_USED_EN >0 //程序界面使用"菜单功能"
case WM_MENU:
pData = (MENU_MSG_DATA*)pMsg->Data.p;
switch (pData->MsgType) {
case MENU_ON_ITEMSELECT:
Index = pData->ItemId;
switch(Index){
case ID_MENU_EDIT_SETUP: //编辑----参数设置
#if DFCCS_MENU_USED_EN >0
CCS_TCtrl_DeleteMenu(); //关闭主界面,首先删除菜单!!!
OSTimeDly(50);
#endif
GUI_EndDialog(hDlg, 0);
OS_ENTER_CRITICAL();
curr_screen=SCREEN_PARAM_SET;
OS_EXIT_CRITICAL();
CCS_ParamSet_Frame();
break;
case ID_MENU_EDIT_RESULT: //编辑----查看结果
break;
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
break;
#endif //程序界面使用"菜单"功能
default:
WM_DefaultProc(pMsg);
break;
}
说明: 以上的解决方案,我已经反复测试了,完全正常。
|