MFC之按键消息(长按处理)
生活随笔
收集整理的這篇文章主要介紹了
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按鈕提示(消息捕獲和消息傳遞)
?
轉載于:https://www.cnblogs.com/skywatcher/p/3750059.html
總結
以上是生活随笔為你收集整理的MFC之按键消息(长按处理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭配无能来求助了~~大家来看看这件皮衣怎
- 下一篇: ADO.NET事务