Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2013, 02:09   #1
Yar
Пользователь
 
Регистрация: 03.08.2007
Сообщений: 37
Вопрос (C++ Builder) TreeView: "дорисовать" третью иконку к записи.

Всем привет!

Как известно у компонента TreeView есть возможность в дереве поставить иконку (Image) к записи и ещё вторую иконку - StateImage. А можно ли "дорисовать" ещё одну, третью иконку, кроме Image и StateImage?
Yar вне форума Ответить с цитированием
Старый 17.05.2013, 07:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если и можно (в чем я не сомневаюсь) то придется делать отрисовку всего дерева, каждого его элементика своим кодом в событиях OnCustomDraw и OnCustomDrawItem
Я когда-то пробовал, в принципе повозится можно, но забросил это дело.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2013, 16:24   #3
Yar
Пользователь
 
Регистрация: 03.08.2007
Сообщений: 37
Счастье Я разобрался как "дорисовать" третью иконку к узлу TreeView!

Всем доброго времени суток!
Почти месяц назад я, в этой теме, задавал вопрос (см. выше). Чуть позже решение этой проблемы было найдено. И сегодня у меня есть возможность поделиться с форумчанами своим решением.
Я приношу извинения, если эта тема поднималась не раз, но всё-таки, может быть, тем людям, которые задались подобным вопросом, будет легче найти ответ на него.

Итак, как же "дорисовать" третью иконку к узлу в компоненте TreeView?
Привожу пример на С++ Builder, размер картинок 16*16 пикселей в формате BMP.

Я пытался реализовать это используя события OnCustomDraw и OnCustomDrawItem компонента TreeView для каждого узла. Но так ничего и не получилось.
Решение оказалось намного проще, чем я думал .
Нужно просто "склеить" две картинки и поместить как одну картинку в Image или StateImage узла дерева.

Что нам потребуется для реализации идеи:

1. Кладём на форму три ImageList 'а. Один для первой картинки (FirstImageList), другой для второй - SecondImageList, третий для итоговой ("склеенной") - ResultImageList. В FirstImageList и SecondImageList нужно предварительно загрузить картинки, которые мы будем склеивать.
2. Создадим динамически три переменные типа TBitmap для проведения операции "склеивания": ImOne - первая картинка, ImTwo - вторая, ImResult - итоговая ("склеенная").

Код:
Graphics::TBitmap *ImOne = new Graphics::TBitmap();
Graphics::TBitmap *ImTwo = new Graphics::TBitmap();
Graphics::TBitmap *ImResult = new Graphics::TBitmap();
3. Далее нужно создать переменные целого типа (int) для задания индексов склеиваемых картинок: IndFirstIm и IndSecondIm.

Код:
int IndFirstIm = 0;
int IndSecondIm = 0;
Теперь можно приступать к "склеиванию".
Для рисования чего-либо (картинки, например) у класса TBitmap есть Canvas. У него есть метод Draw. Вот этим методом мы сейчас воспользуемся.
1. Берём картинки из ImageList' ов по заданным индексам и присваиваем переменным ImOne и ImTwo соответственно.

Код:
FirstImageList->GetBitmap(IndFirstIm, ImOne);
SecondImageList->GetBitmap(IndSecondIm, ImTwo);
2. Для переменной с итоговой картинкой устанавливаем высоту (она равна высоте исходных картинок - 16 пикселов), а ширина - сумма длин исходных (первой и второй) картинок (16 + 16 = 32).

Код:
ImResult->Height = ImOne->Height;
ImResult->Width = ImOne->Width + ImTwo->Width;
3. Склеиваем картинки, используя метод Draw.

Код:
ImResult->Canvas->Draw(0, 0, ImOne);
ImResult->Canvas->Draw(16, 0, ImTwo);
Т.е. сначала на Canvas 'е рисуем первую картинку, а затем - вторую (координаты начала рисования второй картинки - ширина первой картинки [16]).
4. Теперь нам осталось поместить итоговую картинку в ResultImageList на белом фоне (clWhite).

