CDialog中不响应OnKeyDown和一些相关问题

在网上经常有人提出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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值