如何使子控件处理父CView的加速器命令

She*_*een 1 c++ mfc visual-c++

我有一个CFormView和一个子CListCtrl控件。通过定义以下消息处理程序,我可以毫无问题地处理加速器事件,例如CFormView中的Ctrl + C,Ctrl + V...。

    ON_COMMAND(ID_EDIT_COPY, &CMyFormView::OnEditCopy) 
Run Code Online (Sandbox Code Playgroud)

现在,我希望CListCtrl以不同的方式处理这些命令。我想在CListCtrl类中实现OnEditCopy,而不是在视图类中实现逻辑。当CListCtrl成为焦点时,如何将加速器事件从CView传递给子控件?我尝试像:

    ON_CONTROL_REFLECT(ID_EDIT_COPY, &CMyListCtrl::OnEditCopy) 
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。

Rol*_*sen 5

或者,您可以覆盖CMyListCtrl上的PreTranslateMessage()并调用TranslateAccelerator()

BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg)
{
       if (m_hAccelTable)
       {
          if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg))
             return(TRUE);
       }
       return CListCtrl::PreTranslateMessage(pMsg);
}
Run Code Online (Sandbox Code Playgroud)

它需要访问大型机上的全局加速器资源,或者您再次加载加速器。然后,您的CMyListCtrl将收到在加速器表中指定的WM_COMMAND消息。

http://support.microsoft.com/kb/222829