硬汉嵌入式论坛

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

[emWin] 创建窗口过多导致有些控件不能正常使用死机的问题

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2019-7-24 16:35:33 | 显示全部楼层 |阅读模式
我采用的是显示/隐藏的方式来使用不同的窗口,我创建了9个窗口再增加就会出现有些控件不能正常使用死机的问题,有没有谁碰到这种问题,帮忙看看,下面是我的部分代码。
1)#define GUI_NUMBYTES  (1024 * 1024 * 12)
2)WM_HWIN hPage[15];

if (!WM_IsWindow(hPage[0]))
{
        hPage[0] = CreateWindow_source(WM_HBKWIN);
                               
        hPage[1] = CreateWindow_poweroff(hPage[0]);
        WM_HideWindow(hPage[1]);

        hPage[2] = CreateWindow_setting(hPage[0]);
        WM_HideWindow(hPage[2]);

        hPage[3] = CreateWindow_fm(hPage[0]);
        WM_HideWindow(hPage[3]);

        hPage[4] = CreateWindow_dab(hPage[0]);
        WM_HideWindow(hPage[4]);

        hPage[5] = CreateWindow_cd(hPage[0]);
        WM_HideWindow(hPage[5]);

        hPage[6] = CreateWindow_alarm(hPage[0]);
        WM_HideWindow(hPage[6]);

        hPage[7] = CreateWindow_setalarm(hPage[0]);
        WM_HideWindow(hPage[7]);
                               
        hPage[8] = App_CalendarChild(hPage[0]);
        WM_HideWindow(hPage[8]);
                               
        if (!WM_IsWindow(hPage[9]))
        {
                hPage[9] = CreateWindow_update(WM_HBKWIN);
        }
        WM_HideWindow(hPage[9]);
                               
        WM_ShowWindow(hPage[0]);
}

如果我把其中的某一个去掉又可以正常显示操作了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-7-24 16:36:42 | 显示全部楼层
/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.30                          *
*        Compiled Jul  1 2015, 10:50:32                              *
*        (c) 2015 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: www.segger.com  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
// USER END

#include "DIALOG.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "app_nvr.h"
#include "app_dab.h"
#include "com_assert.h"
#include "N9H30.h"
#include "app_event.h"
#include "lib_event_api.h"
#include "app_gui.h"

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_WINDOW_fm                 (GUI_ID_USER + 0x100)

#define ID_TEXT_fm0                 (GUI_ID_USER + 0x101)
#define ID_TEXT_fm1                 (GUI_ID_USER + 0x102)
#define ID_TEXT_fm2                 (GUI_ID_USER + 0x103)

#define ID_BUTTON_fm0                 (GUI_ID_USER + 0x104)
#define ID_BUTTON_fm1                 (GUI_ID_USER + 0x105)
#define ID_BUTTON_fm2                 (GUI_ID_USER + 0x106)
#define ID_BUTTON_fm3                 (GUI_ID_USER + 0x107)

#define ID_SLIDER_fm0                 (GUI_ID_USER + 0x108)
#define ID_SLIDER_fm1              (GUI_ID_USER + 0x109)

