硬汉嵌入式论坛

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

[emWin] 关于STemWin如何回到指定窗口

[复制链接]

6

主题

14

回帖

32

积分

新手上路

积分
32
发表于 2020-1-2 20:16:44 | 显示全部楼层 |阅读模式
    尝试建立了以桌面窗口为父窗口A,然后父窗口下建立了子窗口B,子窗口B下再次建立了窗口C,目前调试发现,窗口C删除后返回偶尔是A窗口,偶尔是B窗口。不知道为什么返回到的不是各自的父窗口,一级一级返回去。    1.有什么方法可以指定返回到某个窗口吗?
    2.emWin的运行机制是怎么样的?
    比如在父窗口A回调函数内部按钮动作下创建子B窗口(非阻塞),然后B窗口显示,LCD就显示A窗口,然后就一直运行B窗口还是从A窗口函数回调函数break退出到按顺序执行?
    对于没有操作系统的:还是程序一直按着while(1)里面的结构顺序执行,但是B窗口是有默认的焦点窗口,最上面的窗口,其他窗口在下面,有什么输入都是B窗口接收。     请版主大概说一下,运行机制最重要,一直没有想清楚窗口之间怎么调用的。





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-1-3 09:46:49 | 显示全部楼层
方便的话,直接上代码,我帮你简单修改下。

仅需emWin部分的代码即可
回复

使用道具 举报

6

主题

14

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2020-1-3 12:15:04 | 显示全部楼层
#include "GUI.h"
#include "DIALOG.h"
#include "Menu_GUI.h"
#include "Menu_FUN.h"

#define Desk_BKColor 0x00E8E8E8

extern WM_HWIN        Menu_WM_hWin;
extern GUI_RECT Header_RECT;
extern GUI_RECT Mid_RECT;
extern Header_Setting Header_Setting_Val;
extern Mid_Setting Mid_Setting_Val;

WM_HWIN Setting_hWin;

#define ID_WINDOW_0      (GUI_ID_USER + 0x00)
#define ID_TEXT_0                (GUI_ID_USER + 0x01)
#define ID_BUTTON_0      (GUI_ID_USER + 0x02)
#define ID_BUTTON_1      (GUI_ID_USER + 0x03)
#define ID_BUTTON_2      (GUI_ID_USER + 0x04)

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
        { WINDOW_CreateIndirect, "Setting_WM", ID_WINDOW_0, 0, 0, 240, 320, 0, 0x0, 0 },
        { TEXT_CreateIndirect, "Setting_TXT", ID_TEXT_0, 5, 10, 230, 20, 0, 0x64, 0 },
        { BUTTON_CreateIndirect, "Sound_Setting_Button", ID_BUTTON_0, 5, 40, 230, 30, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Brightness_Setting_Button", ID_BUTTON_1, 5, 72, 230, 30, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Shutdown_Setting_Button", ID_BUTTON_2, 5, 104, 230, 30, 0, 0x0, 0 },
};

static void _cbDialog(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        WM_HWIN hDlg;
        int     NCode;
        int     Id;

        hDlg = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:                                                                                        //2D内容需要手动重绘制
                        GUI_SetBkColor(Desk_BKColor);                                                //设置菜单栏的背景色
                        GUI_Clear();
                        GUI_SetColor(Header_Setting_Val.Header_Bk_Color);
                        GUI_FillRectEx(&Header_RECT);                                                //头部背景色填充
                        GUI_SetColor(Mid_Setting_Val.Mid_Bk_Color);
                        GUI_FillRectEx(&Mid_RECT);                                                        //中部背景色填充
                       
                        break;
                case WM_INIT_DIALOG:
                        // Initialization of 'Setting_TXT'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
                        TEXT_SetText(hItem, "Setting");
                        TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00000000));
                        TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                        TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);

                        // Initialization of 'Sound_Setting_Button'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
                        BUTTON_SetText(hItem, "Sound Setting");

                        // Initialization of 'Brightness_Setting_Button'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
                        BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
                        BUTTON_SetText(hItem, "Brightness Setting");

                        // Initialization of 'Shutdown_Setting_Button'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
                        BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
                        BUTTON_SetText(hItem, "Shutdown Setting");
                        break;
                case WM_NOTIFY_PARENT:
                        Id = WM_GetId(pMsg->hWinSrc);
                        NCode = pMsg->Data.v;
                        switch (Id)
                        {
                                case ID_BUTTON_0: // Notifications sent by 'Sound_Setting_Button'
                                        switch (NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        CreateSound_Setting_GUI();
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_1: // Notifications sent by 'Brightness_Setting_Button'
                                        switch (NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        CreateBrightness_Setting_GUI();
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_2: // Notifications sent by Shutdown_Setting_Button'
                                        switch (NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        CreateShutdown_Setting_GUI();
                                                        break;
                                        }
                                        break;
                        }
                        break;
                case WM_KEY:                //上下键切换选型控件焦点切换   退出键返回   确认键进入相应设置
                        switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                        {
                                case GUI_KEY_ESCAPE:
                                        GUI_EndDialog(pMsg->hWin, 1);
                                        break;
                                default:
                                        break;
                        }
                        break;
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}

void FUN_SettingClicked(void)
{
        Setting_hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, Menu_WM_hWin, 0, 0);
        GUI_Delay(5);
}
回复

使用道具 举报

6

主题

14

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2020-1-3 12:20:15 | 显示全部楼层
eric2013 发表于 2020-1-3 09:46
方便的话,直接上代码,我帮你简单修改下。

