硬汉嵌入式论坛

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

[emWin] 窗口切换几次后出现死机

[复制链接]

8

主题

21

回帖

45

积分

新手上路

积分
45
发表于 2014-6-6 10:43:40 | 显示全部楼层 |阅读模式
使用按键切换窗口,但是切换几次后,发现程序会跑飞,按键显示不出来,调试发现死机是执行了一下 GUIDEMO_main()中的GUI_Exec()函数之后程序运行不正常,不显示按键并且不执行while(1)中语句
附上代码如下


void GUIDEMO_main()
{
    ahButton = BUTTON_Create(450, 240,  25,  10,    ID_BUTTON_1,  BUTTON_CF_SHOW );
        
    BUTTON_SetBitmap(ahButton, BUTTON_BI_UNPRESSED, &bm1);   
    GUI_Exec();   
        
    while(1)
    {
    Current_Btn = GUI_WaitKey();
            
    switch(Current_Btn)
    {
         case ID_BUTTON_1:                    
        BUTTON_Delete(ahButton);                    
        GUI_Clear();
         CreateAWin();                           
         break;               
         default:
         break;
      }
    GUI_Delay(100);
    }
}
void CreateAssistantWin()
{
    hWinAant = GUI_CreateDialogBox(_aDgCreateAant,  GUI_COUNTOF(_aDgCreateAant),  _cbAant, 0, 0, 0);
}

void _cbAant(WM_MESSAGE * pMsg)
{
  int NCode;
  int Id;
   
  switch (pMsg->MsgId)
{        
    case WM_NOTIFY_PARENT:
        Id    = WM_GetId(pMsg->hWinSrc);
        NCode = pMsg->Data.v;
        switch(Id)
        {
            case ID_BUTTON_CANCAL:
                switch(NCode)
                {
                    case WM_NOTIFICATION_CLICKED:
                        break;
                    case WM_NOTIFICATION_RELEASED:
                           WM_DeleteWindow(hWinAtant);
                        GUI_Clear();   
                        GUIDEMO_main();   
                        break;
                    }
                break;
                    }
}
回复

使用道具 举报

8

主题

21

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2014-6-6 11:17:42 | 显示全部楼层
简单代码如下


#include "includes.h"
#include "MainTask.h"
#include "GUI.h"
#include "BUTTON.h"
#include "DIALOG.h"


#define ID_WINDOW                 0x01
#define ID_BUTTON_ENSURE     0x02
#define ID_BUTTON_CANCAL     0x03
#define ID_System                    0x04
WM_HWIN hWinAant;


const GUI_WIDGET_CREATE_INFO _aDgCreateAant[3] =
{
  { WINDOW_CreateIndirect, "Window", ID_WINDOW,                0,   0,   480, 272,     0, 0x0, 0 },
    { BUTTON_CreateIndirect, "OK",     ID_BUTTON_ENSURE,        160, 210,  64,  33,  0, 0x0, 0 },
    { BUTTON_CreateIndirect, "Cancal", ID_BUTTON_CANCAL,         254, 210,  64,  33,  0, 0x0, 0 },   

};

void _cbAant(WM_MESSAGE * pMsg)
{
  int NCode;
  int Id;
    WM_HWIN hWin = pMsg->hWin;
   
  switch (pMsg->MsgId)
    {   
        case WM_INIT_DIALOG:
            WINDOW_SetBkColor(hWin, 0x00000000);            
        break;
        case WM_NOTIFY_PARENT:
            Id    = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id)
            {               
                case ID_BUTTON_ENSURE:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            break;
                        case WM_NOTIFICATION_RELEASED:                           
                            break;
                    }
                break;
                case ID_BUTTON_CANCAL:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            break;
                        case WM_NOTIFICATION_RELEASED:   
                            WM_DeleteWindow(hWinAant);
                            GUI_Clear();   
                            GUIDEMO_main();                        
                            break;
                    }
                break;
            }
        break;
            
        default:
            WM_DefaultProc(pMsg);
            break;
  }
}

void CreateAantWin()
{
    hWinAant = GUI_CreateDialogBox(_aDgCreateAant, GUI_COUNTOF(_aDgCreateAant), _cbAant, 0, 0, 0);
}

void GUIDEMO_main(void)
{
        int Current_Btn;
        uint8_t i;
        BUTTON_Handle ahButton;   
            
        GUI_Clear();   
    ahButton = BUTTON_Create(150,  100,  SYSTEM_X_SIZE,  SYSTEM_Y_SIZE,    ID_System,  BUTTON_CF_SHOW );
        BUTTON_SetText(ahButton, "SYSTEM");
    //    BUTTON_SetBitmap(ahButton, BUTTON_BI_UNPRESSED, &bm5);   
        GUI_Exec();   
        
        while(1)
        {
            
            Current_Btn = GUI_WaitKey();
            
            switch(Current_Btn)
            {
                case     ID_System:                    
                        BUTTON_Delete(ahButton);
                        CreateAantWin();
                break;               
                default:
                    break;
            }
            GUI_Delay(100);
    }
}

/*******************************************************************
*
*       MainTask
*
********************************************************************
*/
void Draw_Wave(void);
void MainTask(void)
{
    GUI_Init();   
   
    GUI_SetBkColor(GUI_BLACK);

    GUIDEMO_main();
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2014-6-6 19:33:17 | 显示全部楼层
你的程序死在这个里面,你的GUIDEMO_main是死循环:
case WM_NOTIFICATION_RELEASED:   
                            WM_DeleteWindow(hWinAant);
                            GUI_Clear();   
                            GUIDEMO_main();                        
                            break;

回调函数无法退出。
回复

使用道具 举报

8

主题

21

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2014-6-9 14:01:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的程序死在这个里面,你的GUIDEMO_main是死循环:
case WM_NOTIFICATION_RELEASED:    
                           .. (2014-06-06 19:33) 
谢谢,问题解决了, 使能窗口使用内存设备,直接使用GUI_EndDialog(hWin, 0),返回上级界面。
现在还遇到一个问题:
通过一个按键进入下一界面,在这个界面里边要一直刷新界面,更新显示的内容,不知道这个函数应该加在什么地方能一直刷新界面。
代码就是在上述代码的基础上添加,在hWinAant窗口中做刷新界面。能否解决呢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 20:21 , Processed in 0.152349 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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