Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/55: Рейтинг темы: голосов - 55, средняя оценка - 4.84
0 / 0 / 1
Регистрация: 15.03.2014
Сообщений: 42

Картинки в ListBox

29.10.2014, 00:22. Показов 11497. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
ListBox1->Items->Add("Perviy");
ListBox1->Items->Add("Vtoroi");
ListBox1->Items->Add("Tretiy");
}
 
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect,
          TOwnerDrawState State)
{
    ListBox1->Canvas->StretchDraw(Rect, Image2->Picture->Graphic);
}
Получается как-то криво. И, я так понимаю - я ошибся, так как добавляю картинку ВМЕСТО текста Perviy,Vtoroi,Tretiy. А как тогда "присобачить": картинка--Текст. Что-то типа маркера списка хотел увидеть.

И можно ли в ListBox'e вставить ЕЩЕ одну картинку в строке, но с форматированием по правому краю? (Красный\зелёный кружочек, обозначающий, к примеру, статус сервера ON\OFF).

C++
1
ListBox1->Canvas->StretchDraw(Rect[B](0,0,12,12 - нельзя ничего)[/B], Image2->Picture->Graphic);
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2014, 00:22
Ответы с готовыми решениями:

При выделении строки в ListBox отображать ее в Edit, где можно отредактировать и заменить в ListBox-е
Подскажите пожалуйста как зделать задачку:При выделении строки в поле ListBox даная строка отображалась в Edit, где можна его...

Перенести данные из ListBox на форме в Listbox на PageСontrol
Доброго времени суток! Как заставить данные которые вносятся на Form в ListBox перенести на Listbox, который находится на Pagekontrol?

Возможно ли при выборе через opendialog заносить в ListBox имена файлов, а при чтении из ListBox получать путь к файлам?
Возможно ли при выборе через opendialog заносить в ListBox имена файлов, а при чтении из ListBox получать путь к файлам?

13
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
29.10.2014, 12:06
Лучший ответ Сообщение было отмечено QAQA как решение

Решение

У меня картинка размером 32*32, поэтому я везде захардкодил ее размер, если у тебя размер другой - поправь выделенные константы...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    ListBox1->Items->Add("Perviy");
    ListBox1->Items->Add("Vtoroi");
    ListBox1->Items->Add("Tretiy");
    ListBox1->Style = lbOwnerDrawVariable;
}
 
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
    TRect &Rect, TOwnerDrawState State)
{
    TListBox *lb = static_cast<TListBox*>(Control);
    TCanvas *cv = lb->Canvas;
 
    // Здесь можно изменить цвет кисти в зависимости от того, присутствует odSelected в State, или нет
    cv->FillRect(Rect);
    cv->StretchDraw(Classes::Rect(Rect.Left, Rect.Top, Rect.Left + 32 /**/,
        Rect.Top + 32 /**/), Image1->Picture->Graphic);
 
    // Здесь можешь рисовать и вторую картинку, в другом месте канвы
 
    // И выводишь текст
    String s = lb->Items->Strings[Index];
    cv->TextOut(Rect.Left + 32 /**/ + 3, Rect.Top + 16 /**/ - cv->TextHeight(s) / 2, s);
}
 
// Добавляешь вот этот обработчик
void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control, int Index,
    int &Height)
{
    Height = 32 /**/;
}
, и получаешь:
Изображения
 
