Doga |
Отправлено: 24.06.2004, 16:20 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Имеется TImageList, куда, по мере необходимости, добавляются иконки (TIcon). Как определить, совпадает ли содержимое иконки с какой либо из картинок в TImageList, или нет? Чтоб не добавлять в TImageList иконки, которые там уже есть.
Вообщето способ известен:
Иконку записать в TPicture Pict1->Icon
Из TImageList получить картинку TBitmap Pict2 ( TImageList->GetBitmap(int Index, Graphics::TBitmap* Pict2); )
А потом сравнить содержимое Pict1->Bitmap и Pict2 с помощью TBitmap::ScanLine[int Row] по пикселям...
Может кто знает способ поизящнее? Может уже есть такие процедуры в VCL или в Windows API?
Отредактировано Doga — 24/06/2004, 17:23
|
|
AVC |
Отправлено: 24.06.2004, 16:42 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
А если сравнивать не по линиям а прямо по содержимому памяти? |
|
Doga |
Отправлено: 01.07.2004, 15:28 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
С Pict1->Bitmap не прошло, поскольку при инициализации Pict1->Icon через её Handle, Pict1->Bitmap соответствюющими данными из Pict1->Icon не заполняется.
CODE |
TImageList *FHolderImages; //Сюда добавляются новые иконки, их размер 16Х16
//FImageListConstCount кол-во иконок в FHolderImages перед началом добавления новых иконок
//Возвращает либо индекс новой иконки, либо индекс уже существующей, либо -1 в случае неудачи
int __fastcall THolderTreeOperator::AddNewIcon(TIcon *AIcon)
{
int Result = -1;
if (FHolderImages && AIcon)
{
int Index = FHolderImages->AddIcon(AIcon);
if (Index > -1)
{
Graphics::TBitmap *IconBitmap1 = new Graphics::TBitmap();
FHolderImages->GetBitmap(Index, IconBitmap1);
for (int k = FImageListConstCount; k < (FHolderImages->Count — 1); k++)
{
Graphics::TBitmap *IconBitmap2 = new Graphics::TBitmap();
FHolderImages->GetBitmap(k, IconBitmap2);
int y = 0;
int x = 0;
for (; y < IconBitmap1->Height; y++)
{
x = 0;
for (; x < IconBitmap1->Width; x++)
{
if (IconBitmap1->Canvas->Pixels[x][y] != IconBitmap2->Canvas->Pixels[x][y])
{
break;
}
}
if (x < 16)
{
break;
}
}
if ((x > 15) && (y > 15))
{
Result = k;
FHolderImages->Delete(Index);
}
delete IconBitmap2;
}
delete IconBitmap1;
if (Result < 0)
{
Result = Index;
}
}
}
return Result;
}
|
Может кто лучше сможет?
Отредактировано Doga — 01/07/2004, 16:32
|
|
|