我正在尝试将LVN_ ITEMCHANGED发布到我的自定义gridlist的所有者.我知道如何使用PostMessage发送WM_用户消息(如此处所示)
::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), WM_REFRESH, (WPARAM)pBuffer, (LPARAM)GetOutputIdx() );
Run Code Online (Sandbox Code Playgroud)
当我使用相同的代码发送LVN_ITEMCHANGED消息时,
::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), LVN_ITEMCHANGED, 0, 0);
Run Code Online (Sandbox Code Playgroud)
它似乎没有被抓住
ON_NOTIFY(LVN_ITEMCHANGED, ..., ...)
Run Code Online (Sandbox Code Playgroud)
我在业主班.
使用:: PostMessage发送Notify事件我错了吗?
Notify消息和WM_前缀消息之间是否有区别或者它们是如何处理的?
有人可以发布一个如何正确发送消息的样本吗?
提前致谢.
编辑
我找到了问题的另一种解决方案.请参阅下面的答案.
发送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 );
Run Code Online (Sandbox Code Playgroud)