硬汉嵌入式论坛

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

[有问必答] stemwin窗口切换死机

[复制链接]

6

主题

10

回帖

6

积分

新手上路

积分
6
发表于 2014-10-30 18:17:19 | 显示全部楼层 |阅读模式
原理:先创建1个窗口,然后根据键值删除当前窗口,再创建另一个窗口实现窗口切换

切换的时候发现死机了,但是我将所有的窗口里面的控件删除到只留下1个button按键时,发现可以正常切换
窗口增加很多控件时,切换后就发现死机,请问是什么原因导致的

还有为什么调用WM_DeleteWindow()函数删除窗口,为什么屏还有显示,非得调用GUI_clear()清屏么
/*
*********************************************************************************************************
*                                          
*        模块名称 : GUI界面主函数
*        文件名称 : MainTask.c
*        版    本 : V1.0
*        说    明 : GUI界面主函数
*        修改记录 :
*                版本号    日期          作者                 说明
*                v1.0    2013-03-26    Eric2013            版本emWin5.16
*       v2.0    2014-02-23    Eric2013            版本STemWin5.22
*
*      Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "MainTask.h"

/*
********************************************************************************************************
*                             静态数据
********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
        { FRAMEWIN_CreateIndirect, "Edit winmode", 0,         10,  10, 300, 240, FRAMEWIN_CF_MOVEABLE},
        { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT0,    10,  10, 110,  20, 0, 15},
        { EDIT_CreateIndirect,     NULL,     GUI_ID_EDIT1,    10,  40, 110,  20, 0, 15},
        { BUTTON_CreateIndirect,   "Ok",     GUI_ID_OK,       10,  80,  50,  20 },
        { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,   70,  80,  50,  20 },
};

static char * _apExplain[] =
{
        "This sample shows how to use edit widgets with a",
        "user defined callback function and how to set a",
        "user defined AddKey function. It selects the",
        "contents of the edit field on receiving the focus",
        "and overwrites the contents if a key other than",
        "a cursor key is pressed.",
};

/*
*********************************************************************************************************
*        函 数 名: _cbDesktop
*        功能说明: 桌面窗口的回调函数
*        形    参:pMsg 消息指针
*        返 回 值: 无
*********************************************************************************************************
*/
static void _cbDesktop(WM_MESSAGE * pMsg)
{
        unsigned i;

        switch (pMsg->MsgId)
        {
                /* 重绘 */
                case WM_PAINT:
                        GUI_SetBkColor(GUI_RED);
        #if 1
                        GUI_Clear();
                        GUI_SetFont(&GUI_Font24_ASCII);
                        GUI_DispStringHCenterAt("WIDGET_EditWinmode", 160, 5);
                        GUI_DispNextLine();
                        GUI_SetFont(GUI_DEFAULT_FONT);
                        GUI_DispNextLine();
                        for (i = 0; i < GUI_COUNTOF(_apExplain); i++)
                        {
                                GUI_DispStringHCenterAt(_apExplain, 160, GUI_GetDispPosY());
                                GUI_DispNextLine();
                        }
                        break;
        #endif
        }
}

static WM_HWIN    _hLastFrame;

/*
*********************************************************************************************************
*        函 数 名: _CreateFrame
*        功能说明: 创建框架窗口
*        形    参:cb  回调函数地址
*        返 回 值: 无
*********************************************************************************************************
*/
static WM_HWIN _CreateFrame(WM_CALLBACK* cb)
{
        _hLastFrame = WM_CreateWindowAsChild(0, 0, 240, 120, WM_HBKWIN, WM_CF_SHOW, cb, 0);
        return _hLastFrame;
}

/*
*********************************************************************************************************
*        函 数 名: _DeleteFrame
*        功能说明: 删除创建的框架窗口
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void _DeleteFrame(void)
{
        WM_DeleteWindow(_hLastFrame);
        _hLastFrame = 0;
}

/*
*********************************************************************************************************
*        函 数 名: _CreateButton
*        功能说明: 创建按钮
*        形    参:hParent  父窗口
*             pText    按键上显示的文本
*             Id       按钮Id         
*             x        x轴坐标
*             y        y轴坐标
*             w        按钮宽
*             h        按钮高
*             TextId   文本的ID     
*        返 回 值: 无
*********************************************************************************************************
*/
static WM_HWIN _CreateButton(WM_HWIN hParent, const char* pText, int Id, int x, int y, int w, int h, unsigned TextId)
{
        WM_HWIN hButton;
        hButton = BUTTON_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, Id);

        BUTTON_SetText      (hButton,    pText);

        /* 设置接收输入焦点的能力 */
        BUTTON_SetFocussable(hButton,    1);

        return hButton;
}

