长按按键 c语言,MFC按键响应长按操作

本文介绍了一种在MFC应用中实现按钮长按时连续加减的方法。通过拦截鼠标左键按下和松开操作,并使用定时器循环执行按钮的点击回调函数,解决了需要多次点击才能调整数值的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做一个MFC项目,部分界面如下:

a4c26d1e5885305701be709a3d33442f.png

点击加号/减号,可以调整Edit框内数字大小,但是通过响应按键的click消息,每次点击只能加1/减1,如果我们要调整到一个较大的数字,需要多次点击。直觉告诉我,如果通过长按按键快速的变化数字,可以解决这一问题。

但是MFC

button控件默认即没有与按键长按对应的消息,也没有按下和松开的消息,如图:

a4c26d1e5885305701be709a3d33442f.png

于是问题变得麻烦,以下是我的方法。

1、拦截鼠标左键按下和松开操作

2、判断1中操作的坐标是否为按键坐标

3、如果满足1、2则触发定时器循环执行按键click回调函数

实现代码:

1、在窗口类内添加成员函数

BOOL PreTranslateMessage(MSG* pMsg);

2、编写成员函数

BOOL Cdianji_kz_V11Dlg::PreTranslateMessage(MSG* pMsg)

{

if(pMsg->message == WM_LBUTTONDOWN)//拦截鼠标左键按下消息

{

if(pMsg->hwnd == GetDlgItem(IDC_BTN_PLUS)->m_hWnd)//判断按下的位置是否为目标button

{

btn_add_plus_flag=1;//表示加

btn_add_plus_first_flag=1;//表示按下

SetTimer(2,50,NULL);//触发定时器,按1秒加20

}

else if(pMsg->hwnd == GetDlgItem(IDC_BTN_SUB)->m_hWnd)

{

btn_add_plus_flag=2;//表示减

SetTimer(2,150,NULL);//按1秒减7

}

}

else if(pMsg->message == WM_LBUTTONUP)

{

if(pMsg->hwnd == GetDlgItem(IDC_BTN_PLUS)->m_hWnd)

{

btn_add_plus_flag=0;//清除标志

btn_add_plus_first_flag=0;//清除标志

KillTimer(2);//关闭定时器

}

else if(pMsg->hwnd == GetDlgItem(IDC_BTN_SUB)->m_hWnd)

{

btn_add_plus_flag=0;

KillTimer(2);

}

}

return CDialog::PreTranslateMessage(pMsg); //一定要有,其他消息系统默认处理

}

3、编写定时器回调函数

void Cdianji_kz_V11Dlg::OnTimer(UINT nIDEvent)

{

switch (nIDEvent)

{

case 2: ///处理ID为24的定时器

long_sub_add();

break;

}

CDialog::OnTimer(nIDEvent);

}

int Cdianji_kz_V11Dlg::long_sub_add(void)

{

if (btn_add_plus_first_flag==1)

{

Sleep(150);

btn_add_plus_first_flag=0;

}

else if (btn_add_plus_flag==1)

{

OnBnClickedBtnPlus(); //按钮“+”click消息对应的函数

}

else if(btn_add_plus_flag==2)

{

OnBnClickedBtnSub();//按钮“-” click消息对应的函数

}

return 0;

}

btn_add_plus_flag标志位作用不难看出,因为点“+”和“-”按键触发的是同一个定时器,执行的是同一个定时器回调函数,所以用这个变量来区分两个按键,对应不同的操作。

btn_add_plus_first_flag标志设置的原因,我们在程序中设置的是如果“+”按键被按下,则使能定期器2,“+”按键松开,关闭定时器,定时器2回调函数是以50ms为一个周期调用按键click回调函数(也就是说自动的一秒点击20次“+”按键)。也就是说定时器执行的总时间与我们按键按下的时间成正比,因此长按实现了循环的“+”的操作。

但这就存在一个问题,如果当我们想实现加1的操作时,点击一次按钮会有100ms左右的操作延时,因此即执行了原来的click回调函数,又会触发定时器函数,所以点一次按键可能加2或3。因此需要设置一个标志,延时执行定时器函数,避免想加1加过头的情况!

(我的CSDN

:http://blog.csdn.net/qq_20515461/article/details/78760257)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值