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

时间:2010-12-31 12:23:03

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

我有一个CFormView和一个子CListCtrl控件。我能应付 加速器事件,如Ctrl + C,Ctrl + V ......在CFormView中没有 问题,通过定义下面的消息处理程序:

    ON_COMMAND(ID_EDIT_COPY, &CMyFormView::OnEditCopy) 

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

    ON_CONTROL_REFLECT(ID_EDIT_COPY, &CMyListCtrl::OnEditCopy) 

但它不起作用。

2 个答案:

答案 0 :(得分:4)

在CMyListCtrl中使用相同的ON_COMMAND宏。

  ON_COMMAND(ID_EDIT_COPY, &CMyListCtrl::OnEditCopy)  

您所要做的就是重写OnCmdMsg方法。

BOOL CMyFormView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    if (GetFocus() == m_myListCtrl
        && m_myListCtrl->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
        return TRUE;
    return CMyFormView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

(m_myListCtrl是CMyListCtrl实例指针。)

这使得所有WM_COMMAND消息首先在m_myListCtrl中处理,如果它是焦点窗口的话。

答案 1 :(得分:3)

备选你可以覆盖CMyListCtrl上的PreTranslateMessage()并调用TranslateAccelerator()

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

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

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