2

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

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

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

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

它似乎没有被

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

我在业主班。

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

提前致谢。

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

4

2 回答 2

7

发送 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 );
于 2009-08-13T14:45:34.833 回答
4

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

ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)

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

于 2009-08-14T15:16:40.147 回答