C++ MFC:CWnd::SendMessage()是否只向其类发送消息,或者其他类是否可以捕获它?
假设我有一个名为ListCtrl的列表组件类,它派生自CWnd 假设我还有一个名为DialogA的对话类,它是从CDialog派生的 DialogA使用ListCtrl将其映射到列表组件。比如说,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
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