MFC:CWnd :: SendMessage()只向其类发送消息,还是其他类可以捕获它?

时间:2014-05-21 15:44:16

标签: c++ mfc sendmessage

假设我有一个名为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的复制功能执行。

2 个答案:

答案 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)

任何窗口(以及控件是子窗口)都可以向同一进程中的任何窗口发送消息。

问题是这对你的用例是否是个好主意。

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