硬汉嵌入式论坛

 找回密码
 立即注册
查看: 11102|回复: 8
收起左侧

[μCGUI] ucgui界面切换,好蛋疼

[复制链接]

2

主题

5

回帖

2

积分

新手上路

积分
2
发表于 2015-3-26 19:28:25 | 显示全部楼层 |阅读模式
目前遇到这么一个问题,我首先创建了一个主界面,上面有几个几个btn。然后分别点进去,就切换到相应界面,每个新的界面都是一个 Dialog, 现在的问题是这样。
我主界面如果只是单独和A界面来回切换,那么是没有问题的。 如果主界面只是单独个B界面进行切换,那也是没问题的。但是如果主界面先和A界面切换后,再切换到主界面再切换到B界面的时候,就会直接死机,B界面根本返回不了了。我debug发现,只要先切换A,再切换到B,直接进硬件中断啊,尼玛。 更奇怪的是,如果我主界面先和B界面切换,再和A切换,压根没问题啊。我去。。 求版主帮忙解决一下啊。、
下面是代码。
主界面:
#include "mygui.h"
#include "myguiconfig.h"

int _x;
BUTTON_Handle Btnhandle[6]={0};
static void _callback(WM_MESSAGE *pMsg)
{
int NCode, Id;//Get the ID of buttons and Notification code
WM_SCROLL_STATE ScrollState; //scrollbar handle
SCROLLBAR_Handle hScroll;

WM_HWIN hWin = pMsg->hWin;   
  
switch(pMsg->MsgId)
{
  case WM_CREATE:
   
   hScroll = SCROLLBAR_CreateAttached(hWin,0);//the scrollbar is attached to desktop window vertical
   SCROLLBAR_SetNumItems(hScroll,50);
   SCROLLBAR_SetPageSize(hScroll,25); //Pagesize must be smaller than NumItems.
   
   Btnhandle[0] = BUTTON_CreateEx(5,  5, 105, 105,hWin, WM_CF_SHOW,0,GUI_ID_DataShow );//ÐèÒª´«ÈëÒ»¸ö¸¸´°¿ÚµÄ¾ä±ú½øÈ¥
   Btnhandle[1] = BUTTON_CreateEx(115, 5, 105, 105,hWin,WM_CF_SHOW,0,GUI_ID_DataCapture );
   Btnhandle[2] = BUTTON_CreateEx(5, 115, 215, 105,hWin, WM_CF_SHOW, 0,GUI_ID_Graph);
   Btnhandle[3] = BUTTON_CreateEx(225, 5, 105, 215,hWin, WM_CF_SHOW, 0,GUI_ID_Calculator );
   Btnhandle[4] = BUTTON_CreateEx(445, 5, 105, 105,hWin,WM_CF_SHOW,  0,GUI_ID_Info);
   Btnhandle[5] = BUTTON_CreateEx(335,5, 105, 105, hWin, WM_CF_SHOW,0, GUI_ID_Time );
   
   break;
  
  case WM_PAINT:
   GUI_SetBkColor(GUI_BLUE);
   GUI_Clear();
   break;
     
  case WM_NOTIFY_PARENT:
   Id=WM_GetId(pMsg->hWinSrc);
   NCode = pMsg->Data.v;
   switch(NCode)
   {
    case WM_NOTIFICATION_RELEASED:
     switch (Id)
     {
      case GUI_ID_DataShow:
        WM_DeleteWindow(hWin);
        DataShow();
       break;
      
      case GUI_ID_Graph:

      
       break;
      case GUI_ID_Info:
       WM_DeleteWindow(hWin);
       Info();
       break;
      
      case GUI_ID_Calculator:
//       WM_DeleteWindow(hWin);
//       Calculator();
      
       break;
      
      case GUI_ID_DataCapture:
      
       break;     
      
      case GUI_ID_Time:  
       break;  
      
      default:
       break;
     }
    break;
   
    case WM_NOTIFICATION_VALUE_CHANGED:
     if(WM_GetId(pMsg->hWinSrc)== GUI_ID_HSCROLL)// the message get from horinzontal scrollbar
     {
      WM_GetScrollState(pMsg->hWinSrc, &ScrollState);
      if(_x!=ScrollState.v)
      {
       int x=0;
       for(x=0;x<7;x++)
       {
        WM_MoveWindow(Btnhandle[x],(_x-ScrollState.v)*10,0);
       }
      }
      _x=ScrollState.v;
     }      
    break;   
   
    default:
     break;
   }
  break;
  case WM_DELETE:
   break;
  
  default:
   WM_DefaultProc(pMsg);
  break;
}
}
void Main_Menu(void)
{
  WM_CreateWindow(0,0,LCD_XSIZE,LCD_YSIZE,WM_CF_SHOW,&_callback,0);//Create the desktop window  
}