/*
*********************************************************************************************************
*        函 数 名: _CreateButton
*        功能说明: 创建按钮
*        形    参:hParent  父窗口
*             pText    按键上显示的文本
*             Id       按钮Id         
*             x        x轴坐标
*             y        y轴坐标
*             w        按钮宽
*             h        按钮高
*             TextId   文本的ID     
*        返 回 值: 无
*********************************************************************************************************
*/
static WM_HWIN _CreateEdit(WM_HWIN hParent, const char* pText, int Id, int x, int y, int w, int h, unsigned TextId)
{
        WM_HWIN hEdit;
        hEdit = EDIT_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, Id, 10);

        EDIT_SetText(hEdit,    pText);

        /* 设置接收输入焦点的能力 */
        EDIT_SetFocussable(hEdit,    1);

        return hEdit;
}

/*
*********************************************************************************************************
*        函 数 名: _cbDialog
*        功能说明: 对话框的回调函数
*        形    参:pMsg 消息指针
*        返 回 值: 无
*********************************************************************************************************
*/
void _cbDialog(WM_MESSAGE * pMsg)
{
        int     i;
        int     NCode;
        int     Id;
        WM_HWIN hWin;
        WM_HWIN hItem;

        hWin = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_CREATE:
                        /* 设置聚焦 */
                        WM_SetFocus(hWin);

                        /* 创建两个按钮,用于选择中文和英文 */
                        _CreateButton(hWin, "OK", GUI_ID_BUTTON0, 10, 10, 100,  28, 0);
                        //_CreateButton(hWin, "OFF", GUI_ID_BUTTON1, 10, 50, 100,  28, 0);
                        //_CreateEdit(hWin, "45678", GUI_ID_EDIT0, 10, 90, 100,  28, 0);
                        //_CreateEdit(hWin, "45678", GUI_ID_EDIT1, 10, 130, 100,  28, 0);
                        //_CreateEdit(hWin, "45678", GUI_ID_EDIT2, 10, 170, 100,  28, 0);
                        //_CreateEdit(hWin, "45678", GUI_ID_EDIT3, 10, 210, 100,  28, 0);
                        //_CreateEdit(hWin, "45678", GUI_ID_EDIT4, 10, 250, 100,  28, 0);
                        //_CreateEdit(hWin, "45678", GUI_ID_EDIT5, 10, 290, 100,  28, 0);

                        break;

                 case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                                case GUI_KEY_ESCAPE:
                                        GUI_EndDialog(hWin, 1);
                                        //_DeleteFrame();
                                        _CreateFrame(&_cbDialog1);


                                        break;

                case GUI_KEY_TAB:
                                        WM_SetFocusOnNextChild(hWin);
                    break;
            }
            break;
                case WM_NOTIFY_PARENT:
                        Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
                        NCode = pMsg->Data.v;                 // Notification code
                        switch (NCode)
                        {
                                case WM_NOTIFICATION_RELEASED:      // React only if released
                                        if (Id == GUI_ID_OK)
                                        {         // OK Button
                                                GUI_EndDialog(hWin, 0);
                                        }
                                        if (Id == GUI_ID_CANCEL)
                                        {        // Cancel Button
                                                GUI_EndDialog(hWin, 1);
                                        }

                                        break;
                        }
                        break;
                default:
                        WM_DefaultProc(pMsg);
        }
}

