打印
[STM32F1]

emwin 实现触摸按钮长按动作【解决方案】

[复制链接]
2358|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xfcjava2|  楼主 | 2016-9-14 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上以及论坛上,看到很多人都在为 "emwin中实现触摸按钮长按动作" 而迷茫!

那就看看本人是怎么实现的吧!

说明: 本人提供的代码已经在自己的产品上,应用很多年了。在此与大家分享一下!

运行机制说明:
  1、一个任务中,定时向主窗体发送更新消息;
  2、主窗体任务, 实时接收更新消息;
  3、如果按钮长时间按下,对应的变量递增;
  4、持续按下的时间,还没有达到设定时间, 按钮抬起,执行一般的动作;
  5、递增到设定的时间后,响应长时间按下的功能动作;

#define SCREEN_PARAM_SET        10+4
#define SCREEN_CALIB_SET         10+5
#define SCREEN_DISTABOUT        10+6
#define SCREEN_DEVICE_CHK       10+7
#define SCREEN_TEST_RUN          10+8
#define SCREEN_STOP_TEST        10+9


typedef struct tagSendMsgInfo{
    int item;
    char *str[10];        
} SEND_MSG_INFO;



u8  curr_screen =0;  
static SEND_MSG_INFO  t_msg;   

static WM_HWIN _hClinet;     //用户区窗口句柄               
static WM_MESSAGE Msg;     //用户窗体信息

WM_HWIN  ParamSet_hWin;  //参数设置窗口---句柄
WM_HWIN  Calib_hWin;         //校准窗口--------句柄        


****************************************************************************        
* 功    能:    用户信息更新-------任务
*-----------------------------------------------------------------------------------------------------------------------*
* 入口参数:  p_arg-----A pointer to parameter passed to task.
* 出口参数:  nil
****************************************************************************/
void Task_UserMsg_Update (void *p_arg)
{
     while (1)
     {
           /*----例如: 发送日期消息----------------------------*/
           // t_msg.item=5;  //显示日期的信息识别号
           //  t_msg.str[5]=(char *)Date_buff;        //发送日期消息内容        

          switch(curr_screen)  //当前的窗口
            {
                    case SCREEN_PARAM_SET: //参数设置屏幕        
                                  Msg.MsgId = WM_USER + 50;
                                  Msg.Data.p = &t_msg; //可以发送附属的信息                                
                                       
                                   _hClinet=WM_GetClientWindow(ParamSet_hWin);//获得用户区窗口句柄                        
                                   WM_SendMessage(_hClinet, &Msg);                                             
                                   break;

                     case SCREEN_CALIB_SET: //校准屏幕
                                  Msg.MsgId = WM_USER + 60;
                                  Msg.Data.p = &t_msg;                                       
                                       
                                  _hClinet=WM_GetClientWindow(Calib_hWin);//获得用户区窗口句柄                        
                                  WM_SendMessage(_hClinet, &Msg);                                 
                                  break;
                     //.......................................
                     //.......................................
                    //.......................................
            }

         OSTimeDly (200); //每0.2S更新一次
    }
}


/****************************************************************************        
* 功    能:     应用开始主任务
*---------------------------------------------------------------------------*
* 入口参数:pdata        A pointer to parameter passed to task.
* 出口参数:nil
****************************************************************************/      
static  void  AppTaskStart (void *p_arg)
{
    while(1)
     {
            TFT_MainFrame() ;  //主界面窗体
            OSTimeDly(100);
     }
}



static u8     at_status[2]={0,0};
static u8     flag_press_bt[2]={0,0};     //按钮按下标志变量
static u32    num_press_bt[2]={0,0};   //按下持续的时间变量


#define  PARAM_SET_MSG_ID     (WM_USER + 50)


