Допустим, у меня есть класс сетки с именем CListCtrlStyled, который является производным от CWnd, встроенного класса из MFC.
И скажем, у меня есть другой класс с именем Parent, который использует экземпляр CListCtrlStyled и сопоставлен с элементом управления списком. Ex.
void Parent::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_CONTROL, listCtrl);
}
CListCtrlStyled имеет свои собственные функции и обработчик. Это будет обрабатывать событие правой кнопки мыши таким образом.
BEGIN_MESSAGE_MAP(CListCtrlStyled, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlStyled)
ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Где OnRclick вызывает определенную функцию в зависимости от того, какая опция контекстного меню (копирование, вставка и т. Д.) Нажата.
Я хотел бы обработать событие правого клика в классе Parent, не вызывая обработчик в классе экземпляра, но я не уверен, как это сделать.
Я пытался справиться с этим.
BEGIN_MESSAGE_MAP(Parent, CDialog)
//{{AFX_MSG_MAP(CListCtrlStyled)
ON_NOTIFY(NM_RCLICK, IDC_LIST_CONTROL, &Parent::OnRclick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Хотя он обрабатывает щелчок правой кнопкой мыши в классе Parent, он также обрабатывает его снова в классе CListCtrlStyled.
Обратите внимание, что CListCtrlStyled используется и в других классах, поэтому просто отредактировать функцию копирования в этом классе, чтобы приспособиться к тому, что я хочу сделать с классом Parent, не вариант.
В конечном счете, я хочу использовать функцию копирования класса Parent вместо класса экземпляра, когда я нажимаю «Копировать» в контекстном меню, вызываемом правой кнопкой мыши.
Возможно, этот дизайн имеет недостатки? Если есть другой дизайн, который позволяет мне делать то, что я сказал, что я должен рассмотреть, пожалуйста, дайте мне знать, спасибо.
Вы (или кто-то еще) разработали CListCtrlStyled
контролировать, как он обрабатывает событие правого клика сначала с помощью ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
макро. Макрос определяет CListCtrlStyled::OnRclick
Метод в качестве первого обработчика события правого клика. В обработчике вы можете вернуть TRUE или FALSE, чтобы родительский элемент мог обработать событие правого клика. Однако, как вы правильно заметили, событие будет сначала обработано CListCtrlStyled
а затем будет передан обработчику Parent
учебный класс.
Есть способ обработать это событие в Parent
во-первых, и даже заблокировать его обработку в CListCtrlStyled
, Вы делаете это в PreTranslateMessage. Вы обрабатываете сообщение до того, как оно отправлено, и если вы возвращаете TRUE CListCtrlStyled
даже не узнаю об этом. Вот небольшой код:
BOOL Parent::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_RBUTTONUP && pMsg->hwnd == listCtrl.GetSafeHwnd())
{
// do something
// if you want to block the message from later processing then return TRUE.
// if you want to allow the handlers for NM_RCLICK to also handle the message
// then comment the line below
return TRUE;
}
return __super::PreTranslateMessage(pMsg);
}