OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2953|回复: 0

emwin 触摸按钮长按动作_解决方案

[复制链接]

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-9-14 20:43:07 | 显示全部楼层 |阅读模式

我在emwin板块也发此帖子了。怕有些人看不到,就在这边重新发了一下。

在网上以及论坛上,看到很多人都在为 "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){    //功能按钮2按下                           
                   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;                                                
                  }
       }
}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表