C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Изображения для динамически создаваемых объектов, new TImageList(Own); А изображения как?
dvv
Отправлено: 26.02.2006, 08:59


Дежурный стрелочник

Группа: Участник
Сообщений: 43



Модуль приложения не имеет формы. В нем руками описываются объекты, которые будут создаваться динамически. Один из объектов TImageList. Я хочу что-бы объект создавался динамически, а список изображений хранился внутри приложения. Это нужно для того, что бы не таскать за готовым приложением кучу иконок.

Эта задача прекрасно решается если приложение имеет стандартную форму. В этом случае объекты, которые содержатся на форме описаны в файле .DSK. Там прописываются свойства, которые мы определяем в инспекторе объектов.

Могу ли я каким-либо способом указать своему приложению, что бы он загружал картинки для объекта TImageList из .DSK-файла?

Отредактировано dvv — 26/02/2006, 09:00
Grigoriy
Отправлено: 26.02.2006, 14:29


Мастер участка

Группа: Участник
Сообщений: 381



У TImageList есть свойства

ImageList1->Add(TBitmap* Image, TBitmap* Mask);
ImageList1->AddIcon(TIcon* Image);
ImageList1->AddImages(TCustomImageList* value);
ImageList1->AddMasked(TBitmap* Image, TColor MaskColor);
ImageList1->Insert(int Index, TBitmap* Image, TBitmap* Mask);
ImageList1->InsertIcon(int index, TIcon* Image);
ImageList1->Delete(int);
dvv
Отправлено: 28.02.2006, 22:42


Дежурный стрелочник

Группа: Участник
Сообщений: 43



Или я что — то не так понимаю?
Мне нужно в приложении описать иконку. Описать какими-то кодами.
Эти коды должны быть, скорее всего, текстовыми.
Например так:

CODE

// ну как-то так, чтобы изображение картинки
//закодировать текстом, именно текстом!
TBitmap* Image="01f4550084fa741...";


И лишь только после этого использовать методы
ImageList1->Add(Image);

Grigoriy
Отправлено: 01.03.2006, 00:28


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (dvv @ 28/02/2006, 22:42)

TBitmap* Image="01f4550084fa741...";


Бред дохлого зайца...


Опять мне надо думать.
Эй кто-то может прямо сейчас ответить ?
Rius
Отправлено: 01.03.2006, 06:39


Мастер участка

Группа: Участник
Сообщений: 321



чем не подходит хранение изображений в ресурсах программы???
текстовое представление увеличит обьем данных в 2 раза.
dvv
Отправлено: 06.03.2006, 07:09


Дежурный стрелочник

Группа: Участник
Сообщений: 43



QUOTE
чем не подходит хранение изображений в ресурсах программы???

Если можно подробнее, пожалуйста.
Как из изображения получить текстовый код?
Как потом этот код присвоить TBitmap* Image=?
olegenty
Отправлено: 06.03.2006, 07:16


Ветеран

Группа: Модератор
Сообщений: 2412



поиск рулит. обсуждалось N раз, где N> 100.
Grigoriy
Отправлено: 06.03.2006, 13:46


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (olegenty @ 06/03/2006, 07:16)
поиск рулит. обсуждалось N раз, где N > 100.

сегодня буду заниматься этим вопросом.
Grigoriy
Отправлено: 10.03.2006, 08:15


Мастер участка

Группа: Участник
Сообщений: 381



И так покаместь первый вариант решения задачи уже есть.

Функция возвращает указатель на объект класса TImage.

CODE

Graphics::TBitmap* GetTextImage(AnsiString str, TFontCharset Charset1,TColor color1, int sizefont1, TFontStyles Stylef1, TFontName Namef1, TFontPitch Pitch1, TColor bkc, int &w, int &h)
{
tagSIZE s;
Graphics::TBitmap* a = new Graphics::TBitmap;
a->Canvas->Font->Color=color1;
a->Canvas->Font->Charset=Charset1;
a->Canvas->Font->Size=sizefont1;
a->Canvas->Font->Style=Stylef1;
a->Canvas->Font->Name=Namef1;
a->Canvas->Font->Pitch=Pitch1;
s=a->Canvas->TextExtent(str);
a->Canvas->Brush->Color=bkc;
a->Canvas->Brush->Style=bsSolid;
a->Width=s.cx;
a->Height=s.cy;
w=a->Width;
h=a->Height;
a->PixelFormat=pf32bit;
a->Canvas->Rectangle(0,0,a->Width,a->Height);
a->Canvas->TextOutA(0,0,str);
//a->HandleType=bmDIB;
return a;
};


