MFC中鍵盤響應的兩個問題

1、MFC中上下左右鍵的響應

在普通的MFC窗口中可以用OnKeyDown()函數或者OnChar()函數來響應鍵盤消息。

普通字符的響應很簡單,但是鍵盤上下左右鍵的響應卻沒辦法直接通過字符來實現,嘗試了採用ASIC碼代替字符也沒有成功,以下是一種正確的使用方法:

switch(nChar)

       {

       case 'i':

       case 'I':  

              coord_z=coord_z/0.9;

              break;

       case 'o':

       case 'O':

              coord_z=coord_z*0.9;

              break;

       case 'x':

       case 'X':

              rot_x=rot_x+10;

              break;

       case 'y':

       case 'Y':

              rot_y=rot_y+10;

              break;

       case VK_UP:

              shift_y-=1;

              break;

       case VK_DOWN:

              shift_y+=1;

              break;

       case VK_LEFT:

              shift_x+=1;

              break;

       case VK_RIGHT:

              shift_x-=1;

              break;

              }

2、對話框中存在控件時,鍵盤消息的響應

在對話框中響應鍵盤消息時存在一些問題,當對話框中沒有控件時,可以按普通窗口的方式來響應,即添加OnKeyDown()消息響應,但當對話框中存在控件時,由於窗體處於活動狀態,必有一個控件獲得焦點,不能通過在ClassWizard中添加WM_KEYDOWN來響應鍵盤輸入。

一個簡單的辦法就是重載CWnd::PreTranslateMessage,即

BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
MessageBox("ssd");
}

return CDialog::PreTranslateMessage(pMsg);
}  

以上測試可以發現,當鍵盤按下時可以彈出對話框,即實現了消息的響應,因此鍵盤消息可以添加如下:

BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg)

{

       // TODO: Add your specialized code here and/or call the base class

       if(pMsg->message == WM_KEYDOWN)

{

       switch(pMsg->wParam) 

       {

    case 'i':

       case 'I':  

              coord_z=coord_z/0.9;

              break;

       case 'o':

       case 'O':

              coord_z=coord_z*0.9;

              break;

       case 'x':

       case 'X':

              rot_x=rot_x+10;

              break;

       case 'y':

       case 'Y':

              rot_y=rot_y+10;

              break;

       case VK_UP:

              shift_y-=1;

              break;

       case VK_DOWN:

              shift_y+=1;

              break;

       case VK_LEFT:

              shift_x+=1;

              break;

       case VK_RIGHT:

              shift_x-=1;

              break;   

       }

       Invalidate();

}

       return CDialog::PreTranslateMessage(pMsg);

}

當需要更新窗口,即添加了Invalidate()時,程序中的if語句是必不可少的,而且Invalidate()一定要添加在if語句內,否則窗口會一直處於閃爍之中。

發佈了15 篇原創文章 · 獲贊 13 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章