當TAB鍵移動焦點到某按鈕上時按下回車鍵,會產生和鼠標點擊按鈕同樣的效果,這不是鼠標事件,而是按鈕控件本身的標準行爲。在編輯框中輸入字符也一樣,系統會發出“編輯框已被改變”這樣的消息,這是編輯框控件本身的標準行爲。本章要介紹的鍵盤事件是指:在任何狀況下,用戶按了一下鍵盤,系統捕捉到到這一事件,向主窗口發出“鍵盤被按下了”的消息,即發出WM_KEYDOWN這一消息映射。如果用戶需要對“按了某鍵”有所動作,就可以在相應的響應函數中處理。
本章要點
1 如何添加鍵盤事件的消息映射
2 獲取某鍵的鍵值信息
6.1 MyKey.exe程序的界面和功能
本程序的界面很簡單,只有一個靜態文本提示程序的用法。當用戶按下某鍵後彈出一個消息框,顯示所按鍵的鍵值(ASCII碼),重複次數和一個標誌值(長整數)。圖chap06-01是按了小寫的a後的消息框。
靜態文本的文字是暗灰色,因爲沒有被“激活”,即不選中Disabled屬性。這一點很重要,因爲如果它是激活狀態的話,鍵盤消息就不是發送給對話框,而是被髮送到它——被聚焦的控件上,它是唯一的控件,就是唯一的消息受體了。
創建工程和程序界面的設計就無須贅言了,設計好後就可以編寫代碼了。
6.2 添加消息映射和響應函數
在類嚮導窗口的Message Map頁中選定該對話框的類CMyKeyDlg;在Message列表框中查到消息映射WM_KEYDOWN;按“添加函數”按鈕,彈出系統推薦的函數名OnKeyDown(),就用此默認的;點[確定]後生成了該函數框架。立即點[加入代碼]按鈕開始寫代碼。
OnKeyDown()函數的聲明如下:
void CMyKeyDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
它傳過來三個無符號整數類型的參數。其中nChar是該鍵的鍵值。nRepCnt是按鍵的重複次數,一般都是1,因爲在按第一次時就被捕捉到併發出了消息。nFlags是一個標誌,它用來表示某些特殊鍵的狀態。我們的目標是顯示這些信息,所以用三個字符型變量來儲存這三條信息,組織好後用消息框把信息顯示出來。具體代碼如下:
void CMyKeyDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
char
strnChar[10];
char strnFlags[10];
char strnRepCnt[10];
CString strKeyPressed;
itoa(nChar, strnChar,10);
itoa(nFlags,strnFlags,10);
itoa(nRepCnt,strnRepCnt,10);
strKeyPressed = (CString)"The value of this key:\n\n" +
"nChar= " + strnChar + "\n\nnRepCnt= " + strnRepCnt +
"\n\nnFlags= " +strnFlags;
MessageBox(strKeyPressed, "鍵值測試程序");
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
字符串對象strKeyPressed是要在消息框中顯示的信息。參數是數值型的,爲了顯示先要把它們轉化爲字符型的,函數itoa(nChar, strnChar,10)就是把十進制整數nChar轉換爲字符串strnChar。strKeyPressed的賦值語句把三條信息組織在一起,其中兩個"\n"一是爲了換行,二是爲了顯示一個空行。
現在就可以編譯和運行一下了。因爲不能安裝[退出]按鈕,我們來增加一個用鼠標雙擊可退出的方法。在類嚮導窗口中選定該對話框類CMyKeyDlg,找到消息映射WM_LBUTTONDCLICK;添加函數OnLButtonDblClk();在其中加入代碼OnOK()就行了。
思考研究題
鍵盤事件的另一個消息映射是WM_KEYUP,在鬆開按鍵時發生。試編寫一程序,在鬆開按鍵時彈出顯示鍵值的相關信息。
—END—