Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/165.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC CFormView OnKeyDown事件未触发_C++_Events_Mfc_Messages - Fatal编程技术网

C++ MFC CFormView OnKeyDown事件未触发

C++ MFC CFormView OnKeyDown事件未触发,c++,events,mfc,messages,C++,Events,Mfc,Messages,我有一个CFormView,我对它有一些控制。我已经在我的CFormView上实现了OnKeyDown事件。一切都很好,除了我的事件从未触发,因为焦点在我的CFormView中的组合框上。我不希望组合框接收事件。我希望CFormView收到它。因此,我实现了PreTranslateMessage(MSG*pMsg),它从组合框中删除事件,但从未将其提供给CFormView。代码如下: BOOL CfinalprojView::PreTranslateMessage(MSG* pMsg) { i

我有一个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 );
}}
我做错了什么

提前谢谢大家,


Corneliu

因此,似乎没有办法将关键事件转发给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 );
} 

因此,似乎没有办法将关键事件转发给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 );
} 

为什么不希望组合框处理事件?因为我想在用户点击键时在CFormView上绘制内容。如果组合框是窗体的子控件,是什么阻止您执行父控件(窗体)绘制的方法?组合框或我的CFormView上的任何其他组件都不应该与CFormView特定的内容有任何关系。我只是想让我的CFormView收到一个事件来描绘它。如果我在组合框中实现表单绘制,那么我必须在每个控件中实现,因为我不知道哪个控件将具有焦点。另外,我对MFC是新手,我不知道如何获得父控件的句柄。但我认为整个设计会很糟糕。这是我最不愿意做的事情。为什么不让组合框来处理事件?因为我想在用户点击键时在CFormView上绘制内容。如果组合框是表单的子控件,是什么阻止您执行父控件(表单)绘制的方法?组合框或我的CFormView上的任何其他组件都不应该与CFormView特定的内容有任何关系。我只是想让我的CFormView收到一个事件来描绘它。如果我在组合框中实现表单绘制,那么我必须在每个控件中实现,因为我不知道哪个控件将具有焦点。另外,我对MFC是新手,我不知道如何获得父控件的句柄。但我认为整个设计会很糟糕。这是我最不愿意做的事。