Istnieje kilka powiadomień na podstawie tego, co się dzieje.
Jeśli wybierzesz element i nic jeszcze nie zostanie wybrane, otrzymasz jedno powiadomienie o zmianie LVIF_STATE: uNewState & LVIS_SELECTED. Nowo wybrany element będzie znaleźć na stronie:
pNMListView->iItem
Jeśli element jest zaznaczony przed wybraniem nowego obiektu, dostaniesz trzy zmiany Stan:
pierwsze zostaniesz poinformowany, że w poprzednim punkcie ostrości utraty ostrości:
pNMListView->uOldState & LVIS_FOCUSED
Następnie użytkownik zostanie powiadomiony, że stary element jest odznaczone:
pNMListView->uOldState & LVIS_SELECTED
Wreszcie, otrzymasz nowy stan wyboru produktu:
pNMListView->uNewState & LVIS_SELECTED
(ponownie spojrzeć na iItem dla nowo wybranego elementu)
Więc pułapka my biegł jest to, że z powodu wyników poz cofnięcie w dwóch zawiadomień , robiliśmy wiele powtarzalnych, czasem szkodliwych, przetwarzania. Ostatecznie wykonaliśmy to przetwarzanie tylko dla drugiej wiadomości (pNMListView->uOldState & LVIS_SELECTED)
i pomijamy to samo przetwarzanie po utracie powiadomienia o fokucie.
To nie złapie się zmieniać, gdy wybierasz trzy elementy z przesunięciem, ale następnie wybierasz dowolne z nich (które odznacza pozostałe dwa, ale utrzymuje ten zaznaczony). Jakiekolwiek obejście tego problemu z wyjątkiem zachowania listy wybranych elementów? –
Nie mogę przetestować go teraz, ale myślę, że będziesz musiał złapać zaznaczenie, jak również zaznaczenie: aby złapać zaznaczenie, użyj 'if ((pNMListView-> uChanged & LVIF_STATE) && (pNMListView-> uOldState & LVNI_SELECTED) &&! (PNMListView -> uNewState i LVNI_SELECTED)) ' – djeidot
@djeidot: Dziękuję bardzo, pomogło. Po osadzeniu w swojej własnej klasie Kontroli, można to również zredukować do ON_NOTIFY_REFLECT (LVN_ITEMCHANGED, i OnItemSelected). – mox