Недоступные строки в ListBox
Нужно, чтобы при выборе такого запрещеного элемента, его состояние было не выбран (причем с предыдущего выбранного снимается состояние выбран, т.е. никто не выбран), но он должен получить фокус.
Ты ведь когда-то задавал подобный вопрос с MFC, я могу лишь предложить переделанный под WinAPI мой старый вариант :-)))
Я действительно спрашивал это в MFC и выбрал тогда CCheckListBox.
Сейчас в WinAPI я создал свой аналог CCheckListBox. Для этого использовал Owner Draw стиль (чтобы рисовать в каждом элементе картинку типа Check Box) и сабклассил LISTBOX (чтобы отлавливать клик мышкой на картинку и нажатие на пробел). Флаг запрещенный/разрешенный поставил в присоединяемых к элементу данных (LB_SETITEMDATA), впрочем как и состояние элемента unchecked/checked/indeterminated. А дальше, рисуя запрещенные элементы другим цветом и не обрабатывая клик мышкой на картинку и нажатие на пробел, добился нужного результата.
Честно говоря, прочитав MSDN, я догадывался что простого решения нет, но на всякий случай спросил.
LB_SETCURSEL с -1 и LB_SETCARETINDEX не дают нужного эффекта. В частности, не получится без вреда для общего дела использовать родную оконную процедуру листбокса (использую сабклассинг) для обработки клавиш PageUp/Down и Home, End. Кроме того, если поставить фокус (SETCARETINDEX), но снять выбор (LB_SETCURSEL с -1), то при следующем нажатии на клавишу выбор встанет на элемент с фокусом, т.е. туда, где его быть не должно, вместо того, чтобы встать на один из следующих элементов.
Видимо действительно простого пути нет. А сложным путем я все сделал.