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界面按钮: