CDialog中不响应OnKeyDown和一些相关问题
来源:互联网 发布:java 面试 书籍 编辑:程序博客网 时间:2024/04/28 07:20
在网上经常有人提出CDialog中响应键盘消息的OnKeyDown函数没反应。结论是CDialog不响应OnKeyDown,相应的解决方法是:
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。
下面是一个将TAB键的功能用Enter键实现的函数
void Myedit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if (nChar= = VK_RETURN)
{
CDialog* Pwnd=(CDialog*)GetParent() ;//取得对话框指针
Pwnd->NextDlgCtrl( ); //切换到下一个输入焦点
}
CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
UINT nChar 指定被给键的虚拟键,例如VK_RETURN
UINT nRepCnt :
重复计数是该消息所表示的击键次数,大多数情况下,重复计数是1.不过,如果按下一个键之后,您的窗口过程不够快,以致不能处理自动重复速率下的按键消息,windows就把几个wm_keydown或者wm_syskeydown消息组合到单个消息中,并相应的增加重复计数.wm_keyup或wm_keysysup的重复计数总是为1
UINT nFlags
用于传递按键的其它一些信息,如扫描码,上一次按键状态等。具体如下:
字节 说明
0-7 键盘扫描码
8 此按键为扩充按键,如F1,F12等功能键,此字节等于1时为真
9-12 保留
13 此字节为1表示按下键的同时,ALT键也被按住了
14 前一个按键状态。此字节为1代表信息在按键被按下之前就送出来了
15 此字节为1表示这个按键已经被放开了,反之就表示还被按着
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppsl/2008825/137401.html
- CDialog中不响应OnKeyDown和一些相关问题
- CDialog中不响应OnKeyDown和一些相关问题
- CDialog中不响应OnKeyDown和一些相关问题
- CDialog中不响应OnKeyDown和一些相关问题
- CDialog中不响应OnKeyDown的解决方法
- CDialog中OnKeyDown事件和OnChar事件实现
- onKeyDown无响应问题
- tabhost里不响应onkeydown的解决办法
- activity中嵌套webview ,onkeydown和onkeyup 方法不执行
- VC++对话框程序不响应OnChar 和 OnKeyDown事件处理函数
- TabActivity中onKeyDown无法响应的解决方法
- onkeydown不响应的原因及处理方法
- CDialog响应键盘事件
- <3>CDialog::DoModal()问题和_WIN32_WINNT
- onTouchEvent中 ACTION_MOVE不响应的问题
- CDialog中使用工具栏和状态栏
- CDialog窗口类的Class Style中没有CS_VREDRAW和CS_HREDRAW导致自绘有问题
- Android开发:TabActivity中onKeyDown无法响应的解决方法
- 一些HTML5的东西(DOM相关)
- CentOS下添加程序到服务并且设置服务自动启动的方法
- [原创]一步步教你用brew写游戏 2 -工欲善其事必先利其器
- Python 入门(3)-- IDLE的使用细节
- 动态弹出DIV层
- CDialog中不响应OnKeyDown和一些相关问题
- 所有者策略简介(OwnerPolicy)
- android Broadcast学习
- could not instantiate id generator
- 一个模板元在编译时候检查版本结构的功能
- 三星校园杯Android应用开发大赛正式启动
- 深入浅出大端小端
- inux中socketaddr_in的结构解析
- 冰雪两重天