MFC.CWnd::SendMessage()是否只能向自己的类发送消息,还是其他类可以捕捉到?CWnd::SendMessage()是否只能向它的类发送消息,还是其他类可以捕获它?

问题描述 投票:2回答:2

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

假设我还有一个从CDialog派生出来的对话框类,叫做DialogA。

DialogA使用ListCtrl将其映射到一个列表组件。比如说,我有一个叫做DialogA的对话框类,它是由CDialog派生出来的。

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的复制功能执行。

c++ mfc sendmessage
2个回答
4
投票

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

1
投票

任何窗口(控件是子窗口)都可以向同一进程中的任何窗口发送消息。

问题是这对你的用例来说是否是个好主意。

也许,如果你打算为列表控件派生一个类,只要给它一个指向对象的指针就可以了,不管它在做什么,它都可以适当地调用成员函数。

© www.soinside.com 2019 - 2024. All rights reserved.