假设我有一个名为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/