Win32 C++ LVNI_PREVIOUS не влияет на ListView_GetNextItem()

У меня есть ListView, где мне нужно выполнять операции с несколькими выбранными строками. Я начинаю перебирать выбранные строки, используя ListView_GetNextItem(hLV, -1, LVNI_SELECTED | LVNI_PREVIOUS). Однако при отладке возвращается индекс первой выбранной строки, а не последней. Это то же самое, когда используется только флаг LVNI_PREVIOUS.

В документации MS указано:

Windows Vista и более поздние версии: поиск элемента, который стоит перед элементом, указанным в wParam. Флаг LVNI_PREVIOUS не является направленным (LVNI_ABOVE найдет элемент, расположенный выше, а LVNI_PREVIOUS найдет элемент, заказанный ранее). Флаг LVNI_PREVIOUS в основном меняет логику поиска, выполняемого LVM_GETNEXTITEM или сообщения LVM_GETNEXTITEMINDEX.

Почему LVNI_PREVIOUS не работает описанным образом? Может быть, я использую неправильную commctrl версию, как говорится, только для Vista и выше?

Любая помощь будет оценена, спасибо.


person Synthetic Ascension    schedule 11.11.2020    source источник
comment
Я никогда раньше не пытался использовать LVNI_PREVIOUS. При итерации назад работает ли использование элемента ListView в качестве начального индекса вместо использования -1?   -  person Remy Lebeau    schedule 11.11.2020
comment
Это не так: просто возвращает -1.   -  person Synthetic Ascension    schedule 11.11.2020
comment
Похоже, они забыли это реализовать.   -  person Jonathan Potter    schedule 11.11.2020
comment
#define существует в заголовках до Vista; Я думаю, что ссылка на Vista просто обновляет их документы. См., например. LVM_GETHEADER, который также существовал до Vista.   -  person Jonathan Potter    schedule 12.11.2020


Ответы (1)


Я провел тест на Win10 и, конечно, хотя в документации об этом ничего не сказано, ЕСТЬ зависимость от ComCtl32.dll v6.

БЕЗ включения ComCtl32.dll v6:

  • LVNI_PREVIOUS не влияет на LVM_GETNEXTITEM/ListView_GetNextItem().
  • LVM_GETNEXTITEMINDEX/ListView_GetNextItemIndex() вообще не работают (возвращаемое значение всегда 0).

С включенным ComCtl32.dll v6:

  • LVNI_PREVIOUS работает в LVM_GETNEXTITEM/ListView_GetNextItem() как положено.
  • LVM_GETNEXTITEMINDEX/ListView_GetNextItemIndex() тоже работают.

Итак, убедитесь, что ComCtl32.dll v6 включен правильно (что вы должны сделать в любом случае, чтобы получить наилучшие впечатления от пользовательского интерфейса в Windows XP и более поздних версиях).

person Remy Lebeau    schedule 11.11.2020
comment
Кажется, у меня все еще не работает в Windows 10 с включенным ComCtl32.dll v6. Не могли бы вы поделиться своей рабочей версией сборки ОС? ListView_GetNextItem(hwndListView, -1, LVNI_PREVIOUS) всегда возвращает -1 для меня. - person Rita Han; 16.11.2020
comment
@RitaHan-MSFT Я тестировал с помощью Windows 10 1607 Build 14393.1358. Но у меня также есть XP и Win7 для тестирования. - person Remy Lebeau; 16.11.2020
comment
Спасибо. Знаете ли вы, можете ли вы выбирать элементы управления из разных версий ComCtl? Я бы хотел пока оставить 3D-кнопки, но новый календарь, на мой взгляд, намного лучше. - person Synthetic Ascension; 18.11.2020
comment
@SyntheticAscension использует для этого контексты активации. Создайте и активируйте один AC для загрузки ComCtl32 v6 и создания элемента управления Calendar, а затем создайте и активируйте другой AC для загрузки другой версии ComCtl32 и создания кнопок. - person Remy Lebeau; 18.11.2020