我正在尝试将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_前缀消息之间是否有区别或者它们是如何处理的? 有人可以发布一个如何正确发送消息的样本吗?
提前致谢。
修改
我找到了问题的另一种解决方案。请参阅下面的答案。
答案 0 :(得分: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 );
答案 1 :(得分:4)
我发现我可以覆盖派生类中的消息处理程序,并通过在消息映射中使用此代码将消息传递给我的父控件:
ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)
然后在OnListItemChanged中,我首先调用基类函数然后返回FALSE。这会使消息毫不费力地反映到父类。