A界面:

#include "Datashow.h"
#define Btn_Ordinate          LCD_YSIZE-35
#define BtnGraph_Abscissa       LCD_XSIZE-200
#define BtnPause_Abscissa       LCD_XSIZE-130
#define BtnBack_Abscissa        LCD_XSIZE-60
static const GUI_WIDGET_CREATE_INFO DataCaptureCreate[] =
{
{ FRAMEWIN_CreateIndirect,"Can and Usart Data Display",GUI_DATASHOW_FRAMEWIN,0,0,LCD_XSIZE,LCD_YSIZE,0,0 },// create the father window

{ TEXT_CreateIndirect,"Integer1:",GUI_DATASHOW_INT1,5,5,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer2:",GUI_DATASHOW_INT2,5,25,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer3:",GUI_DATASHOW_INT3,5,45,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer4:",GUI_DATASHOW_INT4,5,65,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer5:",GUI_DATASHOW_INT5,5,85,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer6:",GUI_DATASHOW_INT6,5,105,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer7:",GUI_DATASHOW_INT7,5,125,50,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Integer8:",GUI_DATASHOW_INT8,5,145,50,20,0,GUI_TA_RIGHT },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT1,   55,  2, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT2,   55,  22, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT3,   55,  42, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT4,   55,  62, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT5,   55,  82, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT6,   55,  102, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT7,   55,  122, 80, 20,  0,   50 },
{ EDIT_CreateIndirect,  NULL,   GUI_DATASHOW_EDIT8,   55,  142, 80, 20,  0,   50 },
{ TEXT_CreateIndirect,"Float1:",GUI_DATASHOW_Float1, 140,5,35,20,0,GUI_TA_RIGHT  },
{ TEXT_CreateIndirect,"Float2:",GUI_DATASHOW_Float2, 140,25,35,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Float3:",GUI_DATASHOW_Float3, 140,45,35,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Float4:",GUI_DATASHOW_Float4, 140,65,35,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Float5:",GUI_DATASHOW_Float5, 140,85,35,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Float6:",GUI_DATASHOW_Float6, 140,105,35,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Float7:",GUI_DATASHOW_Float7, 140,125,35,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"Float8:",GUI_DATASHOW_Float8, 140,145,35,20,0,GUI_TA_RIGHT },

{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT11,   175,  2, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT12,   175,  22, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT13,   175,  42, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT14,   175,  62, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT15,   175,  82, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT16,   175,  102, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT17,   175,  122, 80, 20,  0,    50 },
{ EDIT_CreateIndirect,  NULL,  GUI_DATASHOW_EDIT18,   175,  142, 80, 20,  0,    50 },

{ TEXT_CreateIndirect,"UrtInt1:",GUI_DATASHOW_USART_INT1, 260,5,38,20,0,  GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtInt2:",GUI_DATASHOW_USART_INT2, 260,25,38,20,0, GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtInt3:",GUI_DATASHOW_USART_INT3, 260,45,38,20,0, GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtInt4:",GUI_DATASHOW_USART_INT4, 260,65,38,20,0, GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtFlt1:",GUI_DATASHOW_USART_FLT1, 260,85,38,20,0, GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtFlt2:",GUI_DATASHOW_USART_FLT2, 260,105,38,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtFlt3:",GUI_DATASHOW_USART_FLT3, 260,125,38,20,0,GUI_TA_RIGHT },
{ TEXT_CreateIndirect,"UrtFlt4:",GUI_DATASHOW_USART_FLT4, 260,145,38,20,0,GUI_TA_RIGHT },

{ BUTTON_CreateIndirect,"Back", GUI_DATASHOW_BACK,  BtnBack_Abscissa, Btn_Ordinate, 50, 20, 0, 0 },
{ BUTTON_CreateIndirect,&quotause", GUI_DATASHOW_PAUSE,  BtnPause_Abscissa, Btn_Ordinate, 50, 20, 0, 0 },
{ BUTTON_CreateIndirect,"Graph", GUI_DATASHOW_GRAPH,  BtnGraph_Abscissa, Btn_Ordinate, 50, 20, 0, 0 },
};

static void _cbDataShow(WM_MESSAGE * pMsg)
{
int   NCode;
  int   Id;
WM_HWIN hDlg = pMsg->hWin;

switch (pMsg->MsgId)
{
  case WM_INIT_DIALOG:
  
    BUTTON_SetBkColor(WM_GetDialogItem(hDlg, GUI_DATASHOW_BACK),0,GUI_RED);
    BUTTON_SetBkColor(WM_GetDialogItem(hDlg, GUI_DATASHOW_PAUSE),0,GUI_RED);
    BUTTON_SetBkColor(WM_GetDialogItem(hDlg, GUI_DATASHOW_GRAPH),0,GUI_RED);
    BUTTON_SetTextColor(WM_GetDialogItem(hDlg, GUI_DATASHOW_BACK),0,GUI_BLACK);
    BUTTON_SetTextColor(WM_GetDialogItem(hDlg, GUI_DATASHOW_PAUSE),0,GUI_BLACK);
    BUTTON_SetTextColor(WM_GetDialogItem(hDlg, GUI_DATASHOW_GRAPH),0,GUI_BLACK);
  
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT1), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT2), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT3), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT4), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT5), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT6), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT7), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT8), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT11), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT12), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT13), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT14), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT15), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT16), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT17), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT18), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT20), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT21), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT22), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT23), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT24), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT25), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT26), GUI_TA_RIGHT);
    EDIT_SetTextAlign(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT27), GUI_TA_RIGHT);
   
    EDIT_SetMaxLen(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT1),11);
    EDIT_SetMaxLen(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT2),11);
    EDIT_SetMaxLen(WM_GetDialogItem(hDlg, GUI_DATASHOW_EDIT15),11);

   
   break;
   
  case WM_TIMER:
  break;
  
  case WM_NOTIFY_PARENT:
   Id    = WM_GetId(pMsg->hWinSrc);
   NCode = pMsg->Data.v;
   if(NCode==WM_NOTIFICATION_RELEASED)
   {
    switch(Id)
    {
     case GUI_DATASHOW_BACK:
      GUI_EndDialog(hDlg, 0);
      Main_Menu();
      GPIOG->ODR^=GPIO_Pin_6;
      break;
     
     case GUI_DATASHOW_PAUSE:
      GPIOG->ODR^=GPIO_Pin_6;
      break;
     
     case GUI_DATASHOW_GRAPH:

      break;
     
     default:
      break;
    }
   }
   break;
   
   default:
      WM_DefaultProc(pMsg);
   break;
     
}
}
void DataShow(void)
{
GUI_CreateDialogBox(DataCaptureCreate, GUI_COUNTOF(DataCaptureCreate), &_cbDataShow, 0, 0, 0);
}