extern GUI_CONST_STORAGE GUI_BITMAP bmMusicPre;
extern GUI_CONST_STORAGE GUI_BITMAP bmMusicNext;
extern GUI_CONST_STORAGE GUI_BITMAP bmSpeaker;
extern GUI_CONST_STORAGE GUI_BITMAP bmSpeakerMute;
extern GUI_CONST_STORAGE GUI_BITMAP bmReturn;

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
//static uint8_t s_ucPlayStatus = 0;
static uint8_t s_ucSpeakerStatus = 1;

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate_fm[] = {
  { WINDOW_CreateIndirect, "Window",  ID_WINDOW_fm,   0,   82,  600, 942, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Return",    ID_BUTTON_fm0,  500,   0,  100, 100, 0, 0, 0 },
        { BUTTON_CreateIndirect, "MusicPre",   ID_BUTTON_fm1,  40, 405,   48,  48, 0, 0, 0 },
        { BUTTON_CreateIndirect, "MusicNext",  ID_BUTTON_fm2,  130, 405,   48,  48, 0, 0, 0 },
        { BUTTON_CreateIndirect, "MusicSpk",   ID_BUTTON_fm3,  230, 399,   72,  72, 0, 0, 0 },
        { SLIDER_CreateIndirect, "Process",         ID_SLIDER_fm0, 40, 365,  500,  16, 0, 0x0, 0 },
        { SLIDER_CreateIndirect, "Speaker",    ID_SLIDER_fm1, 310, 425, 200, 20, 0, 0x0, 0  },
        { TEXT_CreateIndirect, "87.5MHz",        ID_TEXT_fm0, 40, 345, 270, 20, 0, 0x64, 0 },
        { TEXT_CreateIndirect, "108.0MHz",       ID_TEXT_fm1, 460, 345, 100, 20, 0, 0x64, 0 },
        { TEXT_CreateIndirect, "87.5",           ID_TEXT_fm2, 150, 120, 300, 100, 0, 0x64, 0 },
};

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

static void _cbButtonBack_fm(WM_MESSAGE * pMsg)
{
        WM_HWIN  hWin;

        hWin  = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                        if (BUTTON_IsPressed(hWin))
                        {
                                GUI_SetColor(GUI_DARKGRAY);
                                GUI_AA_FillCircle(100, 0, 72);
                                GUI_SetBkColor(GUI_DARKGRAY);
                                GUI_SetColor(GUI_BLACK);
                                GUI_DrawBitmap(&bmReturn, 40, 5);
                        }
                        else
                        {
                                GUI_SetColor(GUI_LIGHTBLUE);
                                GUI_AA_FillCircle(100, 0, 72);
                                GUI_SetBkColor(GUI_LIGHTBLUE);
                                GUI_SetColor(GUI_BLACK);
                                GUI_DrawBitmap(&bmReturn, 40, 5);
                        }

                        break;

                default:
                        BUTTON_Callback(pMsg);
        }
}

static void _cbButtonPre_fm(WM_MESSAGE * pMsg)
{
//        WM_HWIN  hWin;

//        hWin  = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                        GUI_DrawBitmap(&bmMusicPre, 0, 0);
                        break;

                default:
                        BUTTON_Callback(pMsg);
        }
}

static void _cbButtonNext_fm(WM_MESSAGE * pMsg)
{
//        WM_HWIN  hWin;

//        hWin  = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                        GUI_DrawBitmap(&bmMusicNext, 0, 0);
                        break;

                default:
                        BUTTON_Callback(pMsg);
        }
}

static void _cbButtonSpeaker_fm(WM_MESSAGE * pMsg)
{
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                        if(s_ucSpeakerStatus == 0)
                        {
                                GUI_DrawBitmap(&bmSpeakerMute, 8, 8);
                        }
                        else
                        {
                                GUI_DrawBitmap(&bmSpeaker, 8, 8);
                        }
                        break;

                default:
                        BUTTON_Callback(pMsg);
        }
}

