我有一个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)
但它不起作用。
答案 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消息。