B界面:

#include "Includes.h"const char Brief[]={
"Description:\n"
  "  This program provides some basic functions,su\n"
"ch as CAN Bus and Usart Data Monitoring,Captur\n"
"ing and curve drawing.In addition,I also add som\n"
"e small features in it, as you can see,there are a\n"
"timer and a simple calculator,some times they can\n"
"be useful.In the end, If you use all of them corre\n"
"ctly,They can bring you much convenience.\n"
};

static const GUI_WIDGET_CREATE_INFO InfoCreate[] =
{
{ FRAMEWIN_CreateIndirect,"Swust Robot Team",GUI_INFO_FRAMEWIN,0,0,LCD_XSIZE,LCD_YSIZE,0,0 },

{ TEXT_CreateIndirect,"",GUI_INFO_TEXT,5,0,LCD_XSIZE,LCD_YSIZE-50,0,TEXT_CF_LEFT },

{ BUTTON_CreateIndirect,"Back", GUI_INFO_BACK,LCD_XSIZE-60, LCD_YSIZE-45, 50, 20, 0, 0 },
};
static void _cb_Info(WM_MESSAGE* pMsg)
{
int   NCode;
  int   Id;
WM_HWIN hDlg = pMsg->hWin;
  switch (pMsg->MsgId)
{
  case WM_INIT_DIALOG:
   
   FRAMEWIN_SetClientColor(hDlg,GUI_WHITE);
    FRAMEWIN_SetTextAlign(hDlg,GUI_TA_HCENTER);
   FRAMEWIN_SetFont(hDlg,&GUI_Font16B_ASCII);
  
   TEXT_SetTextColor(WM_GetDialogItem(hDlg, GUI_INFO_TEXT),GUI_BLACK);
   TEXT_SetFont(WM_GetDialogItem(hDlg, GUI_INFO_TEXT),&GUI_Font13HB_1);
   TEXT_SetText(WM_GetDialogItem(hDlg, GUI_INFO_TEXT),Brief);
  
   BUTTON_SetBkColor(WM_GetDialogItem(hDlg, GUI_INFO_BACK),0,GUI_CYAN);
   BUTTON_SetBkColor(WM_GetDialogItem(hDlg, GUI_INFO_BACK),1,GUI_BLUE);
   BUTTON_SetText(WM_GetDialogItem(hDlg, GUI_INFO_BACK),"Back");
   
   break;
  
  case WM_NOTIFY_PARENT:
   Id    = WM_GetId(pMsg->hWinSrc);
   NCode = pMsg->Data.v;
  
   if (NCode == WM_NOTIFICATION_RELEASED)
   {
    switch (Id)
    {
     case GUI_INFO_BACK:  
      GPIOG->ODR^=GPIO_Pin_6;
     
      _x=0;
       GUI_EndDialog(hDlg, 0);
      Main_Menu();
      break;
     
     default:
      break;
    }
   }
  break;
   
  default:
   WM_DefaultProc(pMsg);
  break;
  }
}
void Info(void)
{
GUI_CreateDialogBox(InfoCreate, GUI_COUNTOF(InfoCreate), &_cb_Info, 0, 0, 0);
}