仅需emWin部分的代码即可

#include "GUI.h"
#include "DIALOG.h"
#include "Menu_GUI.h"
#include "Menu_FUN.h"

#define Desk_BKColor 0x00E8E8E8

extern WM_HWIN        Menu_WM_hWin;
extern GUI_RECT Header_RECT;
extern GUI_RECT Mid_RECT;
extern Header_Setting Header_Setting_Val;
extern Mid_Setting Mid_Setting_Val;

WM_HWIN Setting_hWin;

#define ID_WINDOW_0      (GUI_ID_USER + 0x00)
#define ID_TEXT_0                (GUI_ID_USER + 0x01)
#define ID_BUTTON_0      (GUI_ID_USER + 0x02)
#define ID_BUTTON_1      (GUI_ID_USER + 0x03)
#define ID_BUTTON_2      (GUI_ID_USER + 0x04)

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
        { WINDOW_CreateIndirect, "Setting_WM", ID_WINDOW_0, 0, 0, 240, 320, 0, 0x0, 0 },
        { TEXT_CreateIndirect, "Setting_TXT", ID_TEXT_0, 5, 10, 230, 20, 0, 0x64, 0 },
        { BUTTON_CreateIndirect, "Sound_Setting_Button", ID_BUTTON_0, 5, 40, 230, 30, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Brightness_Setting_Button", ID_BUTTON_1, 5, 72, 230, 30, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Shutdown_Setting_Button", ID_BUTTON_2, 5, 104, 230, 30, 0, 0x0, 0 },
};

static void _cbDialog(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        WM_HWIN hDlg;
        int     NCode;
        int     Id;

        hDlg = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:                                                                                        //2D内容需要手动重绘制
                        GUI_SetBkColor(Desk_BKColor);                                                //设置菜单栏的背景色
                        GUI_Clear();
                        GUI_SetColor(Header_Setting_Val.Header_Bk_Color);
                        GUI_FillRectEx(&Header_RECT);                                                //头部背景色填充
                        GUI_SetColor(Mid_Setting_Val.Mid_Bk_Color);
                        GUI_FillRectEx(&Mid_RECT);                                                        //中部背景色填充
                       
                        break;
                case WM_INIT_DIALOG:
                        // Initialization of 'Setting_TXT'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
                        TEXT_SetText(hItem, "Setting");
                        TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00000000));
                        TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                        TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);

                        // Initialization of 'Sound_Setting_Button'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
                        BUTTON_SetText(hItem, "Sound Setting");

                        // Initialization of 'Brightness_Setting_Button'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
                        BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
                        BUTTON_SetText(hItem, "Brightness Setting");

                        // Initialization of 'Shutdown_Setting_Button'
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
                        BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
                        BUTTON_SetText(hItem, "Shutdown Setting");
                        break;
                case WM_NOTIFY_PARENT:
                        Id = WM_GetId(pMsg->hWinSrc);
                        NCode = pMsg->Data.v;
                        switch (Id)
                        {
                                case ID_BUTTON_0: // Notifications sent by 'Sound_Setting_Button'
                                        switch (NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        CreateSound_Setting_GUI();
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_1: // Notifications sent by 'Brightness_Setting_Button'
                                        switch (NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        CreateBrightness_Setting_GUI();
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_2: // Notifications sent by Shutdown_Setting_Button'
                                        switch (NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        CreateShutdown_Setting_GUI();
                                                        break;
                                        }
                                        break;
                        }
                        break;
                case WM_KEY:                //上下键切换选型控件焦点切换   退出键返回   确认键进入相应设置
                        switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                        {
                                case GUI_KEY_ESCAPE:
                                        GUI_EndDialog(pMsg->hWin, 1);
                                        break;
                                default:
                                        break;
                        }
                        break;
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}

void FUN_SettingClicked(void)
{
        Setting_hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, Menu_WM_hWin, 0, 0);
        GUI_Delay(5);
}
上面界面B代码(是界面A的子窗口)建立了三个按钮,按钮进入不同的分支功能界面C(是B界面的子窗口,A界面的孙窗口);
1.三个功能界面怎么设置退出之后,指定返回至A或者B界面?
2.孙窗口C可以相应WM_KEY消息进行ESC退出关闭界面,但是B里面总是不能相应WM_KEY消息退出到A界面,如果没有按下按钮,可以响应,按下按钮之后,B窗口就不能响应WM_KEY了。
3.我用的是PC端模拟器,按下的是电脑ESC进入WM_KEY
回复

使用道具 举报

354

主题

2164

回帖

3231

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3231
发表于 2020-1-3 12:39:56 | 显示全部楼层
窗口有个Z轴,就是好几个窗口的覆盖顺序。 C关闭后,回到到哪个,取决于c的下面是哪个窗口。
回复

使用道具 举报

6

主题

14

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2020-1-3 20:35:29 | 显示全部楼层
caicaptain2 发表于 2020-1-3 12:39
窗口有个Z轴,就是好几个窗口的覆盖顺序。 C关闭后,回到到哪个,取决于c的下面是哪个窗口。

查看是有Z位置,但是没有具体的设置,好像只有设置为底部,设置为顶部位置,那顶部关闭之后,就不知道哪个窗口在次顶部位置了。
是不是在WM_DELETE信息那里设置把需要返回到的窗口设置为顶部?
Z位置设置函数查找了,没有这个设置函数?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 18:23 , Processed in 0.256485 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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