OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7008|回复: 3

对GUI_CreateDialogBox创建对话框回调函数中WM_KEY消息的疑问

[复制链接]

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2012-3-29
在线时间
18 小时
发表于 2017-6-15 16:18:23 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 zhaoshan413 于 2017-6-15 16:20 编辑

我的问题如下:我需要响应对话框中的外部按键消息,但是我发现在回调函数中截获WM_KEY消息,得到的结果各不相同,具体实验如下:
STemwin版本:emWin version 5.32
为了避免外部按键驱动可能引起的疑问,我使用的是PC仿真实现实验

step1:使用GUI_Builder生成一个对话框;
step2:在对话框的回调函数static void _cbDialog(WM_MESSAGE * pMsg) 中增加以下代码:
[mw_shl_code=c,true]
const WM_KEY_INFO* psKey;
...
case WM_KEY:
      psKey = (const WM_KEY_INFO*)(pMsg->Data.p);
      printf("\r\n> Key = %d, PressedCnt = %d", psKey->Key, psKey->PressedCnt);
      break;
...
[/mw_shl_code]
step3:运行,在case WM_KEY中打断点,按下键盘上下箭头,查看断点处psKey ->Key和psKey->PressedCnt的值;


第一个实验:对话框中不放置任何子控件
[mw_shl_code=c,true]
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    { WINDOW_CreateIndirect, "Test3", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
    // USER START (Optionally insert additional widgets)
    // USER END
};[/mw_shl_code]
结果:无法捕捉到断点,也就是未产生WM_KEY...

第二个实验:对话框中只放置一个BUTTON子控件
[mw_shl_code=c,true]
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    { WINDOW_CreateIndirect, "Test2", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
    { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 31, 37, 80, 20, 0, 0x0, 0 },
    // USER START (Optionally insert additional widgets)
    // USER END
};[/mw_shl_code]
结果:可以捕捉到断点,也就是产生了WM_KEY,此时:
psKey ->Key           = 0x00000013
psKey->PressedCnt  = 0x00000001


第三个实验:对话框中只放置一个EDIT子控件
[mw_shl_code=c,true]
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    { WINDOW_CreateIndirect, "Test2", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
    { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 73, 55, 80, 20, 0, 0x64, 0 },
    // USER START (Optionally insert additional widgets)
    // USER END
};[/mw_shl_code]
结果:可以捕捉到断点,也就是产生了WM_KEY,此时:
psKey ->Key           = 0x00000013
psKey->PressedCnt  = 0x00000000


查阅STemWin的参考手册

WM_KEY

WM_KEY

Key代表被按下的键值;PressedCnt > 0表示按键被按下,0表示按键被释放

理论上说,无论何种情况,一次按键操作(按下、抬起),我应该先后截获到两次WM_KEY消息才对,为什么会出现以上的结果?

如果我硬件上有一个【返回】键,每一个界面均为一个Dialog,那我如何操作才能在每个Dialog(有可能个别Dialog像第一实验那样,没有子控件,而是在WM_PAINT中自行绘制)中都捕捉并响应到有效的WM_KEY消息(抬起动作)



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-6-15 21:52:57 | 显示全部楼层
EMWIN不熟,帮不了你啊,不好意思
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-6-15 21:53:48 | 显示全部楼层
EMWIN不熟,帮不了你啊,不好意思
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2012-5-29
在线时间
16 小时
发表于 2019-7-4 16:48:49 | 显示全部楼层
请问楼主解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 22:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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