硬汉嵌入式论坛

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

[emWin] 关于在父窗口打开/关闭子窗口的问题

[复制链接]

14

主题

35

回帖

14

积分

初级会员

积分
14
发表于 2017-6-30 09:36:35 | 显示全部楼层 |阅读模式
// 建立父窗口:
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {...}
static void _cbDialog(WM_MESSAGE * pMsg)
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);

// 建立子窗口:
static const GUI_WIDGET_CREATE_INFO _aDialogOption[] = {...}
static void _cbDialogOption(WM_MESSAGE * pMsg)

// 想在父窗口中,通过两个按键,分别打开和关闭子窗口

static void _cbDialog2(WM_MESSAGE * pMsg)
{
    WM_HWIN hOpt;
    ...

    switch (pMsg->MsgId)
    {   
        case WM_INIT_DIALOG:
            ...
            break;

        case WM_NOTIFY_PARENT:
            Id    = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id)
            {
                case ID_BUTTON_0: // Notifications sent by 'Button'
                    switch(NCode)
                    {
                        
                        case WM_NOTIFICATION_CLICKED:
                            break;
                           
                        case WM_NOTIFICATION_RELEASED:
                            hOpt = GUI_CreateDialogBox(_aDialogOption, GUI_COUNTOF(_aDialogOption), _cbDialogOption, pMsg->hWin, 0, 0);     // 打开子窗口
                            break;
                    }
                    break;
                case ID_BUTTON_1: // Notifications sent by 'Button'
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            break;
                        case WM_NOTIFICATION_RELEASED:
                            GUI_EndDialog(hOpt, 0);            // 关闭子窗口
                    }
                    break;   
                    ...
            }
            ...
    }
}

// 现在的效果是,点第一个按键在父窗口中能够打开子窗口,而点第二个窗口emWin模拟器便会卡死。
// 刚学习emWin不久,昨天折腾了一天,猜想可能是窗口聚焦的问题,但是尝试还是无果,请路过大神赐教,谢谢~[s:126]
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2017-6-30 09:54:52 | 显示全部楼层
子窗口句柄的变量 WM_HWIN hOpt;,切不可以是局部变量,退出回调函数就被释放掉了,下次进来已经不是原始值了。
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-1 14:13:39 | 显示全部楼层
硬汉哥,我在上述创立子窗口的基础上,聚焦到了子窗口。
子窗口进行一系列操作后,想关闭子窗口,将焦点回到父窗口的控件上,不知道怎么操作才可行?

我是用按键进行操作。
/****************父窗口************************/
static void _cbDialog0(WM_MESSAGE * pMsg)
{
    static int selNum = 0;
    static ICONVIEW_Handle hIconview;
    static WM_HWIN hWinChild;
   
    switch (pMsg->MsgId)
    {
        case WM_INIT_DIALOG:
            ... ...
            IconviewCreation(pMsg, ID_ICONVIEW_0, _aBitmapItem, GUI_COUNTOF(_aBitmapItem));    // iconview创立函数
            hIconview = WM_GetDialogItem(pMsg->hWin, ID_ICONVIEW_0);
            WM_SetFocus(hIconview);    // 页面聚焦在Iconview控件

            break;
        
        case WM_KEY:
            switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                ... ...
                case GUI_KEY_ENTER:
                    WM_SendMessageNoPara(pMsg->hWin, MSG_SELECTED);
                    break;

                default:
                    break;
            }
            break;

        case MSG_SELECTED:
            selNum = ICONVIEW_GetSel(hIconview);
            switch (selNum)
            {
                case 0:
                    hWinChild = WM_CreateWindowAsChild(100, 100, 200, 100, pMsg->hWin, WM_CF_SHOW, _cbChildWindow, 0);    // 创建子窗口
                    WM_SetFocus(hWinChild);    // 聚焦到子窗口
                    break;
                ... ...
            }
            break;

        default:
            WM_DefaultProc(pMsg);
            break;
    }
}

/****************子窗口************************/

static void _cbChildWindow (WM_MESSAGE * pMsg)
{
    static TEXT_Handle    hText;
    static EDIT_Handle    hEdit;

    switch (pMsg->MsgId)
    {
        case WM_CREATE:
            hText = TEXT_CreateEx(4, 0, 200, 30, pMsg->hWin, WM_CF_SHOW, 0, ID_TEXT_0, "New File");
            
            hEdit = EDIT_CreateEx(100, 30, 90, 30,  pMsg->hWin,  WM_CF_SHOW, 0, ID_EDIT_0, 40);
            EDIT_SetText(hEdit, &quotress...");
            EDIT_SetFont(hEdit, GUI_FONT_16B_ASCII);
            EDIT_EnableBlink(hEdit, 3000, 1);
            WM_SetFocus(hEdit);        // 聚焦在子窗口的hEdit控件上
            break;

        case WM_KEY:
            switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    WM_DeleteWindow(pMsg->hWin);    // 删除子窗口
                    WM_SetFocus(WM_GetParent(pMsg->hWin));    // 聚集到父窗口
                    break;
                ... ...

                default:
                    break;
            }
            break;
    }
}
/********************END**********************/
聚焦不到父窗口的原因应该是先删除了子窗口,下面的(2)语句不执行了
但是如果(1)(2)交换顺序,聚焦到父窗口后(1)又不执行了。。。

