【问题标题】:Why doesn't OnKeyDown catch key events in a dialog-based MFC project?为什么 OnKeyDown 不捕获基于对话框的 MFC 项目中的关键事件?
【发布时间】:2011-06-09 14:34:23
【问题描述】:

我只是在 MFC (VS2008) 中创建了一个基于对话框的项目并将OnKeyDown 事件添加到对话框中。 当我运行项目并按下键盘上的键时,没有任何反应。但是,如果我从对话框中删除所有控件并重新运行项目,它就可以工作。 即使对话框上有控件,我应该怎么做才能获取关键事件?

这是一段代码:

void CgDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    AfxMessageBox(L"Key down!");
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

【问题讨论】:

    标签: c++ visual-c++ mfc keydown dialogbasedapp


    【解决方案1】:

    当对话框上有控件时,对话框本身永远不会获得焦点。它被儿童控件偷走了。当您按下按钮时,WM_KEYDOWN 消息将发送到具有焦点的控件,因此您的 CgDlg::OnKeyDown 永远不会被调用。如果您希望对话框处理WM_KEYDOWN 消息,请覆盖对话框的PreTranslateMessage 函数:

    BOOL CgDlg::PreTranslateMessage(MSG* pMsg)
    {
       if(pMsg->message == WM_KEYDOWN   )  
       {
          if(pMsg->wParam == VK_DOWN)
          {
             ...
          }
          else if(pMsg->wParam == ...)
          {
             ...                      
          }
          ...
          else
          {
             ...                   
          }
       }
    
       return CDialog::PreTranslateMessage(pMsg);  
    }
    

    另请参阅 CodeProject 上的这篇文章:http://www.codeproject.com/KB/dialog/pretransdialog01.aspx

    【讨论】:

    • 我在对话框中添加了一个CMFCPropertyGridCtrl,它的OnKeyDown 方法没有被调用..
    【解决方案2】:

    我的许多 CDialog 应用程序都使用 OnKeyDown()。只要您只想接收按键并在屏幕上绘图(如在制作游戏中),删除默认按钮和静态文本(CDialog 必须为空)并且 OnKeyDown() 将开始工作。一旦控件被放置在 CDialog 上,OnKeyDown() 将不再被调用。

    【讨论】:

      猜你喜欢
      • 2014-04-23
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多