MFC:从不同的类调用上下文菜单单击的函数,而不是让它调用其默认函数

MFC: Call a function from different class for context-menu click instead of having it call its default function?

本文关键字:函数 调用 默认 菜单 MFC 上下文 单击      更新时间:2023-10-16

假设我有一个名为CListCtrlStyled的网格类,它派生自CWnd,一个来自MFC的内置类。

假设我有另一个叫做Parent的类,它使用一个CListCtrlStyled的实例,并映射到一个列表控件。交货。

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类做的事情不是一个选项。

最终,当我从右键菜单中单击"复制"时,我想使用父类的复制函数而不是实例的类。

也许这个设计有缺陷?如果有其他的设计可以让我做到我所说的,我应该考虑,请告诉我,谢谢。

您(或其他人)已经设计了CListCtrlStyled控件,它首先使用ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)宏处理右键单击事件的方式。宏将CListCtrlStyled::OnRclick方法定义为右击事件的第一个处理程序。在处理程序中,您可以返回TRUE或FALSE以允许父进程处理Right Click事件。然而,正如您正确注意到的那样,事件将首先由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);
}