(1)WM_DeleteWindow(pMsg->hWin);    // 删除子窗口
(2)WM_SetFocus(WM_GetParent(pMsg->hWin));    // 聚集到父窗口


请问类似这种,先聚焦到子窗口后,该如何自我关闭恢复聚焦到父窗口呢?[s:123]
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-1 14:29:52 | 显示全部楼层
还有碰到一个疑问,就是子窗口的以下语句,假设我不聚焦到hEdit控件上(把下面的语句屏蔽),则依然聚焦在父窗口的 hIconview上,
可是在创建子窗口的时候已经聚焦到了子窗口了呀,不知道为啥?
WM_SetFocus(hEdit);        // 聚焦在子窗口的hEdit控件上
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2017-8-2 00:50:03 | 显示全部楼层

回 mumuha 的帖子

mumuha:硬汉哥,我在上述创立子窗口的基础上,聚焦到了子窗口。
子窗口进行一系列操作后,想关闭子窗口,将焦点回到父窗口的控件上,不知道怎么操作才可行?

我是用按键进行操作。
/****************父窗口************************/
....... (2017-08-01 14:13) 
WM_GetParent(pMsg->hWin)  直接改成你父窗口的句柄。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2017-8-2 00:52:20 | 显示全部楼层

回 mumuha 的帖子

mumuha:还有碰到一个疑问,就是子窗口的以下语句,假设我不聚焦到hEdit控件上(把下面的语句屏蔽),则依然聚焦在父窗口的 hIconview上,
可是在创建子窗口的时候已经聚焦到了子窗口了呀,不知道为啥?
WM_SetFocus(hEdit);        // 聚焦在子 .. (2017-08-01 14:29) 
在子窗口回调函数的WM_PAINT消息里面调用聚焦函数  WM_SetFocus(pMsg->hWin);
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-2 10:14:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:WM_GetParent(pMsg->hWin)  直接改成你父窗口的句柄。

 (2017-08-02 00:50) 
特别奇怪,子窗口里面关闭自己,回到父窗口,语句如下:
case GUI_KEY_ESCAPE:
    WM_DeleteWindow(pMsg->hWin);
    WM_SetFocus(hPage[0]);               
    break;
只有用下面(1)建立子窗口的时候,关闭自己可以顺利回到父窗口
而(2)建立子窗口,关闭自己后则焦点乱跑到了父窗口的某个listview控件上(而父窗口是默认聚焦到Iconview上的,而且没有聚焦到listview的语句)
(1)hWinChild = WM_CreateWindow(100, 100, 200, 100, WM_CF_SHOW, _cbChildWindow, 0);
(2)hWinChild = WM_CreateWindowAsChild(100, 100, 200, 100, pMsg->hWin, WM_CF_SHOW, _cbChildWindow, 0);
不知道为啥呢?~
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-2 10:21:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:在子窗口回调函数的WM_PAINT消息里面调用聚焦函数  WM_SetFocus(pMsg->hWin);  (2017-08-02 00:52) 
必须在WM_PAINT消息里面调用聚焦函数  WM_SetFocus(pMsg->hWin); 吗?
放在WM_CREATE消息里面可不可以?
在单步调试的时候发现,扫了一遍回调函数后,还需要扫几遍WM_PAINT消息的内容才会完整显示整个窗口,不知道是否跟这个有关,不太了解其机制呃... ...
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2017-8-3 02:02:26 | 显示全部楼层

回 mumuha 的帖子

mumuha:必须在WM_PAINT消息里面调用聚焦函数  WM_SetFocus(pMsg->hWin); 吗?
放在WM_CREATE消息里面可不可以?
在单步调试的时候发现,扫了一遍回调函数后,还需要扫几遍WM_PAINT消息的内容才会完整显示整个窗口,不知道是否跟这个有关,不太了解其机制呃... ... (2017-08-02 10:21) 
是WM_CREATE消息里面,我写错了。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2017-8-3 02:05:42 | 显示全部楼层

回 mumuha 的帖子

mumuha:特别奇怪,子窗口里面关闭自己,回到父窗口,语句如下:
case GUI_KEY_ESCAPE:
    WM_DeleteWindow(pMsg->hWin);
    WM_SetFocus(hPage[0]);               .. (2017-08-02 10:14) 
这个的话,就只能删除后,设置聚焦到指定的窗口上,这样也不行吗。
回复

使用道具 举报

7

主题

24

回帖

45

积分

新手上路

积分
45
发表于 2021-6-25 17:06:07 | 显示全部楼层
mark<,提供了解决思路,最后我在消息分支里面解决了,一步步看都是什么事件,最后发现是WM_DELETE和WM_NOTIFY_PARENT,在WM_DELETE里面聚焦解决问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 22:15 , Processed in 0.048077 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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