Недоступные строчки в ListBox
От: sir171  
Дата: 08.09.06 17:58
Оценка:
Подскажите, пожалуйста, как в ListBox можно сделать некоторые строчки недоступными для выбора (запрещенными, Disable).

Нужно, чтобы при выборе такого запрещеного итема, его состояние было не выбран (причем с предыдущего выбранного снимается состояние выбран, т.е. никто не выбран), но он должен получит фокус.
Re: Недоступные строчки в ListBox
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 09.09.06 01:23
Оценка:
Hello sir171, you wrote:

> Подскажите, пожалуйста, как в ListBox можно сделать некоторые строчки недоступными для выбора (запрещенными, Disable).


Owner draw. Т.е. взять рисование элементов на себя. Особых сложностей в этом нет.

--
Всего хорошего, Слава.
Пили все, что могло гореть...
http://deadbeef.narod.ru (ICQ: 197577902)
Posted via RSDN NNTP Server 2.0
Re[2]: Недоступные строчки в ListBox
От: sir171  
Дата: 09.09.06 17:48
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Owner draw. Т.е. взять рисование элементов на себя. Особых сложностей в этом нет.


Хорошо было бы еще, чтобы элементы вели себя соответствующим образом.

В 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), то при следующем нажатии на клавишу выбор встанет на элемент с фокусом, т.е. туда, где его быть не должно, вместо того, чтобы встать на один из следующих элементов.
Видимо действительно простого пути нет. А сложным путем я все сделал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.