|
原理:先创建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 ****************************/ |
|