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

    ON_COMMAND(ID_EDIT_COPY, &CMyFormView::OnEditCopy)

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

但这是行不通的。

最佳答案

在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(如果它是焦点窗口)中处理。

10-04 14:48