硬汉嵌入式论坛

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

[emWin] 关于两个窗口间的切换问题

[复制链接]

14

主题

55

回帖

14

积分

初级会员

积分
14
发表于 2014-10-29 15:41:09 | 显示全部楼层 |阅读模式
我通过按键来实现两个窗口之间的切换,来回切换20次就挂掉了什么情况,我没有建立窗口,每个窗口都是把背景窗口设置成对应的回调函数。
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-29 15:44:07 | 显示全部楼层
程序没挂掉,还是可以获取到按键值,只是界面不再响应。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2014-10-29 15:48:41 | 显示全部楼层
把代码贴出来。
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 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次后界面就挂了
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-29 17:16:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:把代码贴出来。 (2014-10-29 15:48)
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次后界面就挂了
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-29 17:18:13 | 显示全部楼层

回 mbyml 的帖子

mbyml:void (*UIFunction[4])(void) = {UI1, UI2, UI3, UI4};
int sel = 0;

void Menu_Key_Deal(unsigned char key)
....... (2014-10-29 17:16)
程序最开始调enter_mainmenu(void)进入主窗口
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-30 09:21:48 | 显示全部楼层
问题有哪位大神能讲讲么
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2014-10-30 21:28:41 | 显示全部楼层

回 mbyml 的帖子

mbyml:问题有哪位大神能讲讲么 (2014-10-30 09:21) 
调用动态内存的查询函数,时刻检测动态内存的使用,看看是不是有些控件一直占用着动态内存没有释放。
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-31 09:02:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:调用动态内存的查询函数,时刻检测动态内存的使用,看看是不是有些控件一直占用着动态内存没有释放。 (2014-10-30 21:28)
我没创建控件,只调了画线,显示图片,显示字符一些函数
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-31 09:29:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:调用动态内存的查询函数,时刻检测动态内存的使用,看看是不是有些控件一直占用着动态内存没有释放。 (2014-10-30 21:28)
我板子上的程序是带系统的,给emwin创建了一个任务,任务函数就是主菜单界面的入口函数void enter_mainmenu(void)
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-31 10:45:19 | 显示全部楼层

回 eric2013 的帖子

eric2013:调用动态内存的查询函数,时刻检测动态内存的使用,看看是不是有些控件一直占用着动态内存没有释放。 (2014-10-30 21:28)
动态内存的查询函数是这个吗GUI_ALLOC_GetNumFreeBytes();
回复

使用道具 举报

14

主题

55

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-10-31 12:26:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:调用动态内存的查询函数,时刻检测动态内存的使用,看看是不是有些控件一直占用着动态内存没有释放。 (2014-10-30 21:28)
BUG解决了,是任务的问题。谢谢啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2014-10-31 12:44:02 | 显示全部楼层

回 mbyml 的帖子

mbyml:BUG解决了,是任务的问题。谢谢啊 (2014-10-31 12:26) 
好的。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2015-12-4 10:28:34 | 显示全部楼层
什么任务问题呢,我的五个界面,切换会死机,怎么回事呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-12-4 20:07:46 | 显示全部楼层

回 lingbuweibu 的帖子

lingbuweibu:什么任务问题呢,我的五个界面,切换会死机,怎么回事呢 (2015-12-04 10:28) 
排除下,看看是那个界面的切换导致的,可以先设置两个界面进行显示,然后进行排除,其实5个界面的话,不显示的界面可以做隐藏处理。需要的时候显示即可,这种方式简单有效。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 06:14 , Processed in 0.315366 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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