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

 
TImageList и TIcon, Как узнать есть ли в TImageList TIcon
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? wink.gif

Отредактировано 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

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