Список CAcUiListCtrl и изображения Image.

Автор Тема: Список CAcUiListCtrl и изображения Image.  (Прочитано 3665 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Не совсем по теме ObjectARX, но прошу помочь.
В диалоге имею объект списка на базе класса CAcUiListCtrl. Необходимо в колонках списка разместить изображения вместо текста. Например, как это сделано в окне работы со слоями. В принципе все получается стандартно через использование класса CImageList и привязки его к объекту списка. Но иконки упорно не хотят выравниваться посередине колонки. Стоят только по левому краю. С текстом нет проблем - задаю для колонок значение выравнивания LVCFMT_CENTER и все в порядке. Для изображений так не получается. Копал на MSDN и в инете, но ничего вразумительного не нашел. Есть конечно вариант рисовать самому каждую ячейку, но лучше все решить стандартными методами без излишних усложнений.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Список CAcUiListCtrl и изображения Image.
« Ответ #1 : 16-06-2017, 17:34:17 »
Есть конечно вариант рисовать самому каждую ячейку, но лучше все решить стандартными методами без излишних усложнений.
Для изображений придётся делать свой контрол. Можно наверное попробовать CAcUiBitmapStatic, но я не проверял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Список CAcUiListCtrl и изображения Image.
« Ответ #2 : 16-06-2017, 17:49:24 »
Для изображений придётся делать свой контрол
Я тоже подозреваю, что придется возиться с рисованием самостоятельно. Жаль на эту рутину тратить время. Лучше бы заняться чем-нибудь полезным собственно для программы, а не для элементов управления. Если получится, то выложу код для примера другим.
Правда, может еще кто-нибудь что-нибудь насоветует.

Отмечено как Решение Baton 09-08-2017, 22:10:49

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Список CAcUiListCtrl и изображения Image.
« Ответ #3 : 09-08-2017, 22:10:44 »
Не дождался ответов и решил сделал свой класс списка на основе 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
Пришлось повозиться с разными событиями и последствиями для списка от этих событий. Работа была интересной. В результате получил нормальный рабочий список, который подчинился всем моим желаниям. Код выкладывать, наверное, нет смысла. Его слишком много. Если кому-то нужны детали, задавайте вопросы.