假设我有一个名为ListCtrl的列表组件类,它是从CWnd派生的。

假设我还有一个对话框类DialogA,它是从CDialog派生的。

DialogA使用ListCtrl将其映射到列表组件。例如,

void DialogA::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST_CONTROL, listCtrl);
}

哪里
ListCtrl listCtrl;

因此,如果ListCtrl调用SendMessage(),则DialogA可以处理它吗?

如果没有,我如何让DialogA处理ListCtrl所做的事情。

最终,我希望DialogA在单击“复制”的ListCtrl右键菜单选项时使用它自己的“复制”功能,并阻止执行ListCtrl的复制功能。

最佳答案

CWnd::SendMessage将向该CWnd派生类包装的窗口发送消息。因此,如果您从SendMessage(这是对话框的子窗口)中使用ListCtrl,则对话框将看不到它。

您要么需要具有对话框窗口的原始HWND,然后使用全局SendMessage,例如:

::SendMessage(hWnd, WM_WHATEVER, 0, 0); // note the "::" scoping operator

或者,您可以使用列表控件的父窗口(假设对话框是其父窗口):
GetParent()->SendMessage(WM_WHATEVER, 0, 0);

在后一种情况下,确保GetParent()不返回NULL会更可靠,因此:
CWnd *pParent = GetParent();
if (pParent != NULL)
    pParent->SendMessage(WM_WHATEVER, 0, 0);
else
    // error handling

关于c++ - MFC:CWnd::SendMessage()仅将消息发送到其类,还是其他类可以捕获它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23787976/

10-09 18:01