代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

如何发送由on-notify处理的通知?

  •  2
  • CodeFusionMobile  · 技术社区  · 15 年前

    我正在尝试将一个lvn_uu项更改为我的自定义网格列表的所有者。我知道如何使用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发送通知事件是否错误?
    通知消息和wm前缀消息之间是否有区别,或者它们是如何处理的?
    有人能发布一个我如何正确发送信息的示例吗?

    事先谢谢。

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

    2 回复  |  直到 15 年前
        1
  •  7
  •   sharptooth    15 年前

    发送wm_notify,将control id作为wparam传递,将nmhdr*作为lparam传递。

    您需要分配一个nmhdr变量并适当地填充它-set code 到lvn_项已更改和 idFrom 到控件ID。您只能使用sendmessage(),而不能使用postmessage(),因为接收方将通过nmhdr*指针直接读取内存。

    史密斯这样:

    NMHDR nmhdr;
    nmhdr.code = LVN_ITEMCHANGED;
    nmhdr.idFrom = controlId;
    nmhdr.hwndFrom = controlWindowHandle;
    SendMessage( targetWindowHandle, WM_NOTIFY, controlId, &nmhdr );
    
        2
  •  4
  •   CodeFusionMobile    15 年前

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

    ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)
    

    然后在OnListItemChanged中,我首先调用基类函数,然后返回false。这会使消息轻松地反映到父类中。