void vol_sync_fm(unsigned char vol)
{
        WM_HWIN hItem;
               
        hItem = WM_GetDialogItem(hPage[3], ID_SLIDER_fm1);
        SLIDER_SetValue(hItem, vol);
}

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog_fm(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        int     NCode;
        int     Id;
        char    buf[50];
        uint32_t ulFMfreq;
        unsigned char vol_data;
       
        switch (pMsg->MsgId)
        {

                case WM_INIT_DIALOG:
                        hItem = pMsg->hWin;
                        WINDOW_SetBkColor(hItem, GUI_BLACK);
               
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_fm0);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _cbButtonBack_fm);

               
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_fm1);
                        #if 0
                        BUTTON_SetText(hItem, "");
                        BUTTON_SetSkinClassic(hItem);
                        BUTTON_SetBkColor(hItem, BUTTON_CI_UNPRESSED, GUI_BLACK);
                        BUTTON_SetBkColor(hItem, BUTTON_CI_PRESSED, GUI_BLACK);
                        BUTTON_SetBitmap(hItem, BUTTON_BI_UNPRESSED, &bmMusicPre);
                        #else
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _cbButtonPre_fm);
                        #endif
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_fm2);
                        #if 0
                        BUTTON_SetText(hItem, "");
                        BUTTON_SetSkinClassic(hItem);
                        BUTTON_SetBkColor(hItem, BUTTON_CI_UNPRESSED, GUI_BLACK);
                        BUTTON_SetBkColor(hItem, BUTTON_CI_PRESSED, GUI_BLACK);
                        BUTTON_SetBitmap(hItem, BUTTON_BI_UNPRESSED, &bmMusicNext);
                        #else
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _cbButtonNext_fm);
                        #endif

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_fm3);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _cbButtonSpeaker_fm);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm0);
                        SLIDER_SetBkColor(hItem, GUI_WHITE);
                        SLIDER_SetFocusColor (hItem, GUI_LIGHTBLUE);
                        //SLIDER_SetValue(hItem, 0);
                        SLIDER_SetWidth(hItem, 8);
                        SLIDER_SetSkinClassic(hItem);
                        SLIDER_SetRange(hItem, 87500, 108000);
                        ulFMfreq = AppNvr_GetFmFreq();

                        sprintf(buf, "%.2fMHZ", (float)ulFMfreq/1000);
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm2);
                        TEXT_SetText(hItem,  (const char *)buf);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm0);
                        SLIDER_SetValue(hItem, ulFMfreq);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm1);
                        SLIDER_SetBkColor(hItem, GUI_WHITE);
                        SLIDER_SetFocusColor (hItem, GUI_LIGHTBLUE);
                        SLIDER_SetRange(hItem, 0, 32);
                        SLIDER_SetValue(hItem, AppNvr_MasterVolumeValueGet());
                        SLIDER_SetWidth(hItem, 8);
                        SLIDER_SetSkinClassic(hItem);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm0);
                        TEXT_SetFont(hItem, GUI_FONT_20B_1);
                        TEXT_SetTextColor(hItem, GUI_LIGHTBLUE);
                        TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);



                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm1);
                        TEXT_SetFont(hItem, GUI_FONT_20B_1);
                        TEXT_SetTextColor(hItem, GUI_LIGHTBLUE);
                        TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm2);
                        TEXT_SetFont(hItem, GUI_FONT_20_1);
                        TEXT_SetTextColor(hItem, GUI_LIGHTBLUE);
                        TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);

                        break;

                case WM_PAINT:
                        //GUI_SetBkColor(GUI_BLACK);
                        //GUI_Clear();
                        break;

                case WM_NOTIFY_PARENT:
                        Id    = WM_GetId(pMsg->hWinSrc);
                        NCode = pMsg->Data.v;
                        switch(Id)
                        {
                                case ID_BUTTON_fm0:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;

                                                case WM_NOTIFICATION_RELEASED:
                                                        WM_HideWindow(hPage[1]);
                                                        WM_HideWindow(hPage[2]);
                                                        WM_HideWindow(hPage[3]);
                                                        WM_HideWindow(hPage[4]);
                                                        WM_HideWindow(hPage[5]);
                                                        WM_ShowWindow(hPage[0]);
                                                        break;
                                        }
                                        break;

                                case ID_BUTTON_fm1:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;

                                                case WM_NOTIFICATION_RELEASED:
//                                                        if(s_ucPlayStatus == 1)
                                                        {
                                                                        ulFMfreq = AppNvr_GetFmFreq();
                                                                        if (ulFMfreq < FMFRE_MIN)
                                                                        {
                                                                                ulFMfreq = FMFRE_MAX;
                                                                        }
                                                                        else
                                                                        {
                                                                                ulFMfreq = ulFMfreq - 50;
                                                                        }
                                                                        if (AppNvr_InputSourceGet() == SRC_FM)
                                                                        {
                                                                                PutEvent(UI_EVT_IO(IO_EVT_SCROLL_DOWN, IO_KEY_UP), 0, NULL);
                                                                        }
                                                                       
                                                                        sprintf(buf, "%.2fMHz", (float)ulFMfreq/1000);
                                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm2);
                                                                        TEXT_SetText(hItem,  (const char *)buf);

                                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm0);
                                                                        SLIDER_SetValue(hItem, ulFMfreq);
                                                        }
                                                        break;
                                        }
                                        break;

                                case ID_BUTTON_fm2:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;

                                                case WM_NOTIFICATION_RELEASED:
