硬汉嵌入式论坛

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

[emWin] 请教STM32F103平台上出现按钮创建对话框程序死掉问题

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2017-9-26 11:17:28 | 显示全部楼层 |阅读模式
按钮创建对话框三次后程序会死掉,同时请教STemwin内存管理问题
代码如下:

extern const GUI_BITMAP bm3;

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    { FRAMEWIN_CreateIndirect,  "",           0,                       0,  0,  320,240, 0,0},
        { BUTTON_CreateIndirect,    "Address",        GUI_ID_BUTTON0,         240,204,80,36,0,0},
        { BUTTON_CreateIndirect,    &quotM2.5",            GUI_ID_BUTTON1,         240,24,80,60 ,0,0},
        { BUTTON_CreateIndirect,    "Temperature",    GUI_ID_BUTTON2,         240,84,80,60, 0,0},
        { BUTTON_CreateIndirect,    "humidity",       GUI_ID_BUTTON3,         240,144,80,60, 0,0},
   
};

static const GUI_WIDGET_CREATE_INFO _aButtonCreateA[] = {
    { FRAMEWIN_CreateIndirect,  "Address",           0,                       40,  40,  200,180, 0,0},
};

static const GUI_WIDGET_CREATE_INFO _aButtonCreateP[] = {
    { FRAMEWIN_CreateIndirect,  &quotM2.5",           0,                      40,  40,  200,180,FRAMEWIN_CF_ACTIVE,0},
};
static const GUI_WIDGET_CREATE_INFO _aButtonCreateT[] = {
    { FRAMEWIN_CreateIndirect,  "Temperature",           0,                      40,  40,  200,180,FRAMEWIN_CF_ACTIVE,0},
};
static const GUI_WIDGET_CREATE_INFO _aButtonCreateH[] = {
    { FRAMEWIN_CreateIndirect,  "humidity",           0,                      40,  40,  200,180,FRAMEWIN_CF_ACTIVE,0},
};

void upmap(void);
/*********************************************************************
*
*       A′°¿ú
*
**********************************************************************
*/
void PaintDialog_A(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
        upmap();
}

void InitDialog_A(WM_MESSAGE * pMsg)
{
        BUTTON_Handle Button_Add;
    WM_HWIN hWin = pMsg->hWin;
        FRAMEWIN_SetTitleVis(hWin,0);
        FRAMEWIN_SetBorderSize(hWin,0);
        FRAMEWIN_SetClientColor(hWin,GUI_BLACK);
        Button_Add=WM_GetDialogItem(hWin,GUI_ID_BUTTON0);
        BUTTON_SetBkColor(Button_Add,0,0xff0000 + (255 - 200) * 0x101L);
        BUTTON_SetBkColor(Button_Add,1,GUI_BLUE);
}

/*********************************************************************
*
*       BD¡′°
*
**********************************************************************
*/
void PaintDialog_ADD(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
        
}


void InitDialog_ADD(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
//         FRAMEWIN_AddButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0, GUI_ID_BUTTON6);
        FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
        FRAMEWIN_SetTitleHeight(hWin,16);
        FRAMEWIN_SetBarColor(hWin,1,0xff0000 + (255 - 200) * 0x101L);
}

/*********************************************************************
*
*       cbButton»Øμ÷oˉêy
*
**********************************************************************
*/
static void _cbButton_ADD(WM_MESSAGE * pMsg)
{
        int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
            case WM_INIT_DIALOG:
            InitDialog_ADD(pMsg);
            break;
//             case WM_NOTIFY_PARENT:
//             Id = WM_GetId(pMsg->hWinSrc);
//             NCode = pMsg->Data.v;        
//             switch (Id)
//             {
//                 case GUI_ID_BUTTON6:
//                     if(NCode==WM_NOTIFICATION_RELEASED)
//                                         {
//                                             GUI_EndDialog(hWin,0);
//                                             WM_DeleteWindow(pMsg->hWinSrc);
//                                         }
//                                 break;
//                         }
            case WM_DELETE:
                    GUI_ALLOC_Free(pMsg->hWin);
                    break;
            default:
          WM_DefaultProc(pMsg);
        }
}

