2009-08-13 66 views
2

我正在嘗試將LVN_ITEMCHANGED發佈到我的自定義網格列表的所有者。我知道如何發送使用PostMessage的一個WM_用戶信息(如下圖所示)如何發送由ON_NOTIFY處理的通知?

::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_前綴消息之間是否有區別或它們是如何處理的?
有人可以發佈我如何正確發送消息的示例嗎?

在此先感謝。

編輯
我發現了另一個解決方案。請參閱下面的答案。

回答

4

我發現我可以重寫消息處理程序在我的派生類,並傳遞給我的父母控制的消息只是通過消息映射使用此代碼:

ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged) 

然後在OnListItemChanged中,我首先調用基類函數,然後返回FALSE。這導致消息毫不費力地反映到父類。

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); 
+0

我真的不明白答案。你可以發佈代碼示例嗎? – CodeFusionMobile 2009-08-13 14:57:29

+0

謝謝,這更清晰。 – CodeFusionMobile 2009-08-13 15:12:00