2
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 00:50
а как загружать для каждого Itema свою отдельную картинку ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
24.05.2016, 09:56
Цитата Сообщение от S0lexV Посмотреть сообщение
как загружать для каждого Itema свою отдельную картинку ?
Занести картинки в ImageList, и потом по индексу отрисовываемой в данный момент строки каким-то образом выбирать нужную для этой строки картинку. Например, вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect,
          TOwnerDrawState State)
{
    TListBox *lb = static_cast<TListBox*>(Control);
    TCanvas *cv = lb->Canvas;
 
    cv->FillRect(Rect);
 
    int img = -1; // здесь будет индекс изображения, которое отрисуется в текущей строке
 
    // теперь как-то выбираем, для какой строки - какое изображение
    switch(Index)
    {
        case 0 : img = 0; break;
        case 1 :
        case 2 : img = 1; break;
        default :
            img = 0;
    }
    std::auto_ptr<TBitmap> bm(new TBitmap); // чтобы не заморачиваться с удалением
    ImageList1->GetBitmap(img, bm.get()); // вытягиваем из ImageList-а изображение, и рисуем его на канве ListBox-а
    cv->StretchDraw(Classes::Rect(Rect.Left, Rect.Top, Rect.Left + 32 /**/, Rect.Top + 32 /**/),  bm.get());
 
    // И выводим текст
    String s = lb->Items->Strings[Index];
    cv->TextOut(Rect.Left + 32 /**/ + 3, Rect.Top + 16 /**/ - cv->TextHeight(s) / 2, s);
}
Можно, чтобы не делать switch при отрисовке, просто занести в Items->Objects листбокса соответсвующий строке индекс изображения, тогда фрагмент кода перепишется вот так:
C++
1
2
3
4
    int img = reinterpret_cast<int>(lb->Items->Objects[Index]);
    std::auto_ptr<TBitmap> bm(new TBitmap);
    ImageList1->GetBitmap(img, bm.get());
    cv->StretchDraw(Classes::Rect(Rect.Left, Rect.Top, Rect.Left + 32 /**/, Rect.Top + 32 /**/),  bm.get());
0
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 14:30
C++ (Qt)
1
 ImageList1->GetBitmap(img, bm.get());
тут ошибка
[C++ Error] Unit1.cpp(46): E2294 Structure required on left side of . or .*
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
24.05.2016, 14:41
Нет тут никакой ошибки ,нормально код компилируется и работает:
Миниатюры
Картинки в ListBox  
0
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 15:26

у меня билдер 6
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
24.05.2016, 16:22
Добавь
C++
1
#include <memory>
, если этого еще не сделал, в BCB6 тоже можно пользоваться std::auto_ptr. И в следующий раз давай нормальную цитату сообщения об ошибке, а то написал
Цитата Сообщение от S0lexV Посмотреть сообщение
[C++ Error] Unit1.cpp(46): E2294 Structure required on left side of . or .*
, а то, что еще в 38-ой строке кода была ошибка - упустил.

Да, и код чуть-чуть поправь:
C++
1
    std::auto_ptr<Graphics::TBitmap> bm(new Graphics::TBitmap); // чтобы не заморачиваться с удалением
0
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 16:33
просто я код под себя переделывал, у меня одна ошибка была.
когда код без переделки тогда результат как на скриншоте

Добавлено через 27 секунд
щас попробую...
0
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 16:57

Ну вообщем то получилось, но свич просто раскидываем картинки по итемам, а мне необходимо чтобы юзер своими руками присваивал итемам картинки. Количество итемов заранее не известно
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
24.05.2016, 17:13
Ну, значит, придумай интерфейс, как дать пользователю возможность определенную картинку занести в определенную строку листбокса. И расскажи об этом, желательно - в отдельной теме (потому что эта тема - о принципиальной возможности отображения картинок в листбоксе), а реализацию твоей задумки - подскажем.
1
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 17:25
остановлюсь пока на таком ограниченном использовании т.к. задача не приоритетная, если что получиться, то напишу. В любом случае спасибо за помощь.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
24.05.2016, 18:44
Ну, тогда вот тебе черновой набросок того, как это начал бы делать я:
Вложения
Тип файла: 7z lb_images.7z (156.1 Кб, 25 просмотров)
1
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
24.05.2016, 19:10
ооо спасибо! Обязательно использую в своем проекте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2016, 19:10
Помогаю со студенческими работами здесь

Binding картинки в ListBox-е
Привет! На форме есть ListBox: &lt;ListBox Name=&quot;ListBox&quot;&gt; &lt;ListBox.ItemTemplate&gt; &lt;DataTemplate&gt; ...

Отобразить картинки из БД в listbox
Добрый вечер. Подскажите, как можно отобразить изображения из бд в listbox????

Вставка картинки в listbox
Прочитал статью: http://codingrus.jino-net.ru/art/delphi/1/19.phtml Все работает. У меня есть цикл добавления пользователя в listbox. Но...

Вывод картинки в listbox
Как в listbox вывести картинку и сбоку текст? нашел такой вариант, но не получаетса((( &lt;ListBox&gt; ...

listbox и вывод картинки из бд
И так есть у меня заполненный listbox,я сделал при выделении он выводит картинку,но если в поле нет картинки т.е (null) программа выдает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru