【问题标题】:MFC: Does CWnd::SendMessage() only send messages to its class, or can other classes catch it?MFC:CWnd::SendMessage() 是否只向其类发送消息,还是其他类可以捕获它?
【发布时间】:2014-05-21 15:44:15
【问题描述】:

假设我有一个名为 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 所做的事情。

最终,当单击“复制”的 ListCtrl 右键菜单选项时,我希望 DialogA 使用它自己的“复制”功能,并阻止执行 ListCtrl 的复制功能。

【问题讨论】:

    标签: c++ mfc sendmessage


    【解决方案1】:

    CWnd::SendMessage 将向CWnd 派生类包裹的窗口发送消息。因此,如果您使用 ListCtrl(对话框的子窗口)中的 SendMessage,对话框不会看到它。

    您需要拥有对话窗口的原始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
    

    【讨论】:

    • 谢谢!这正是我想要的!
    【解决方案2】:

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

    问题是这是否适合您的用例。

    也许,如果你要为列表控件派生一个类,只需将一个指针传递给它,它可以根据它正在做的任何事情调用成员函数。

    【讨论】:

    • 很奇怪,因为它不适合我。我在 ListCtrl 中使用了 SendMessage(COPY_MSG),但我的 DialogA::PreTranslateMessage() 没有捕捉到它。其中 COPY_MSG = (WM_APP+1)。
    • 所以你可能做错了。如果您需要帮助,请显示一些代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多