Поясняю.
str — строка текста, изображение которой нужно получить
Charset1 — набор символов (может быть DEFAULT_CHARSET)
color1 — цвет выводимых символов
sizefont1 — размер шрифта в пунктах (1/72 дюйма)
Stylef1 — стиль шрифта
Namef1 — имя шрифта
Pitch1 — способ расположения букв в тексте
bkc — цвет фона изображения
w — возвращаемая ширина изображения
h — возвращаемая высота изображения

Функция возвращает указатель на объект класса TBitmap, который хранит изображение. А так же возврашается ширина и высота изображения.
Я проверял работу функции на примере
CODE

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
int w1,h1;
Graphics::TBitmap* bt1;
TFontStyles fs;
fs.Clear();
bt1=GetTextImage( "Изображение текста",DEFAULT_CHARSET,255*255,50,fs,"Times New Roman",fpVariable,255,w1,h1);
ImageList1->Height=h1;
ImageList1->Width=w1;
Image1->Width=w1;
Image1->Height=h1;
ImageList1->Add(bt1,0);
delete bt1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
ImageList1->GetBitmap(0,Image1->Picture->Bitmap);
}


Вроде не глючит...
Но вопрос в том, в каком объекте "должно быть изображение" ?
Кроме объекта TBitmap есть ещё объект TIcon.
Grigoriy
Отправлено: 10.03.2006, 08:18


Мастер участка

Группа: Участник
Сообщений: 381



И так покаместь первый вариант решения задачи уже есть.

Функция возвращает указатель на объект класса TImage.

CODE

Graphics::TBitmap* GetTextImage(AnsiString str, TFontCharset Charset1,TColor color1, int sizefont1, TFontStyles Stylef1, TFontName Namef1, TFontPitch Pitch1, TColor bkc, int &w, int &h)
{
tagSIZE s;
Graphics::TBitmap* a = new Graphics::TBitmap;
a->Canvas->Font->Color=color1;
a->Canvas->Font->Charset=Charset1;
a->Canvas->Font->Size=sizefont1;
a->Canvas->Font->Style=Stylef1;
a->Canvas->Font->Name=Namef1;
a->Canvas->Font->Pitch=Pitch1;
s=a->Canvas->TextExtent(str);
a->Canvas->Brush->Color=bkc;
a->Canvas->Brush->Style=bsSolid;
a->Width=s.cx;
a->Height=s.cy;
w=a->Width;
h=a->Height;
a->PixelFormat=pf32bit;
a->Canvas->Rectangle(0,0,a->Width,a->Height);
a->Canvas->TextOutA(0,0,str);
//a->HandleType=bmDIB;
return a;
};


Поясняю.
str — строка текста, изображение которой нужно получить
Charset1 — набор символов (может быть DEFAULT_CHARSET)
color1 — цвет выводимых символов
sizefont1 — размер шрифта в пунктах (1/72 дюйма)
Stylef1 — стиль шрифта
Namef1 — имя шрифта
Pitch1 — способ расположения букв в тексте
bkc — цвет фона изображения
w — возвращаемая ширина изображения
h — возвращаемая высота изображения

Функция возвращает указатель на объект класса TBitmap, который хранит изображение. А так же возврашается ширина и высота изображения.
Я проверял работу функции на примере
CODE

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
int w1,h1;
Graphics::TBitmap* bt1;
TFontStyles fs;
fs.Clear();
bt1=GetTextImage( "Изображение текста",DEFAULT_CHARSET,255*255,50,fs,"Times New Roman",fpVariable,255,w1,h1);
ImageList1->Height=h1;
ImageList1->Width=w1;
Image1->Width=w1;
Image1->Height=h1;
ImageList1->Add(bt1,0);
delete bt1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
ImageList1->GetBitmap(0,Image1->Picture->Bitmap);
}


Вроде не глючит...
Но вопрос в том, в каком объекте "должно быть изображение" ?
Кроме объекта TBitmap есть ещё объект TIcon.

Вернуться в Вопросы программирования в C++Builder