//                                                        if(s_ucPlayStatus == 1)
                                                        {
                                                                        ulFMfreq = AppNvr_GetFmFreq();
                                                                        if (ulFMfreq > FMFRE_MAX)
                                                                        {
                                                                                ulFMfreq = FMFRE_MIN;
                                                                        }
                                                                        else
                                                                        {
                                                                                ulFMfreq = ulFMfreq + 50;
                                                                        }
                                                                        if (AppNvr_InputSourceGet() == SRC_FM)
                                                                        {
                                                                                PutEvent(UI_EVT_IO(IO_EVT_SCROLL_UP, IO_KEY_UP), 0, NULL);
                                                                        }

                                                                        sprintf(buf, "%.2fMHz", (float)ulFMfreq/1000);
                                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm2);
                                                                        TEXT_SetText(hItem,  (const char *)buf);

                                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm0);
                                                                        SLIDER_SetValue(hItem, ulFMfreq);
                                                        }
                                                        break;
                                        }
                                        break;

                                case ID_SLIDER_fm0:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;

                                                case WM_NOTIFICATION_RELEASED:
                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm0);
                                                        ulFMfreq = SLIDER_GetValue(hItem);

                                                        sprintf(buf, "%.2fMHz", (float)ulFMfreq/1000);
                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_fm2);
                                                        TEXT_SetText(hItem,  (const char *)buf);
                                               
                                                        FMAPI_SetFreq(ulFMfreq);
                                                        AppNvr_SetFmFreq(ulFMfreq);
                                                        break;
                                        }
                                        break;

                                case ID_SLIDER_fm1:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;

                                                case WM_NOTIFICATION_RELEASED:
                                                        hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_fm1);
                                                        vol_data = SLIDER_GetValue(hItem);
                                                        AppNvr_MasterVolumeValueSet(vol_data);
                                                        break;
                                        }
                                        break;

                                case ID_BUTTON_fm3:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;

                                                case WM_NOTIFICATION_RELEASED:
                                                        if(s_ucSpeakerStatus == 1)
                                                        {
                                                                s_ucSpeakerStatus = 0;
                                                                LibEventDoImmediately(LibEvent_ID__NosignalMute);
                                                        }
                                                        else
                                                        {
                                                                s_ucSpeakerStatus = 1;
                                                                LibEventDoImmediately(LibEvent_ID__NosignalMuteRelease);
                                                        }
                                                        break;
                                        }
                                        break;
                        }
                        break;

                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateWindow
*/
WM_HWIN CreateWindow_fm(WM_HWIN hParent);
WM_HWIN CreateWindow_fm(WM_HWIN hParent) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate_fm, GUI_COUNTOF(_aDialogCreate_fm), _cbDialog_fm, hParent, 0, 0);
  return hWin;
}

/*************************** End of file ****************************/
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-7-24 16:38:14 | 显示全部楼层
上面是我参照硬汉写的FM控制界面
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-7-24 16:57:34 | 显示全部楼层
本帖最后由 袁荣 于 2019-7-24 16:58 编辑

file:///C:/Users/Administrator/Desktop/pic.jpg pic.jpg
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-7-24 17:54:00 | 显示全部楼层
问题解决了是由于编译器优化导致的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-24 20:31:36 | 显示全部楼层
袁荣 发表于 2019-7-24 17:54
问题解决了是由于编译器优化导致的

不好意思楼主,回复晚了。

另外记得测试下你的动态内存剩余。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-7-25 15:16:56 | 显示全部楼层
谢谢硬汉,我给了12M,才用了41K,这个是没问题的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 05:32 , Processed in 0.292400 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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