计算机二级考试C++辅导:CDialog中不响应OnKeyDown和一些相关问题

时间:2008-10-05 02:43:00   来源:无忧考网     [字体: ]
经常有人提出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。