非常简单的3个界面啊,为啥切换回出现这个问题,我也是醉了。、
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107418
QQ
发表于 2015-3-27 09:31:54 | 显示全部楼层
试着不要删除Main_Menu();。让这个主窗口一直存在。再看看。另外把各个窗口返回时的函数Main_Menu();删除掉。
回复

使用道具 举报

336

主题

2042

回帖

3055

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3055
发表于 2015-3-27 09:47:53 | 显示全部楼层
有个懒办法,只要内存大一点就可以。

所有窗口,对话框,控件都不要删除。不用的时候,隐藏就好了。

EMWIN在删除资源的时候,不知道什么时候就会死机。又没有时间仔细琢磨。。。。
回复

使用道具 举报

2

主题

5

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2015-3-27 19:51:07 | 显示全部楼层

回 eric2013 的帖子

eric2013:试着不要删除Main_Menu();。让这个主窗口一直存在。再看看。另外把各个窗口返回时的函数Main_Menu();删除掉。 (2015-03-27 09:31) 
我试了一下这个方法, 对于某些窗口是没问题的,很奇怪,比如,我主界面切换到A,如果切换之前我不删除主界面,那么A界面会绘制的不完整,反之我删除主界面那么就是正常的,但是有些界面 如果我删除主界面,切换后再创建主界面,那么几次就死机了,但是如果我不删除主界面,切换的话,就又是正常的, ,为什么会这样,我用的ucgui
回复

使用道具 举报

2

主题

5

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2015-3-27 19:52:40 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:有个懒办法,只要内存大一点就可以。

所有窗口,对话框,控件都不要删除。不用的时候,隐藏就好了。

EMWIN在删除资源的时候,不知道什么时候就会死机。又没有时间仔细琢磨。。。。 (2015-03-27 09:47) 
我没有用ucgui, 我采取的是那种切换啥界面就先删除当前的再创建你需要的,  有个问题,我现在的界面切换都是基于对话框DIalog的,如果我要实现Dialog和一个不是任何控件的界面切换又咋办呢,这个界面上面可能就显示了几个字符,还有就是单独创建了一个button啥的。、
回复

使用道具 举报

5

主题

69

回帖

5

积分

初级会员

积分
5
发表于 2015-3-30 17:47:18 | 显示全部楼层
遇到过类似的问题,应该是内存不够用了,当时调大内存就好了。还可能是堆栈的大小不够了  都调大试试看
回复

使用道具 举报

5

主题

69

回帖

5

积分

初级会员

积分
5
发表于 2015-3-30 17:48:59 | 显示全部楼层
还有个办法供参考 楼主把每个界面里面的控件删除一部分,留下几个看看是不是就没问题了,如果是这样就是内存不够了,检查哪里有泄漏了
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
发表于 2015-4-13 11:27:04 | 显示全部楼层
没看你的代码,一般来讲,这种来回切界面导致死机,是因为在来回切的时候不小心把父窗口的句柄删除了,导致没爹了。
回复

使用道具 举报

24

主题

36

回帖

24

积分

初级会员

积分
24
发表于 2015-4-13 18:49:12 | 显示全部楼层
可以把程序打包一份上传来吗  看一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-31 00:05 , Processed in 0.282895 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表