如何发送由ON_NOTIFY处理的通知?

时间:2009-08-13 14:42:29

标签: c++ mfc messages

我正在尝试将LVN_ ITEMCHANGED发布到我的自定义gridlist的所有者。我知道如何使用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_前缀消息之间是否有区别或者它们是如何处理的? 有人可以发布一个如何正确发送消息的样本吗?

提前致谢。

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

2 个答案:

答案 0 :(得分:7)

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

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

像这样的Smth:

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

答案 1 :(得分:4)

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

ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)

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