2010-12-31 4 views
1

저는 CformView와 자식 CListCtrl 컨트롤이 있습니다. 나는 메시지 핸들러 아래 정의하여, 문제없이하여 CformView에서 Ctrl + C, Ctrl + V를 ... 같은 가속기 이벤트를 처리 할 수 ​​ 상위 컨트롤의 자식 컨트롤 가속기 명령을 처리하는 방법

ON_COMMAND(ID_EDIT_COPY, &CMyFormView::OnEditCopy) 

지금 내 CListCtrl 다르게이 명령을 처리 할 수 ​​있습니다. 내가 CListCtrl 클래스에서 OnEditCopy 구현하는 대신보기 클래스에서 로직 을 구현하고 싶습니다. CListCtrl에 포커스가있을 때 CView의 액셀러레이터 이벤트를 자식 컨트롤 에 전달할 수 있습니까? 나는 다음과 같이 시도했다 :

ON_CONTROL_REFLECT(ID_EDIT_COPY, &CMyListCtrl::OnEditCopy) 

그러나 그것은 작동하지 않는다.

답변

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 취급이 메이크업.

+0

이것은 정확히 예상 한 것입니다. 고맙습니다! – Sheen

+0

이 경우에 OnCommand() 메서드가 어떤 역할을 수행하는지 설명하여 답변을 확장 하시겠습니까? 왜 ID_EDIT_COPY가 매우 특별해서 부모 클래스에서 메시지 디스패치 메커니즘을 수정해야합니까? – Jaywalker

3

대체 당신은이 메인 프레임에 글로벌 가속기 자원에 acccess을 필요로하거나 다시 가속기를로드하는 것이()

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

CMyListCtrl에를 PreTranslateMessage()를 무시하고 TranslateAccelerator를 호출 할 수 있습니다. 다음 CMyListCtrl 가속기 테이블에 지정된 WM_COMMAND 메시지를 받게됩니다.

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

+0

지원 링크가 더 이상 유효하지 않습니다. –

관련 문제