C++ MFC:CWnd::SendMessage()是否只向其类发送消息,或者其他类是否可以捕获它?

C++ MFC:CWnd::SendMessage()是否只向其类发送消息,或者其他类是否可以捕获它?,c++,mfc,sendmessage,C++,Mfc,Sendmessage,假设我有一个名为ListCtrl的列表组件类,它派生自CWnd 假设我还有一个名为DialogA的对话类,它是从CDialog派生的 DialogA使用ListCtrl将其映射到列表组件。比如说, void DialogA::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_CONTROL, listCtrl); } 在哪里 因此,如果Li

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

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

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

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

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

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

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

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

问题是,对于您的用例来说,这是否是一个好主意


也许,如果您要为列表控件派生一个类,只需向它传递一个指针,该指针指向一个对象,该对象可以根据其执行的任何操作调用成员函数。

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

您需要使用对话框窗口的原始
HWND
,并使用全局
sendmages
如下所示:

::SendMessage(hWnd, WM_WHATEVER, 0, 0); // note the "::" scoping operator
或者,您也可以使用列表控件的父窗口(假设对话框是其父窗口):

在最后一种情况下,确保
GetParent()
不返回
NULL
可能更可靠,因此:

CWnd *pParent = GetParent();
if (pParent != NULL)
    pParent->SendMessage(WM_WHATEVER, 0, 0);
else
    // error handling

奇怪,因为这对我不起作用。我在ListCtrl中使用了SendMessage(COPY_MSG),但我的DialogA::PreTranslateMessage()无法捕获它。其中COPY_MSG=(WM_APP+1)。所以你可能做错了。如果需要帮助,请显示一些代码。谢谢!那正是我要找的!
GetParent()->SendMessage(WM_WHATEVER, 0, 0);
CWnd *pParent = GetParent();
if (pParent != NULL)
    pParent->SendMessage(WM_WHATEVER, 0, 0);
else
    // error handling