我的问题如下:我需要响应对话框中的外部按键消息,但是我发现在回调函数中截获WM_KEY消息,得到的结果各不相同,具体实验如下:
STemwin版本:emWin version 5.32
为了避免外部按键驱动可能引起的疑问,我使用的是PC
仿真实现实验。
step1:使用GUI_Builder生成一个对话框;
step2:在对话框的回调函数sta
tic void _cbDialog(WM_MESSAGE * pMsg) 中增加以下代码:
[C]
纯文本查看 复制代码
const WM_KEY_INFO* psKey;...case WM_KEY: psKey = (const WM_KEY_INFO*)(pMsg->Data.p); printf("rn> Key = %d, PressedCnt = %d", psKey->Key, psKey->PressedCnt); break;...
step3:运行,在case WM_KEY中打断点,按下键盘上下箭头,查看断点处psKey ->Key和psKey->PressedCnt的值;
第一个实验:对话框中不放置任何子控件
[C]
纯文本查看 复制代码
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};
结果:无法捕捉到断点,也就是未产生WM_KEY...
第二个实验:对话框中只放置一个BUTTON子控件
[C]
纯文本查看 复制代码
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};
结果:可以捕捉到断点,也就是产生了WM_KEY,此时:
psKey ->Key = 0x00000013
psKey->PressedCnt = 0x00000001
第三个实验:对话框中只放置一个EDIT子控件
[C]
纯文本查看 复制代码
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};
结果:可以捕捉到断点,也就是产生了WM_KEY,此时:
psKey ->Key = 0x00000013
psKey->PressedCnt = 0x00000000
查阅STemWin的参考手册
Key代表被按下的键值;PressedCnt > 0表示按键被按下,0表示按键被释放
理论上说,无论何种情况,一次按键操作(按下、抬起),我应该先后截获到两次WM_KEY消息才对,为什么会出现以上的结果?
如果我硬件上有一个【返回】键,每一个界面均为一个Dialog,那我如何操作才能在每个Dialog(有可能个别Dialog像第一实验那样,没有子控件,而是在WM_PAINT中自行绘制)中都捕捉并响应到有效的WM_KEY消息(抬起动作)