MFC中鍵盤響應的兩個問題

2021-05-21 13:40:00 字數 1937 閱讀 1959

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)

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語句內,否則視窗會一直處於閃爍之中。

只有兩個鍵的鍵盤

最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字 n 你需要使用最少的操作次數,在記事本中列印出恰好 n 個 a 輸出能夠列印出 n...

只有兩個鍵的鍵盤

最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字 n 你需要使用最少的操作次數,在記事本中列印出恰好 n 個 a 輸出能夠列印出 n...

只有兩個鍵的鍵盤 LeetCode

最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字 n 你需要使用最少的操作次數,在記事本中列印出恰好 n 個 a 輸出能夠列印出 n...