【问题标题】:MFC CFormView OnKeyDown event not triggeredMFC CFormView OnKeyDown 事件未触发
【发布时间】:2013-12-10 06:31:22
【问题描述】:

我有一个 CFormView,上面有一些控件。我在 CFormView 上实现了 OnKeyDown 事件。一切都很好,除了我的事件从未被触发,因为焦点位于我的 CFormView 中的组合框上。我不希望组合框接收事件。我希望 CFormView 接收它。所以我实现了 PreTranslateMessage(MSG* pMsg),它从组合框中删除了事件,但它从不将它提供给 CFormView。代码如下:

BOOL CfinalprojView::PreTranslateMessage(MSG* pMsg) { 
if( pMsg->message == WM_KEYDOWN ) {
    SendMessage( WM_COMMAND, MAKEWPARAM( IDD_FINALPROJ_FORM, BN_CLICKED ), ( LPARAM )0 );
    return TRUE; 
} else if( pMsg->message == WM_KEYUP ) {
    return TRUE; 
} else {
    return CFormView::PreTranslateMessage( pMsg );
}}

我做错了什么?

提前谢谢你,

科尼柳

【问题讨论】:

  • 为什么不希望组合框处理事件?
  • 因为我想在用户按键时在 CFormView 上绘制东西。
  • 如果组合框是窗体的子控件,是什么阻止您执行父(窗体)方法进行绘制?
  • 我的 CFormView 上的组合框或任何其他组件应该与 CFormView 特定的内容无关。我只是想让我的 CFormView 接收一个可以绘制它的事件。如果我在组合框中实现表单绘制,那么我必须在每个控件中实现它,因为我不知道哪个控件将获得焦点。
  • 另外,我是 MFC 的新手,我不知道如何处理父级。但我认为整个设计会很糟糕。这是我要做的最后一件事。

标签: c++ events mfc messages


【解决方案1】:

所以,似乎没有办法将关键事件转发给CFormView。相反,可以捕获 PreTranslateMessage(MSG* pMsg) 中的事件并检查按下的键,如下所示:

BOOL CfinalprojView::PreTranslateMessage(MSG* pMsg) {
    if( pMsg->message == WM_KEYDOWN ) {
        if( pMsg->wParam == VK_DELETE ) {
            ...
        }
        return TRUE; 
    }
    else if( pMsg->message == WM_KEYUP )
        return TRUE; 
    else
        return CFormView::PreTranslateMessage( pMsg );
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多