假设我有一个名为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的复制功能执行。
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
任何窗口(控件是子窗口)都可以向同一进程中的任何窗口发送消息。
问题是这对你的用例来说是否是个好主意。
也许,如果你打算为列表控件派生一个类,只要给它一个指向对象的指针就可以了,不管它在做什么,它都可以适当地调用成员函数。