Не дождался ответов и решил сделал свой класс списка на основе CAcUiListCtrl.
Надо уточнить, что диалог должен работать в среде Автокада - использую ObjectARX.
Вот перечень задач, которые я хотел решить для моего списка:
- список содержит 4 столбца;
- первый столбец - наименование элемента;
- второй столбец - стиль текста элемента;
- третий столбец - цвет элемента;
- четвертый столбец - изображение некоторого состояния элемента;
Наименование элемента должно было редактироваться по месту при нажатии непосредственно на наименовании элемента.
Для редактирования стиля текста или цвета при нажатии на ячейку списка должно вызываться соответствующее окно редактирования свойства. Для выбора стиля текста сделал еще один дочерний диалог. Для выбора цвета - использовал стандартную функцию ObjectARX acedSetColorDialog. При нажатии на Image элемента должно изменяться состояние элемента. При этом необходимо, чтобы свойства можно было менять сразу для нескольких элементов списка.
Так же фокус в списке должен перемещаться по всем ячейкам при нажатии на стрелки вверх, вниз, вправо, влево.
В общем работа списка должна быть максимально похожа на работу списка свойств слоев в окне управления слоями в Автокаде.
В итоге все задачи удалось решить.
В первую очередь для моего списка переопределил функцию DrawItem для контроля рисования элементов списка. В этой функции рисовал каждую ячейку списка отдельно. Изображение свойства цвета в ячейке сделал как в окне свойств слоев - соответствующий цветной квадратик в рамке + наименование цвета. Меняющий состояние Image в столбце расположил посередине ячейки. Если вспомнить название темы, только с этого и хотел начинать. Ну а потом вошел во вкус
. Image подключал к списку через объект класса CImageList и загрузку его в список через функцию списка SetImageList.
Далее для моего списка пришлось переопределить следующие функции:
OnLButtonDown
OnRButtonDown
OnLButtonDblClk
OnRButtonDblClk
OnTimer
OnSetFocus
OnMouseWheel
OnKeyDown
OnSize
OnNcLButtonDown
OnNcRButtonDown
OnHeaderClick
Для редактирования по месту наименования элемента сделал свой класс окна редактирования на основе класса CEdit. Это окно редактирования появляется в первом столбце списка на месте редактирования наименования элемента и занимает всю ячейку списка. Встроенное свойство редактирования элементов базового списка не использовал, так как хотел расположить окно редактирования в границах ячейки списка и по завершении работы этого элемента надо было сделать еще несколько проверок на правильность ввода информации. Для окна редактирования на базе CEdit переопределил следующие функции:
OnKillFocus
PreTranslateMessage
Пришлось повозиться с разными событиями и последствиями для списка от этих событий. Работа была интересной. В результате получил нормальный рабочий список, который подчинился всем моим желаниям. Код выкладывать, наверное, нет смысла. Его слишком много. Если кому-то нужны детали, задавайте вопросы.