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...