在网上以及论坛上,看到很多人都在为 "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;
}
}
}
|