打印
[STM32F1]

ucgui_菜单屏幕切换_解决方案

[复制链接]
2166|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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

        

      说明: 以上的解决方案,我已经反复测试了,完全正常。








沙发
mmuuss586| | 2014-3-1 15:13 | 只看该作者

不错。

使用特权

评论回复
板凳
gonggu8181| | 2014-3-1 16:36 | 只看该作者
收藏一下

使用特权

评论回复
地板
dongfo| | 2014-4-28 18:31 | 只看该作者
不错的,可能是菜单层数多了吧

使用特权

评论回复
5
outstanding| | 2014-4-28 21:57 | 只看该作者
不错   顶一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

450

帖子

42

粉丝