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