Столкнулся я со следующей проблемой:
Есть контрол CListViewCtrl, со стилем LVS_REPORT. Хочется заставить его при потере фокуса каким-то образом выделять последний выбранный item. Завел я значит переменную, в которой будет храниться индекс последней выбранной строки. И по NM_CUSTOMDRAW в ItemPrePaint выделяю этот item цветом.
Вопрос собственно когда и как эту переменную обновлять.
Варианты, которые я пробывал:
1. Если ее обновлять по NM_CLICK|NM_RCLICK, то в случае если пользователь нажал кнопку мыши на item'e, а отпустил в другом месте, нотификация не приходит, а собственный фокус CListViewCtrl перемещается (по WM_LBUTTONDOWN|WM_RBUTTONDOWN чтоли) -- получается рассинхронизация.
2. Если обрабатывать WM_LBUTTONDOWN, то в этот момент GetSelectedIndex возвращает еще старый индекс.
3. NM_KILLFOCUS тоже не подходит, т.к. если кликнуть в не активную область CListViewCtrl, фокус в контроле остается, NM_KILLFOCUS не приходит, выделение item'a цветом тоже отсутствует.
4. При стиле LVS_SHOWSELALWAYS ведет себя похоже на п.3.
WM_LBUTTONDOWN, то в этот момент GetSelectedIndex возвращает еще старый индекс.
G>3. NM_KILLFOCUS тоже не подходит, т.к. если кликнуть в не активную область CListViewCtrl, фокус в контроле остается, NM_KILLFOCUS не приходит, выделение item'a цветом тоже отсутствует.
G>4. При стиле LVS_SHOWSELALWAYS ведет себя похоже на п.3.
Думаю вам нужно использовать стиль LVS_SHOWSELALWAYS и отлавливать ситуацию когда теряется селекция. Например определять с помощью LVM_HITTEST попал ли юзер в айтем когда кликнул на листе или нет.
Здравствуйте, Andrey_Ponyakov, Вы писали:
A_P>Думаю вам нужно использовать стиль LVS_SHOWSELALWAYS и отлавливать ситуацию когда теряется селекция. Например определять с помощью LVM_HITTEST попал ли юзер в айтем когда кликнул на листе или нет.
Спасибо, использование ListView_HitTest в обработчике WM_LBUTTONDONW|WM_RBUTTONDOWN действительно решило проблему(получение актуального индекса выбранного айтема).
Как это ни странно, не потребовался ни LVS_SHOWSELALWAYS, ни отслеживание установки/потери фокуса.
Прошу продолжить тему , столкнулся со схожей проблемой , но мне походу хватит и GetSelectedIndex()
вот только не могу понять как выделять сам итем . Т.е. считаем что у меня есть индекс выделенного итема,
затем лист теряет фокус (я тыркаю на RADIO_BTN) и теперь как подсветить (выделить) этот итем по индексу
в настройках cтоит AlwaysShowSelection (но похоже не работает)
насчет ItemPrePaint что то не совсем понял что это .