首页 > 其他 > 详细

MFC之按键消息(长按处理)

时间:2014-05-26 00:07:08      阅读:729      评论:0      收藏:0      [点我收藏+]

想要实现长按键的一些控制,查了查可以通过捕获键盘事件,然后处理按键时需要进行的操作。下面简单的实现左右按键界面更新数值加减。

 1. 重载PreTranslateMessage(MSG* pMsg)函数,在函数中捕获键盘事件并处理响应:

bubuko.com,布布扣
BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        if (pMsg->wParam == VK_RIGHT)
        {
            tmp++;
            m_value.Format(_T("%d"),tmp);
            GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
            return TRUE;
        }
        if (pMsg->wParam == VK_LEFT)
        {
            tmp--;
            m_value.Format(_T("%d"),tmp);
            GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
            return TRUE;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}
bubuko.com,布布扣

 

以前一直使用UpdateData()函数更新,但是这次发现GetDlgItem()更适合现在的情况,只更新该控件而不会刷新其他数据。

2. 以上已经可以实现,但是如果想调整多久算长按,那可以通过定时器来实现:

重载PreTranslateMessage(MSG* pMsg)函数

bubuko.com,布布扣
BOOL CEditTestDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        this->SetTimer(3,10,NULL);
        m_bKeyDown = TRUE;
        if (pMsg->wParam == VK_RIGHT)
        {
            m_bRight = TRUE;
            return TRUE;
        }
        if (pMsg->wParam == VK_LEFT)
        {
            m_bLeft = TRUE;
            return TRUE;
        }
    }
    else if (pMsg->message == WM_KEYUP)
    {
        m_bRight = FALSE;
        m_bLeft = FALSE;
        m_bKeyDown = FALSE;
        KillTimer(3);
    }
    return CDialog::PreTranslateMessage(pMsg);
}
bubuko.com,布布扣

 

定时器处理:

bubuko.com,布布扣
void CEditTestDlg::OnTimer(UINT_PTR nIDEvent)
{
    switch (nIDEvent)
    {
    case 1:
        ……
    case 3:
        if (m_bKeyDown)
        {
            if (m_bLeft)
            {
                tmp--;
                m_value.Format(_T("%d"),tmp);
                GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
                //UpdateData(FALSE);
            }
            if (m_bRight)
            {
                tmp++;
                m_value.Format(_T("%d"),tmp);
                GetDlgItem(IDC_EDIT1)->SetWindowText(m_value);
                //UpdateData(FALSE);
            }
        }
        break;
    default:
        break;
    }
    CDialog::OnTimer(nIDEvent);
}
bubuko.com,布布扣

 

这样按键响应会更快,但是自带的定时器精度不够高,也可以通过自己实现高精度定时器来控制。

注意:处理按键消息时间以后,需要返回TRUE,不然对话框任然会响应该按键消息,至于PreTranslateMessage(MSG* pMsg)对消息的捕获屏蔽以及返回值的意义见:

MFC之CToolTipCtrl按钮提示(消息捕获和消息传递)

 

MFC之按键消息(长按处理),布布扣,bubuko.com

MFC之按键消息(长按处理)

原文:http://www.cnblogs.com/skywatcher/p/3750059.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!