MFC之按鍵消息(長按處理)


想要實現長按鍵的一些控制,查了查可以通過捕獲鍵盤事件,然后處理按鍵時需要進行的操作。下面簡單的實現左右按鍵界面更新數值加減。

 1. 重載PreTranslateMessage(MSG* pMsg)函數,在函數中捕獲鍵盤事件並處理響應:

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);
}

 

以前一直使用UpdateData()函數更新,但是這次發現GetDlgItem()更適合現在的情況,只更新該控件而不會刷新其他數據。

2. 以上已經可以實現,但是如果想調整多久算長按,那可以通過定時器來實現:

重載PreTranslateMessage(MSG* pMsg)函數

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);
}

 

定時器處理:

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);
}

 

這樣按鍵響應會更快,但是自帶的定時器精度不夠高,也可以通過自己實現高精度定時器來控制。

注意:處理按鍵消息時間以后,需要返回TRUE,不然對話框任然會響應該按鍵消息,至於PreTranslateMessage(MSG* pMsg)對消息的捕獲屏蔽以及返回值的意義見:

MFC之CToolTipCtrl按鈕提示(消息捕獲和消息傳遞)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM