VC++60 第六章 鍵盤事件

第六章 鍵盤事件

當TAB鍵移動焦點到某按鈕上時按下回車鍵,會產生和鼠標點擊按鈕同樣的效果,這不是鼠標事件,而是按鈕控件本身的標準行爲。在編輯框中輸入字符也一樣,系統會發出“編輯框已被改變”這樣的消息,這是編輯框控件本身的標準行爲。本章要介紹的鍵盤事件是指:在任何狀況下,用戶按了一下鍵盤,系統捕捉到到這一事件,向主窗口發出“鍵盤被按下了”的消息,即發出WM_KEYDOWN這一消息映射。如果用戶需要對“按了某鍵”有所動作,就可以在相應的響應函數中處理。

本章要點

1 如何添加鍵盤事件的消息映射
2 獲取某鍵的鍵值信息

 

6.1 MyKey.exe程序的界面和功能

本程序的界面很簡單,只有一個靜態文本提示程序的用法。當用戶按下某鍵後彈出一個消息框,顯示所按鍵的鍵值(ASCII碼),重複次數和一個標誌值(長整數)。圖chap06-01是按了小寫的a後的消息框。

VC++60 <wbr>第六章 <wbr>鍵盤事件

 

靜態文本的文字是暗灰色,因爲沒有被“激活”,即不選中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—

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章