Код:
ResultImageList ->AddMasked(ImResult, clWhite);
Всё, готово. Зная индекс картинки в ResultImageList мы можем поместить её Image или StateImage узла дерева.
Иллюстрацию идеи смотрите во вложении. Первая картинка - отдельная - реализует "галочку" для узла, а следующие две - "склеенные" по данному алгоритму. Итого получается три картинки. Хотя по умолчанию TreeView позволяет нарисовать для узла только две.
Приведённый выше алгоритм универсален: можно, например, склеивать неограниченное число картинок, если динамически создать массив переменных типа TBitmap.

Привожу код процедуры полностью:
Код:

Graphics::TBitmap *ImOne = new Graphics::TBitmap();
Graphics::TBitmap *ImTwo = new Graphics::TBitmap();
Graphics::TBitmap *ImResult = new Graphics::TBitmap();
        
int IndFirstIm = 0;
int IndSecondIm = 0;

FirstImageList->GetBitmap(IndFirstIm, ImOne);
SecondImageList->GetBitmap(IndSecondIm, ImTwo);

ImResult->Height = ImOne->Height;
ImResult->Width = ImOne->Width + ImTwo->Width;
ImResult->Canvas->Draw(0, 0, ImOne);
ImResult->Canvas->Draw(16, 0, ImTwo);

ResultImageList ->AddMasked(ImResult, clWhite);
Изображения
Тип файла: jpg Illustration.jpg (21.1 Кб, 115 просмотров)
Yar вне форума Ответить с цитированием
Старый 13.04.2015, 14:55   #4
sitesv
 
Регистрация: 07.06.2011
Сообщений: 7
По умолчанию вопрос

А должен ли ImageList для склеенных картинок иметь Width = 32 ?
И можно ли комбинировать в TreeView->Images отображение одной или двух картинок? Или только две должны быть?

ImageList по-умолчанию имеет ширину 16. Отображать склеенные не получается.

В TreeView->StateImages кладу визуализацию CheckBox
sitesv вне форума Ответить с цитированием
Старый 02.11.2018, 12:44   #5
Larsic
Новичок
Джуниор
 
Регистрация: 29.04.2016
Сообщений: 2
По умолчанию

Пытаюсь воспользоваться этим методом (спасибо автору!), однако выдается множество подобных ошибок (перечень неполный):
[C++ Error] Unit1.cpp(25): E2238 Multiple declaration for 'ImResult'
[C++ Error] Unit1.cpp(17): E2344 Earlier declaration of 'ImResult'
[C++ Error] Unit1.cpp(25): E2141 Declaration syntax error
[C++ Error] Unit1.cpp(22): E2451 Undefined symbol 'FirstImageList'
[C++ Error] Unit1.cpp(23): E2451 Undefined symbol 'SecondImageList'
[C++ Error] Unit1.cpp(30): E2451 Undefined symbol 'ResultImageList'
Почему так?
C++ Builder 6
Larsic вне форума Ответить с цитированием
Старый 02.11.2018, 14:47   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Потому что тупое копирование кода плохо работает.
Цитата:
[C++ Error] Unit1.cpp(25): E2238 Multiple declaration for 'ImResult'
[C++ Error] Unit1.cpp(17): E2344 Earlier declaration of 'ImResult'
[C++ Error] Unit1.cpp(25): E2141 Declaration syntax error
Зачем объявление ImResult два раза вставили? Скопировали строчки с объяснения и итоговый код вместе?

Цитата:
[C++ Error] Unit1.cpp(22): E2451 Undefined symbol 'FirstImageList'
[C++ Error] Unit1.cpp(23): E2451 Undefined symbol 'SecondImageList'
[C++ Error] Unit1.cpp(30): E2451 Undefined symbol 'ResultImageList'
Не кинули на форму и не назвали так свои имеджлисты.
p51x вне форума Ответить с цитированием
Старый 02.11.2018, 15:56   #7
Larsic
Новичок
Джуниор
 
Регистрация: 29.04.2016
Сообщений: 2
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Потому что тупое копирование кода плохо работает.
Зачем объявление ImResult два раза вставили?
Скопировали строчки с объяснения и итоговый код вместе?
Не кинули на форму и не назвали так свои имеджлисты.
Скопирован был только итоговый код, в котором нет двойных объявлений.
ИмиджЛисты на форме есть.
Larsic вне форума Ответить с цитированием
Старый 02.11.2018, 15:59   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Значит показывайте свой код
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
TreeView с CheckBox"ом для C++ Builder Freeman-c Помощь студентам 0 31.07.2012 14:00
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06