【问题标题】:How to send a notification that's handled by ON_NOTIFY?如何发送由 ON_NOTIFY 处理的通知?
【发布时间】:2010-11-19 08:00:38
【问题描述】:

我正在尝试向我的自定义网格列表的所有者发布一个 LVN_ITEMCHANGED。我知道如何使用 PostMessage 发送 WM_ 用户消息(如图所示)

::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), WM_REFRESH, (WPARAM)pBuffer, (LPARAM)GetOutputIdx() );

当我使用相同的代码发送 LVN_ITEMCHANGED 消息时,

::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), LVN_ITEMCHANGED, 0, 0);

好像没被抓到

ON_NOTIFY(LVN_ITEMCHANGED, ..., ...) 

我在所有者类中。

使用 ::PostMessage 发送 Notify 事件是不是我错了?
Notify 消息和 WM_ 前缀消息之间是否有区别,或者它们的处理方式有什么区别?
有人可以发布我如何正确发送消息的示例吗?

提前致谢。

编辑
我找到了解决问题的另一种方法。请参阅下面的答案。

【问题讨论】:

    标签: c++ mfc messages


    【解决方案1】:

    发送 WM_NOTIFY,将控件 ID 作为 wParam 并将 NMHDR* 作为 lParam 传递。

    您需要分配一个 NMHDR 变量并适当地填充它 - 将 code 设置为 LVN_ITEMCHANGED 并将 idFrom 设置为控件 ID。您只能使用 SendMessage(),而不能使用 PostMessage(),因为接收方将通过 NMHDR* 指针直接读取内存。

    像这样的:

    NMHDR nmhdr;
    nmhdr.code = LVN_ITEMCHANGED;
    nmhdr.idFrom = controlId;
    nmhdr.hwndFrom = controlWindowHandle;
    SendMessage( targetWindowHandle, WM_NOTIFY, controlId, &nmhdr );
    

    【讨论】:

    • 我不太明白答案。你能发布一个代码示例吗?
    【解决方案2】:

    我发现我可以重写派生类中的消息处理程序并将消息传递给我的父控件,只需在消息映射中使用以下代码:

    ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)
    

    然后在 OnListItemChanged 中,我首先调用基类函数然后返回 FALSE。这使得消息可以毫不费力地反映到父类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多