MFC--按键、按钮按下和弹起事件检测

MFC按钮按下事件很容易实现,为一个按钮直接添加点击事件即可,但是有时需要检测按钮的抬起,即按钮的按下和抬起单独实现各自的功能时,就需要对两种状态单独检测。下面把MFC按钮和键盘的按下和抬起一起实现。
方法是重写**PreTranslateMessage(MSG* pMsg)*函数:
步骤:
1.新建一个对话框MFC工程,名称自主定义即可
2.添加一个按钮,ID默认为IDC_BUTTON1,不需更改,也不必为按钮添加点击事件
3.按住“Ctrl+W”打开类向导,在Message Maps选项卡中的Messages下,选择
PreTranslateMessage并实现功能添加:
在这里插入图片描述
4.具体实现PreTranslateMessage(MSG
pMsg)函数,代码如下:

int i=0;
BOOL CTestButtonUpDownDlg::PreTranslateMessage(MSG* pMsg)
{
	// 键盘按键检测
	if (pMsg->message == WM_KEYDOWN)// 按键按下检测
	{

		if (pMsg->wParam == VK_UP)
		{
			// 向上键按下
			TRACE("PgUp(top) Down\n");
		}
		else if (pMsg->wParam == VK_DOWN)
		{
			// 向下键按下
			TRACE("PgDn Down\n");
		}
		else if (pMsg->wParam == VK_LEFT)
		{
			// 向左键按下
			TRACE("Home(left) Down\n");
		}

		else if (pMsg->wParam == VK_RIGHT)
		{
			// 向右键按下
			TRACE("End(right) Down\n");
		}
		else if (pMsg->wParam == VK_SHIFT)
		{
			//Shift 键按下
			TRACE("Shif Down\n");
		}
		else if (pMsg->wParam == VK_CONTROL)
		{
			//Ctrl 键按下
			TRACE("Ctrl Down\n");
		}
		
		else if (pMsg->wParam>=VK_NUMPAD0 && pMsg->wParam<=VK_NUMPAD9)	
		{
			// 小键盘数字键按下
			TRACE("small number down(0~9)\n");
		}
		else if (pMsg->wParam>=0x30 && pMsg->wParam<=0x39)
		{
			// 数字键按下 (不能使用 VK_0)
			TRACE("number key down(0~9)\n");
		}
		else if (pMsg->wParam>=0x41 && pMsg->wParam<=0x5A)
		{
			// 键盘字母键按下 (不能使用 VK_A)
			TRACE("Alphabet down(A~Z)\n");
		}
		else if (pMsg->wParam == VK_BACK)	
		{   
			// 退格键按下
			TRACE("Backspace down\n");
		}
		else if (pMsg->wParam == VK_DELETE)
		{
			// 删除键按下
		}
		else if (pMsg->wParam == VK_F1)
		{
			//F1 键按下
			TRACE("F1 down\n");
		}
		//屏蔽ESC和Enter键:避免按ESC和Enter键,对话框退出
  	 	 else if (pMsg->wParam == VK_ESCAPE)//ESC
	    {
			return TRUE;
	    }
		 else if (pMsg->wParam == VK_RETURN)//Enter
 	   	{
			return TRUE;
		}
		//return true;  // 使消息不再进行处理
	}
	if (pMsg->message == WM_KEYUP)//按键弹起检测
	{
		if (pMsg->wParam == VK_SHIFT)
		{
			//Shift 键弹起
			TRACE("Shif Up %d\n",i);
		}
		else if (pMsg->wParam == VK_CONTROL)
		{
			//Ctrl 键弹起
		}
		//return true;  // 使消息不再进行处理
	}
	
	//MFC界面按钮检测
	if(pMsg->message == WM_LBUTTONDOWN)
	{
		if(pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)
		{	
			//按钮按下
			TRACE("MFC Button Down\n");
		}
	}
	else if(pMsg->message == WM_LBUTTONUP)//判断是否有MFC界面按钮弹起
	{
		if(pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)  //IDC_BUTTON1为MFC界面button按钮的ID
		{
			//按钮弹起
			TRACE("MFC Button Up\n");
		}
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

5.以调试模式(F5)运行测试,按下键盘按键或MFC界面按钮:
在这里插入图片描述

结语:谢谢 !
  • 2
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

随心漂流

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

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

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

打赏作者

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

抵扣说明:

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

余额充值