Как поместить битмап в 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]
);
}
|