J’essaye de poster un LVN_ ITEMCHANGED au propriétaire de ma grid liste personnalisée. Je sais comment envoyer un message d’utilisateur WM_ à l’aide de PostMessage (comme indiqué ici)
::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), WM_REFRESH, (WPARAM)pBuffer, (LPARAM)GetOutputIdx() );
Quand j’utilise ce même code pour envoyer un message LVN_ITEMCHANGED,
::PostMessage( AfxGetMainWnd()->GetSafeHwnd(), LVN_ITEMCHANGED, 0, 0);
il ne semble pas être attrapé par le
ON_NOTIFY(LVN_ITEMCHANGED, ..., ...)
J’ai dans la classe de propriétaire.
Est-ce que je me trompe d’utiliser :: PostMessage pour envoyer un événement Notify?
Existe-t-il une différence entre les messages Notify et les messages de préfixe WM_ ou leur traitement?
Quelqu’un peut-il envoyer un échantillon de la manière dont j’enverrais correctement le message?
Merci d’avance.
modifier
J’ai trouvé une autre solution au problème. Voir ma réponse ci-dessous.
Envoyez WM_NOTIFY, transmettez l’ID de contrôle sous la forme wParam et NMHDR * sous la forme lParam.
Vous devrez affecter une variable NMHDR et la remplir correctement – définissez le code
sur LVN_ITEMCHANGED et idFrom
sur l’ID de contrôle. Vous pouvez uniquement utiliser SendMessage () et non PostMessage (), car le destinataire recevra directement la mémoire via le pointeur NMHDR *.
Smth comme ceci:
NMHDR nmhdr; nmhdr.code = LVN_ITEMCHANGED; nmhdr.idFrom = controlId; nmhdr.hwndFrom = controlWindowHandle; SendMessage( targetWindowHandle, WM_NOTIFY, controlId, &nmhdr );
J’ai découvert que je pouvais remplacer le gestionnaire de messages dans ma classe dérivée et transmettre le message à mon contrôle parent simplement en utilisant ce code dans la mappe de messages:
ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnListItemChanged)
Ensuite, dans OnListItemChanged, j’appelle d’abord la fonction de la classe de base, puis renvoie FALSE. Cela fait que le message est reflété sans effort dans la classe parente.