/*
*********************************************************************************************************
*        函 数 名: _cbDialog
*        功能说明: 对话框的回调函数
*        形    参:pMsg 消息指针
*        返 回 值: 无
*********************************************************************************************************
*/
void _cbDialog1(WM_MESSAGE * pMsg)
{
        int     i;
        int     NCode;
        int     Id;
        WM_HWIN hWin;
        WM_HWIN hItem;

        hWin = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_CREATE:
                        /* 设置聚焦 */
                        WM_SetFocus(hWin);

                        /* 创建两个按钮,用于选择中文和英文 */
                        //_CreateButton(hWin, "YES", GUI_ID_BUTTON0, 10, 10, 100,  28, 0);
                        _CreateButton(hWin, "NO", GUI_ID_BUTTON1, 10, 50, 100,  28, 0);
                        //_CreateEdit(hWin, "12345", GUI_ID_EDIT0, 10, 90, 100,  28, 0);
                        //_CreateEdit(hWin, "12345", GUI_ID_EDIT1, 10, 130, 100,  28, 0);
                        //_CreateEdit(hWin, "12345", GUI_ID_EDIT2, 10, 170, 100,  28, 0);
                        //_CreateEdit(hWin, "12345", GUI_ID_EDIT3, 10, 210, 100,  28, 0);
                        //_CreateEdit(hWin, "12345", GUI_ID_EDIT4, 10, 250, 100,  28, 0);
                        //_CreateEdit(hWin, "12345", GUI_ID_EDIT5, 10, 290, 100,  28, 0);

                        break;

                 case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                                case GUI_KEY_ESCAPE:
                                        GUI_EndDialog(hWin, 1);
                                        //_DeleteFrame();
                                        _CreateFrame(&_cbDialog);


                                        break;

                case GUI_KEY_TAB:
                                        WM_SetFocusOnNextChild(hWin);
                    break;
            }
            break;
                case WM_NOTIFY_PARENT:
                        Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
                        NCode = pMsg->Data.v;                 // Notification code
                        switch (NCode)
                        {
                                case WM_NOTIFICATION_RELEASED:      // React only if released
                                        if (Id == GUI_ID_OK)
                                        {         // OK Button
                                                GUI_EndDialog(hWin, 0);
                                        }
                                        if (Id == GUI_ID_CANCEL)
                                        {        // Cancel Button
                                                GUI_EndDialog(hWin, 1);
                                        }

                                        break;
                        }
                        break;
                default:
                        WM_DefaultProc(pMsg);
        }
}

/*
*********************************************************************************************************
*        函 数 名: MainTask
*        功能说明: GUI主函数
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
        GUI_Init();

        /* 使能窗口使用内存设备 */
        //WM_SetCreateFlags(WM_CF_MEMDEV);

        WM_SetCallback(WM_HBKWIN, _cbDesktop);

        /* 进入主界面 */
        _CreateFrame(&_cbDialog);

        while(1)
        {
                GUI_Delay(10);
        }

}

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

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2014-10-30 21:25:18 | 显示全部楼层
1. 楼主参考我们10期emWin提高篇的ATM机例子,这个例子非常值得参考,我看你的代码也没有发现什么问题。
2.  执行WM_DeleteWindow()后,这个删除窗口的父窗口必须做清屏操作。也就是要执行重绘。这个函数删除只是删除了控件占用的资源。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2014-12-23 13:54:14 | 显示全部楼层
在emwin里面,虽然窗口,对话框,控件都是几乎相同的数据类型hwin 句柄,有些API可以通用,但是有些不行。处理的时候经常需要用不同的函数。

你说的窗口含有控件,实际上就是“对话框”。你要删除对话框,就要用enddialog函数,才能正常释放控件的内存空间。
回复

使用道具 举报

22

主题

20

回帖

252

积分

高级会员

积分
252
发表于 2016-8-25 15:38:05 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 楼主参考我们10期emWin提高篇的ATM机例子,这个例子非常值得参考,我看你的代码也没有发现什么问题。
2.  执行WM_DeleteWindow()后,这个删除窗口的父窗口必须做清屏操作。也就是要执行重绘。这个函数删除只是删除了控件占用的资源。 (2014-10-30 21:25)
请问对父窗口进行清屏是执行WM_Paint()还是WM_PaintWindowAndDescs()吗?比图说我建立的窗口的父窗口是BK窗口。如何重绘父窗口麻烦给一小段代码。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-8-26 01:35:12 | 显示全部楼层

回 gxhh9900 的帖子

gxhh9900:请问对父窗口进行清屏是执行WM_Paint()还是WM_PaintWindowAndDescs()吗?比图说我建立的窗口的父窗口是BK窗口。如何重绘父窗口麻烦给一小段代码。 (2016-08-25 15:38) 
执行父窗口的WM_PAINT消息。
回复

使用道具 举报

0

主题

19

回帖

0

积分

新手上路

积分
0
QQ
发表于 2016-10-2 11:54:06 | 显示全部楼层
[s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151] [s:151]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 18:56 , Processed in 0.044922 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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