OnKeyDown函数无法响应键盘

Researcher 2006-09-27 09:04:35
我做了以下3个工作,但键盘还是无法控制,
我测试了一下OnKeyDown()函数根本进都没进去
请问是什么问题?

1.我在.h里面加上
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
2.我在.cpp里面加上ON_WM_KEYDOWN()
BEGIN_MESSAGE_MAP(COpenGL, CWnd)
//{{AFX_MSG_MAP(COpenGL)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

3.在.cpp里面加上
void COpenGL::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{ // TODO: Add your message handler code here and/or call default
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
switch(nChar)
{ case 'A': //a模式转换
line=!line;
break;
case 0x42: //b正向旋转
t++;
break;
case 0x43: //c反向旋转
t--;
break;
case 0x53: //s停止旋转
t=0;
break;
case 0x46: //f远离并缩小
size--;
break;
case 0x44: //d靠近并放大
size++;
break;
default:
break;
}

}
...全文
692 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Researcher 2006-09-27
  • 打赏
  • 举报
回复
非要增加SetFocus();才能响应键盘,但是这样又无法响应对话框里的按钮实践了,怎么解决?
BOOL COpenGL::PreTranslateMessage(MSG *pMsg)
{ SetFocus();
switch(pMsg->message)
{ case WM_KEYDOWN://Windows键盘响应
//exit(0);
switch(pMsg->wParam)
{ case 'A': //a模式转换
line=!line;
break;
case 0x42: //b正向旋转
t++;
break;
case 0x43: //c反向旋转
t--;
break;
case 0x53: //s停止旋转
t=0;
break;
case 0x46: //f远离并缩小
size--;
break;
case 0x44: //d靠近并放大
size++;
break;
}
break;
default:
break;
}
return CWnd::PreTranslateMessage(pMsg);
}
折腾_苏州 2006-09-27
  • 打赏
  • 举报
回复
用你COpenGL父类的 ::PreTranslateMessage(pMsg);
Researcher 2006-09-27
  • 打赏
  • 举报
回复
CDialog::PreTranslateMessage(pMsg);编译出错怎么办?

D:\Prog\__VR_Model\MFCPoints11\OpenGL.cpp(224) : error C2352: 'CDialog::PreTranslateMessage' : illegal call of non-static member function
c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(2626) : see declaration of 'PreTranslateMessage'
ChinaCup 2006-09-27
  • 打赏
  • 举报
回复

关于 为什么映射WM_KEYDOWN消息没有作用 ??

那是 问题在对话框程序里,PretranslateMessage中的一个PretranslateInput的函数里的 IsDialogMessage。并使用IsDialogMessage
// filter both messages to dialog and from children, 比如所需要的WM_KEYDOWN.目的
把VK_LEFT等拦截了用于tab的切换

你可以去看看MFC的源代码,找这个函数:
CDialog::PretranslateMessage 深入跟踪,

SDI/MDI没这个问题了
zhucde 2006-09-27
  • 打赏
  • 举报
回复
BOOL CRender::PreTranslateMessage(MSG* pMsg)
{

if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam=='A')
MessageBox("A");

}

return CDialog::PreTranslateMessage(pMsg);
}
用PreTranslateMessage是要以响应的,为何映射没有用,说不清楚,MSDN没查到解释,希望有人解释一下,
让界面获得焦点可以
this->SetFocus();
this->SetForegroundWindow();
Researcher 2006-09-27
  • 打赏
  • 举报
回复
还是没有用,请问怎样让界面获得焦点?
Researcher 2006-09-27
  • 打赏
  • 举报
回复
PreTranslateMessage
的返回值是true 还是 false?
littlepboy 2006-09-27
  • 打赏
  • 举报
回复
此界面没有获得焦点?
其他的也想不到了。
zhucde 2006-09-27
  • 打赏
  • 举报
回复
谁解释一下楼主的题目 , 为什么映射WM_KEYDOWN消息没有作用?
ChinaCup 2006-09-27
  • 打赏
  • 举报
回复
BOOL C****Dlg::PreTranslateMessage(MSG *pMsg)
{
if (pMsg->message == WM_KEYDOWN )
{
switch(pMsg->wParam)
{ case 'A': //a模式转换
line=!line;
break;
case 0x42: //b正向旋转
t++;
break;
case 0x43: //c反向旋转
t--;
break;
case 0x53: //s停止旋转
t=0;
break;
case 0x46: //f远离并缩小
size--;
break;
case 0x44: //d靠近并放大
size++;
break;
default:
break;
}


}


}
ChinaCup 2006-09-27
  • 打赏
  • 举报
回复
1. .h里virtual BOOL PreTranslateMessage(MSG *pMsg);
2. .cpp里
BOOL C****Dlg::PreTranslateMessage(MSG *pMsg)
{


}
Researcher 2006-09-27
  • 打赏
  • 举报
回复
PreTranslateMessage
代码应该怎么写?
能不能贴个简单例子示意?
ChinaCup 2006-09-27
  • 打赏
  • 举报
回复
是的,在PreTranslateMessage处理
if (pMsg->message == WM_KEYDOWN

littlepboy 2006-09-27
  • 打赏
  • 举报
回复
根据你的描述,可以推测你的OnKeyDown所在界面与按钮所在的界面不是一个窗口,否则不会一个SetFocus,另一个窗口便失去焦点了。

假设你要处理KeyDown的窗口为A,按钮所在窗口为B,可以这样:
在A里处理的你的OnKeyDown,这个不变
void A:OnKeyDown()
{
// 你的代码....
}
在B里PreTranslateMessage里截获KeyDown消息,并返回给A:
BOOL B::PreTranslateMessage()
{
if (pMsg->message == WM_KEYDOWN)
{
return A::PreTranslateMessage(pMsg);
}
}

这样无论焦点在哪个窗口都会响应你键盘,也不存在失去焦点等问题。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