硬汉嵌入式论坛

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

[emWin] 关于DropDown控件与其所在窗口的按键消息传递问题

[复制链接]

14

主题

35

回帖

14

积分

初级会员

积分
14
发表于 2017-8-12 14:41:15 | 显示全部楼层 |阅读模式
在窗口中建立DropDown控件,一旦该控件聚焦,则按键消息只能传到该控件,传不到其所在窗口
因此通过建立控件本身的回调函数更改按键的传递。
这里GUI_KEY_DOWNSIDE是想让聚焦点移到下一个DropDown控件的


使用WM_SendMessageNoPara的方式可以正常运行
使用WM_SendMessage的方式到达预期位置执行代码后死机,找不出什么原因。

由于模块化的需要,得使用WM_SendMessage的方式,但是不知道怎么办,求版主帮帮忙,谢谢~ ~


/****************DropDown控件回调函数*************************/

void _cbDropDown(WM_MESSAGE * pMsg)
{   
    WM_MESSAGE Msg;
    static LISTBOX_Handle hListbox;
    switch (pMsg->MsgId)
    {
        case WM_KEY:
            switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_DOWNSIDE:
//                    WM_SendMessageNoPara(WM_GetParent(pMsg->hWin), MSG_DROPDOWN_DOWN);    // 使用WM_SendMessageNoPara的方式
                    Msg.MsgId = WM_KEY;
                    Msg.hWin = WM_GetParent(pMsg->hWin);
                    Msg.hWinSrc = pMsg->hWin;
                    ((WM_KEY_INFO*)(Msg.Data.p))->Key = GUI_KEY_DOWNSIDE;        // 让按键消息GUI_KEY_DOWNSIDE传到其父窗口            
                    WM_SendMessage(WM_GetParent(pMsg->hWin), &Msg);       // 使用WM_SendMessage的方式
                    break;

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


/*******************DropDown控件所在窗口*****************/

static void _cbWindowNewFile (WM_MESSAGE * pMsg)
{

    static DROPDOWN_Handle    hDropDown;
    switch (pMsg->MsgId)
    {
        case WM_CREATE:
            hDropDown = DROPDOWN_CreateEx(100, 100, 100, 28, pMsg->hWin, WM_CF_SHOW, 0, ID_DROPDOWN_0);
            WM_SetCallback(hDropDown, _cbDropDown);        // 调用DropDown控件的回调函数
            DROPDOWN_SetFont(hDropDown, GUI_FONT_24B_ASCII);
            DROPDOWN_AddString(hDropDown, "Item1");
            DROPDOWN_AddString(hDropDown, "Item2");
            DROPDOWN_SetListHeight(hDropDown, 60);
            break;        

        case WM_KEY:
            switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_DOWNSIDE:
                    (do something);        // 使用WM_SendMessage的方式可以跑到这里,但是执行完后死机
                    break;

                default:
                    break;
            }
            break;

        case MSG_DROPDOWN_DOWN:
            (do something);        // 使用WM_SendMessageNoPara的方式可以跑到这里,而且效果OK
            break;

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107409
QQ
发表于 2017-8-12 15:14:41 | 显示全部楼层
要实现什么功能,就是切换一下控件吗。用TAB按键消息就行。
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-12 17:37:50 | 显示全部楼层

回 eric2013 的帖子

eric2013:要实现什么功能,就是切换一下控件吗。用TAB按键消息就行。 (2017-08-12 15:14)
是的,切换控件,键盘上没有Tab,要通过上下键来切换控件。
现在主要的问题是WM_SendMessage的方式发送消息执行相关代码后回死机,但找不出具体哪里的毛病。
硬汉哥帮忙看下WM_SendMessage这种方式传递有没有哪个地方有错误的?

而且TAB按键只能选择向下选择,没法向上选择呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107409
QQ
发表于 2017-8-13 15:13:22 | 显示全部楼层

回 mumuha 的帖子

mumuha:是的,切换控件,键盘上没有Tab,要通过上下键来切换控件。
现在主要的问题是WM_SendMessage的方式发送消息执行相关代码后回死机,但找不出具体哪里的毛病。
硬汉哥帮忙看下WM_SendMessage这种方式传递有没有哪个地方有错误的?

....... (2017-08-12 17:37) 
把这个变量改成全局变量看看是否可行: WM_MESSAGE Msg;
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-14 17:37:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:把这个变量改成全局变量看看是否可行: WM_MESSAGE Msg; (2017-08-13 15:13) 
也是不行硬汉哥~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107409
QQ
发表于 2017-8-15 01:44:35 | 显示全部楼层
使用这个试试:


QQ截图20170815014059.png
回复

使用道具 举报

14

主题

35

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2017-8-15 14:01:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:使用这个试试:



 (2017-08-15 01:44) 
WM_SendToParent()同样不行。

思考了WM_KEY_INFO这个类型,如下处理是可以正常传递键值了

WM_MESSAGE Msg;
WM_KEY_INFO keyTransfer;

case GUI_KEY_DOWNSIDE:
    keyTransfer.Key = GUI_KEY_DOWNSIDE;
    keyTransfer.PressedCnt = 1;
    Msg.MsgId = WM_KEY;
    Msg.Data.p = &keyTransfer;
    WM_SendMessage(WM_GetParent(pMsg->hWin), &Msg);
    break;

还是谢谢硬汉哥的解答~[s:149]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107409
QQ
发表于 2017-8-15 14:03:07 | 显示全部楼层

回 mumuha 的帖子

mumuha:WM_SendToParent()同样不行。

思考了WM_KEY_INFO这个类型,如下处理是可以正常传递键值了

....... (2017-08-15 14:01)
[s:130]

这个就属于模拟一个按键消息了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-30 09:05 , Processed in 0.200187 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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