emWin的Button控件的单击、双击、长按等识别

emWin的button按钮控件只有按下和弹起两种消息,想识别emWin的双击、长按等还不得不另寻他法。
突然想到emWin的button和物理机械按钮有什么不同呢?MulitiButton库应该可以用,try to do it.

MulitiButton仓库地址:GIthub地址:https://github.com/0x1abin/MultiButton

使用起来和物理机械按键一样

1、定义button对象

static struct Button g_PressureUp;   //
static struct Button g_PressureDown; //
static struct Button g_FlowUpBtn;    //

2、定义电平获取函数

static uint8_t pressureUp = 1;
static uint8_t ReadPressureUpBtn(void)
{
    return pressureUp;
}

static uint8_t pressureDown = 1;
static uint8_t ReadPressureDownBtn(void)
{
    return pressureDown;
}

static uint8_t flowUp = 1;
static uint8_t ReadFlowUpBtn(void)
{
    return flowUp;
}

和物理机械按键不同就在于获取按钮电平不同:
在Button的消息处理,将标志电平变量在WM_NOTIFICATION_CLICKED消息中清零
WM_NOTIFICATION_RELEASED消息中置1

 switch (id)
 {
    case ID_BUTTON_0: // Notifications sent by 'pressure up button'
    {
        switch (NCode)
        {
        case WM_NOTIFICATION_CLICKED:
            pressureUp = 0;
            break;
        case WM_NOTIFICATION_RELEASED:
            pressureUp = 1;
            break;
        }
        break;
    }
    case ID_BUTTON_1: // Notifications sent by 'Pressure down button'
    {
        switch (NCode)
        {
        case WM_NOTIFICATION_CLICKED:
            pressureDown = 0;
            break;
        case WM_NOTIFICATION_RELEASED:
            pressureDown = 1;
            break;
        }
        break;
    }
    ...
    ...
}

3、初始化、设置回调处理函数以及启动Button

button_init(&g_PressureUp, ReadPressureUpBtn, 0);
button_init(&g_PressureDown, ReadPressureDownBtn, 0);
button_init(&g_FlowUpBtn, ReadFlowUpBtn, 0);

//	button_attach(&btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);
button_attach(&g_PressureUp, SINGLE_CLICK, PressureUpBtnSingleClickHandler);
button_attach(&g_PressureUp, DOUBLE_CLICK, PressureUpBtnDoubleClickHandler);

button_attach(&g_PressureDown, SINGLE_CLICK, PressureUpBtnSingleClickHandler);

button_attach(&g_FlowUpBtn, SINGLE_CLICK, PressureUpBtnSingleClickHandler);

button_start(&g_PressureUp);
button_start(&g_PressureDown);
button_start(&g_FlowUpBtn);

4、给MulitButton提供时基

 WM_CreateTimer(hWinParent, 0, 5, 0);	  //创建5ms定时器

 switch (pMsg->MsgId)
 {
      case WM_INIT_DIALOG:
      {
           InitMainWindow(pMsg->hWin);
           break;
      }
      case WM_PAINT:
      {                           
           WindowPaint();
           break;
      }
      case WM_TIMER:           //time out msg  
      {
			button_ticks();
           	WM_RestartTimer(pMsg->Data.v, 5);  //重启定时器
           break;
      }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值