Как отправить уведомление, которое обрабатывается ON_NOTIFY?

Я пытаюсь отправить LVN_ ITEMCHANGED владельцу моего настраиваемого списка сеток. Я знаю, как отправить сообщение пользователя WM_ с помощью PostMessage (как показано здесь)

::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_ или как они обрабатываются?
Может ли кто-нибудь опубликовать образец того, как я бы отправил сообщение правильно?

Заранее спасибо.

Изменить
Я нашел другое решение проблемы. Смотрите мой ответ ниже.


person CodeFusionMobile    schedule 13.08.2009    source источник


Ответы (2)


Отправьте WM_NOTIFY, передайте идентификатор управления как wParam и NMHDR * как lParam.

Вам нужно будет выделить переменную NMHDR и заполнить ее соответствующим образом - установите code на LVN_ITEMCHANGED и idFrom на идентификатор управления. Вы можете использовать только SendMessage (), но не PostMessage (), поскольку принимающая сторона будет напрямую читать память через указатель NMHDR *.

Что-то вроде этого:

NMHDR nmhdr;
nmhdr.code = LVN_ITEMCHANGED;
nmhdr.idFrom = controlId;
nmhdr.hwndFrom = controlWindowHandle;
SendMessage( targetWindowHandle, WM_NOTIFY, controlId, &nmhdr );
person sharptooth    schedule 13.08.2009
comment
Я не совсем понимаю ответ. Не могли бы вы опубликовать пример кода? - person CodeFusionMobile; 13.08.2009

Я обнаружил, что могу переопределить обработчик сообщений в моем производном классе и передать сообщение родительскому элементу управления, просто используя этот код в карте сообщений:

ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)

Затем в OnListItemChanged я сначала вызываю функцию базового класса, а затем возвращаю FALSE. Это приводит к тому, что сообщение легко отражается в родительском классе.

person CodeFusionMobile    schedule 14.08.2009