15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как поместить битмап в List/ComboBox.

Компилятор: C++ Builder

Возможность размещать графику внутри ListBox-ов и ComboBox-ов улучшает вид Вашего приложения и позволяет сделать Ваш интерфейс легко узнаваемым. Итак, что для этого нужно:

1. Создайте форму.
2. Поместите на форму компоненты ComboBox и ListBox.
3. Измените свойства Style в ComboBox и ListBox на csOwnerDrawVariable и lbOwnerDrawVariable соответственно. Owner-Draw в TListBox или TComboBox позволяет Вам отображать в пунктах как объекты (в том числе и графику) так и строки.
4. Создайте 5 переменных типа TBitmap*.
5. Создайте функцию-обработчик для события формы OnCreate.
6. Создайте функцию-обработчик для события ComboBox-а OnDraw.
7. Создайте функцию для OnMeasureItem в ComboBox-е.
8. Освободите ресурсы в событии формы OnClose.

//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include <dir.h>
#include "Unit1.h"
//----------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
Graphics::TBitmap* bmp1;
Graphics::TBitmap* bmp2;
Graphics::TBitmap* bmp3;
Graphics::TBitmap* bmp4;
Graphics::TBitmap* bmp5;
//----------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//----------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    using Graphics::TBitmap;
    chdir("c:\\cbuilder\\Images\\Icons");
    bmp1 = new TBitmap;
    bmp1->LoadFromFile("tech16.bmp");
    bmp2 = new TBitmap;
    bmp2->LoadFromFile("Skylin16.bmp");
    bmp3 = new TBitmap;
    bmp3->LoadFromFile("chip16.bmp");
    bmp4 = new TBitmap;
    bmp4->LoadFromFile("Handsh16.bmp");
    bmp5 = new TBitmap;
    bmp5->LoadFromFile("Earth16.bmp");
    ComboBox1->Items->AddObject("Bitmap1: Tech16", bmp1);
    ComboBox1->Items->AddObject("Bitmap2: Skylin16", bmp2);
    ComboBox1->Items->AddObject("Bitmap3: Chip16", bmp3);
    ComboBox1->Items->AddObject("Bitmap4: Handsh16", bmp4);
    ComboBox1->Items->AddObject("Bitmap5: Earth16", bmp5);
    ComboBox1->ItemIndex = 0;
    ListBox1->Items->AddObject("Bitmap1: Tech16", bmp1);
    ListBox1->Items->AddObject("Bitmap2: Skylin16", bmp2);
    ListBox1->Items->AddObject("Bitmap3: Chip16", bmp3);
    ListBox1->Items->AddObject("Bitmap4: Handsh16", bmp4);
    ListBox1->Items->AddObject("Bitmap5: Earth16", bmp5);
}
//----------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
     delete bmp1;
     delete bmp2;
     delete bmp3;
     delete bmp4;
     delete bmp5;
}
//----------------------------------------------------------
void __fastcall TForm1::ComboBox1MeasureItem(TWinControl *Control, int
Index,
        int &Height)
{
    Height = 20;
}
//----------------------------------------------------------
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
        TRect &Rect, TOwnerDrawState State)
{
     using Graphics::TBitmap;
    TListBox *lb = dynamic_cast<TListBox*>(Control);
    TBitmap *Bitmap = dynamic_cast<TBitmap*>(lb->Items->Objects[Index]);
    int Offset(0);
    lb->Canvas->FillRect(Rect);
    if (Bitmap) {
        lb->Canvas->BrushCopy(
            Bounds(Rect.Left + 2, Rect.Top + 2, 
               Bitmap->Width, Bitmap->Height),
            Bitmap,
            Bounds(0, 0, Bitmap->Width, Bitmap->Height),
            clRed
        );
        Offset = Bitmap->Width + 8;
    };
    /* отображаем текст */
    lb->Canvas->TextOut(Rect.Left + Offset, Rect.Top, ListBox1->
                        Items->Strings[Index]
    );
}
//----------------------------------------------------------
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int
               Index, TRect &Rect, TOwnerDrawState State)
{
    using Graphics::TBitmap;
    TComboBox *cb = dynamic_cast<TComboBox *>(Control);
    TBitmap *Bitmap= dynamic_cast<TBitmap*>(cb->Items->Objects[Index]);
    int Offset(0);
    cb->Canvas->FillRect(Rect);
    if (Bitmap) {
        cb->Canvas->BrushCopy(
            Bounds(Rect.Left + 2, Rect.Top + 2, 
               Bitmap->Width, Bitmap->Height),
            Bitmap,
            Bounds(0, 0, Bitmap->Width, Bitmap->Height),
            clRed
        );
        Offset = Bitmap->Width + 8;
    };
    /* отображаем текст */
    cb->Canvas->TextOut(
        Rect.Left + Offset,
        Rect.Top,
        ComboBox1->Items->Strings[Index]
    );    
}