假设我有一个名为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的复制功能执行。
答案 0 :(得分:3)
CWnd::SendMessage
会向该CWnd
派生类包装的窗口发送一条消息。因此,如果您使用SendMessage
(对话框的子窗口)中的ListCtrl
,则对话框不会看到它。
您需要拥有对话框窗口的原始HWND
并使用globall 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 :(得分:0)
任何窗口(以及控件是子窗口)都可以向同一进程中的任何窗口发送消息。
问题是这对你的用例是否是个好主意。
也许,如果您要为列表控件派生一个类,只需向它传递一个指向对象的指针,它可以根据它正在进行的操作调用成员函数。