Как заставить дочерний элемент управления обрабатывать команду акселератора родительского CView - PullRequest
2 голосов
/ 31 декабря 2010

У меня есть CFormView и дочерний элемент управления CListCtrl.Я могу без проблем обрабатывать события акселератора, такие как Ctrl + C, Ctrl + V ... в CFormView, определив ниже обработчик сообщения:

    ON_COMMAND(ID_EDIT_COPY, &CMyFormView::OnEditCopy) 

Теперь я хочу, чтобы мой CListCtrl обрабатывал эти команды по-разному.Я хочу реализовать OnEditCopy в классе CListCtrl, а не реализовывать логику в классе представления.Как передать события акселератора из CView в дочерний элемент управления, когда CListCtrl находится в фокусе?Я пробовал как:

    ON_CONTROL_REFLECT(ID_EDIT_COPY, &CMyListCtrl::OnEditCopy) 

Но это не работает.

Ответы [ 2 ]

4 голосов
/ 02 сентября 2011

В качестве альтернативы вы можете переопределить PreTranslateMessage () в CMyListCtrl и вызвать 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

4 голосов
/ 31 декабря 2010

Используйте тот же макрос ON_COMMAND в CMyListCtrl.

  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, если это окно фокуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...