MFC: вызывать функцию из другого класса для щелчка контекстного меню вместо того, чтобы вызывать функцию по умолчанию?

Допустим, у меня есть класс сетки с именем 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 вместо класса экземпляра, когда я нажимаю «Копировать» в контекстном меню, вызываемом правой кнопкой мыши.

Возможно, этот дизайн имеет недостатки? Если есть другой дизайн, который позволяет мне делать то, что я сказал, что я должен рассмотреть, пожалуйста, дайте мне знать, спасибо.

2

Решение

Вы (или кто-то еще) разработали 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);
}
2

Другие решения


По вопросам рекламы [email protected]