为什么有的emWin页面不能响应按键事件呢?
当出现不能响应按键事件的页面时,因为页面无法发生变化,看着就像是死机了。出现这种现象的原因主要是这个页面没有能够捕捉按键事件的控件。比如一个页面全部是由"TEXT"控件组成的,TEXT控件不能被选中,也不能响应按键的输入事件。见下图,在其手册的6.2.32.4中有说明。
当一个页面没有能够被选中的控件时,按键的事件就不会被响应。
解决方法也是比较简单的,就是额外创建一个能够“被选中"的控件。具体步骤如下:
- 额外创建一个能够“被选中"的控件,比如按键
- 将这个额外的控件隐藏
- 设置这个额外的控件为被选中的状态
如创建下面这个显示版本号的页面,这个页面全部由TEXT控件组成,因此不会响应任何按键事件。
所以我们额外的创建一个BUTTON控件,参考代码如下:
#include "DIALOG.h"
#include "user_gui_page.h"
#define ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ID_TEXT_0 (GUI_ID_USER + 0x01)
#define ID_TEXT_1 (GUI_ID_USER + 0x02)
#define ID_BUTTON_0 (GUI_ID_USER + 0x03) //这个为隐藏的BUTTON控件ID
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 128, 64, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "版本号", ID_TEXT_0, 0, 0, 128, 16, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "1.01A", ID_TEXT_1, 0, 16, 128, 16, 0, 0x0, 0 },
{ BUTTON_CreateIndirect, "HIDE", ID_BUTTON_0, 0, 48, 40, 16, 0, 0x0, 0 },
};
static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem;
switch (pMsg->MsgId) {
case WM_INIT_DIALOG: //页面初始化
hItem = WM_GetDialogItem(pMsg->hWin,ID_BUTTON_0); //获取BUTTON控件的句柄
WM_HideWindow(hItem); //隐藏BUTTON控件
WM_SetFocus(hItem);
//设置BUTTON控件为选中的状态
break;
case WM_KEY:
switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key){
case GUI_KEY_ENTER:
break;
case GUI_KEY_ESCAPE:
GUI_EndDialog(pMsg->hWin,USER_CMD_LIST_PAGE);
break;
default:
break;
}
default:
WM_DefaultProc(pMsg);
break;
}
}
WM_HWIN create_version_page(void) {
WM_HWIN hWin;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
return hWin;
}
上述代码第7行,定义需要被隐藏的BUTTON控件的ID;第21行,在页面初始化的过程中获取BUTTON控件的句柄;第22行使用WM_HideWindow()函数将BUTTON控件隐藏;第23行使用WM_SetFocus()函数设置BUTTON控件为选中的状态,以接收按键的输入事件。
注意:第23行这句代码是必须要有的,否则还是不能响应按键的输入。