/*********************************************************************
*
*       MainFrame
*
**********************************************************************/
void TFT_MainFrame(void)
{         
     #if OS_CRITICAL_METHOD == 3   
        OS_CPU_SR  cpu_sr = 0;
     #endif      
     //...............................
     //...............................

      OS_ENTER_CRITICAL();
      curr_screen=SCREEN_PARAM_SET;
      OS_EXIT_CRITICAL();

      ParamSet_hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);                        
        
      WM_SetFocus(WM_GetDialogItem(ParamSet_hWin, GUI_ID_BUTTON2));        //焦点于按钮2        
}


/*********************************************************************
* ParamSet_hWin窗口下的 回调函数                                                             *
*********************************************************************/
static void _cbCallback(WM_MESSAGE * pMsg)   
{            
     int NCode, Id;        
     WM_HWIN hItem;        
        
      #if OS_CRITICAL_METHOD == 3   
      OS_CPU_SR  cpu_sr = 0;
      #endif                  
         
      WM_HWIN hDlg = pMsg->hWin;        
        
      switch (pMsg->MsgId)
      {
            //...............................
            //...............................                  
            case PARAM_SET_MSG_ID:  //此窗口下的消息更新
               if(flag_press_bt[0]==1){   //按钮1按下                    
                   num_press_bt[0]++;   //按下持续的时间变量递增                     
                }        

                if(flag_press_bt[1]==1){    //按钮1按下                           
                   num_press_bt[1]++;     //按下持续的时间变量递增                     
                }                                            
               break;
            case WM_NOTIFY_PARENT:
                Id    = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch(NCode)
                  {                                                         
                      case WM_NOTIFICATION_SEL_CHANGED:
                           //...............................
                           //...............................        
                          break;
                      case WM_NOTIFICATION_CLICKED:  //控件点击---响应
                          switch(Id){                                                                                                                                                     
                                case   GUI_ID_BUTTON40:  //长按作用按钮1
                                         num_press_bt[0]=0; //clear                                                                                                        
                                         flag_press_bt[0]=1;                                                                                 
                                         break;                                                                                
                                case   GUI_ID_BUTTON41: //长按作用按钮2
                                        num_press_bt[1]=0;                                                               
                                        flag_press_bt[1]=1;                                
                                        break;                                                                                       
                                case  GUI_ID_BUTTON3:                                                                        
                                        break;                        
                                case  GUI_ID_BUTTON4:                        
                                        break;                                 
                          }                           
                          break;
                     case  WM_NOTIFICATION_RELEASED: //按钮释放---响应
                           switch(Id){        
                               case   GUI_ID_BUTTON40:   //长按作用按钮1                                                                                                
                                    if(num_press_bt[0]>15){   //定时3s:  15*0.2s=3s  [ 注: 0.2s更新一次]                                                                 
                                         flag_press_bt[0]=2;   //改变状态
                                         num_press_bt[0]=0; //clear
                                          //...............................
                                          //执行用户自己的功能代码
                                          //...............................        
                                    }else{
                                        flag_press_bt[0]=0;//clear
                                        num_press_bt[0]=0; //clear        
                                         //...............................                                                
                                         //执行用户自己的功能代码                              
                                   }  
                                   break;        
                              case   GUI_ID_BUTTON41:   //长按作用按钮2                                                                                                                                             if(num_press_bt[1]>15){   //定时3s:  15*0.2s=3s  [ 注: 0.2s更新一次]                                                                 
                                         flag_press_bt[1]=2;   //改变状态
                                         num_press_bt[1]=0; //clear
                                          //...............................
                                          //执行用户自己的功能代码
                                          //...............................        
                                    }else{
                                        flag_press_bt[1]=0;//clear
                                        num_press_bt[1]=0; //clear        
                                         //...............................                                                
                                          //执行用户自己的功能代码                              
                                   }                                      
                                  break;               
        
                               //...............................
                               //其它的功能按钮响应
                               //...............................        
                             }
                          break;                                                
                  }
       }
}







发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

450

帖子

42

粉丝