static void _cbButton_PM(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
                case WM_INIT_DIALOG:
                                        InitDialog_ADD(pMsg);
                                        break;
                case WM_DELETE:
                                    GUI_ALLOC_Free(pMsg->hWin);
                                    break;
        default:
            WM_DefaultProc(pMsg);
    }
}
static void _cbButton_TMP(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
                case WM_INIT_DIALOG:
                                        InitDialog_ADD(pMsg);
                                        break;
                case WM_DELETE:
                                    GUI_ALLOC_Free(pMsg->hWin);
                                    break;
        default:
            WM_DefaultProc(pMsg);
    }
}
static void _cbButton_HM(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
                case WM_INIT_DIALOG:
                                        InitDialog_ADD(pMsg);
                                        break;
                case WM_DELETE:
                                    GUI_ALLOC_Free(pMsg->hWin);
                                    break;
        default:
            WM_DefaultProc(pMsg);
    }
}

/*********************************************************************
*
*       cbCallback£¨Ö÷½çÃæ£©   »Øμ÷oˉêy
*
**********************************************************************
*/
static void _cbCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            PaintDialog_A(pMsg);
            break;
        case WM_INIT_DIALOG:
            InitDialog_A(pMsg);
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (Id)
            {
                case GUI_ID_BUTTON0:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                                        {
                       GUI_ExecDialogBox(_aButtonCreateA, GUI_COUNTOF(_aButtonCreateA), &_cbButton_ADD, hWin, 0, 0);
                    }
                                break;
                                case GUI_ID_BUTTON1:
                                        if(NCode==WM_NOTIFICATION_RELEASED)
                                        {
                                            GUI_ExecDialogBox(_aButtonCreateP,GUI_COUNTOF(_aButtonCreateP),&_cbButton_PM,hWin,0,0);
                                        }
                                break;
                                case GUI_ID_BUTTON2:
                                        if(NCode==WM_NOTIFICATION_RELEASED)
                                        {
                                            GUI_ExecDialogBox(_aButtonCreateT,GUI_COUNTOF(_aButtonCreateT),&_cbButton_TMP,hWin,0,0);
                                        }
                                break;
                                case GUI_ID_BUTTON3:
                                        if(NCode==WM_NOTIFICATION_RELEASED)
                                        {
                                            GUI_ExecDialogBox(_aButtonCreateH,GUI_COUNTOF(_aButtonCreateH),&_cbButton_HM,hWin,0,0);
                                        }
                                break;                                                         
                    }
                default:
                    WM_DefaultProc(pMsg);
    }
}


/*********************************************************************
*
*       MainTask
*
**********************************************************************
*/
int main(void)
{
    SystemInit();
    delay_init(72);         //Ñóê±3õê¼»ˉ
    NVIC_Configuration();
    uart_init(9600);
     LED_Init();
    KEY_Init();
    Timerx_Init();
  GUI_Init();
  WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
  WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
    GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    while(1)
    {
    GUI_Exec();
    }
}


void upmap(void)
{
    //GUI_MEMDEV_Handle item;
    //hWnd=WM_CreateWindow(0,0,320,240,WM_CF_SHOW,&_cbBkWindow,0);
    //item = GUI_MEMDEV_Create(0,0,320,24);
    //GUI_MEMDEV_Select(item);
    GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
    GUI_SetBkColor(GUI_WHITE);
    GUI_SetFont(&GUI_Font16_ASCII);
    GUI_SetColor(0xff0000 + (255 - 200) * 0x101L);
    GUI_SetTextMode(GUI_TM_TRANS);
    GUI_DrawBitmap(&bm3,0,0);
    GUI_DispStringAt("kn", 40, 5);
    //GUI_MEMDEV_CopyToLCDAA(item);
    //GUI_MEMDEV_Delete(item);
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-9-26 12:20:41 | 显示全部楼层
程序中有两个主要问题,一个是函数 GUI_ALLOC_Free(pMsg->hWin);,此函数删掉,关闭对话框会自动收回。

还有一个最主要的问题,这里不可以使用阻塞式的对话框创建方式,这样会层层嵌套,直到死机:GUI_ExecDialogBox
程序中所有的GUI_ExecDialogBox函数,统一修改成非阻塞的函数:GUI_CreateDialogBox来实现。

另外多窗口的控制管理可以学习下我们的这个例子:http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834

QQ截图20170926121717.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 21:13 , Processed in 0.234633 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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