emWin页面不响应按键的解决方法

为什么有的emWin页面不能响应按键事件呢?

当出现不能响应按键事件的页面时,因为页面无法发生变化,看着就像是死机了。出现这种现象的原因主要是这个页面没有能够捕捉按键事件的控件。比如一个页面全部是由"TEXT"控件组成的,TEXT控件不能被选中,也不能响应按键的输入事件。见下图,在其手册的6.2.32.4中有说明。

当一个页面没有能够被选中的控件时,按键的事件就不会被响应。

解决方法也是比较简单的,就是额外创建一个能够“被选中"的控件。具体步骤如下:

  1. 额外创建一个能够“被选中"的控件,比如按键
  2. 将这个额外的控件隐藏
  3. 设置这个额外的控件为被选中的状态

如创建下面这个显示版本号的页面,这个页面全部由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行这句代码是必须要有的,否则还是不能响应按键的输入。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值