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语句内,否则窗口会一直处于闪烁之中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值