CDialog响应键盘事件

在网上经常有人提出CDialog中响应键盘消息的OnKeyDown函数没反应。结论是CDialog不响应OnKeyDown,相应的解决方法是:
一个简单的办法就是重载CWnd::PreTranslateMessage

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

if(pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_LEFT:
break;
case VK_RIGHT:

break;
case VK_UP:
break;
case VK_DOWN:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}

 

经过仔细研究发现CDialog是相应对应消息的OnKeyDown函数的,只是这个消息在到达窗体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个消息,但要注意的是,MFC为了实现在窗体上切换子控件的焦点,已经将 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN进行了处理,同时VK_RETURN也被系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获,暂时只能用PreTranslateMessage解决。
一个窗体仅在它没有可视和有效的控件时。响应OnKeyDown。

 

阅读更多
文章标签: mfc class up
个人分类: vc++
想对作者说点什么? 我来说一句

Qt界面响应键盘事件

2013年01月27日 458KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