Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Наследник TImageList   Найти похожие ветки 

 
Gero ©   (2004-08-26 22:21) [0]

Взялся я писать наследника TImageList, с целью включить в него поддержку 32-битных иконок.
Для этого нужно переписать несколько его методов, например Draw.
Задача казалась мне простой, пока я не увидел, что все методы, которые подлежат переделке, не-virtual.
Не знаю, почему парни из Borland решили сделать так, но это так.

Идеальным вариантом конечно было бы написать новый ImageList, но тогда возникнет проблема с его использованием: ведь свойство Images у компонентов не захочет принимать чужой ImageList.
Можно конечно делать OwnerDraw для всех контролов использующих ImageList, но это большой гемор.

Как в этом случае лучше всего поступить?
Очень надеюсь на вашу помощь, господа форумчане.


 
slym   (2004-08-27 06:02) [1]

procedure TCustomImageList.CreateImageList;
const
 Mask: array[Boolean] of Longint = (0, ILC_MASK);
begin
 FHandle := ImageList_Create(Width, Height, ILC_COLORDDB or Mask[Masked],
   AllocBy, AllocBy);
 if not HandleAllocated then raise EInvalidOperation.Create(SInvalidImageList);
 if FBkColor <> clNone then BkColor := FBkColor;
end;

Скопируй ImgList.pas в папку проекта
замени ILC_COLORDDB на ILC_COLOR32 и радуйся


 
Slym   (2004-08-27 07:49) [2]

Первый вариант не работает....
Нашел!!!

function TCustomImageList.InternalGetInstRes(Instance: THandle;
 ResType: TResType; Name: PChar; Width: Integer; LoadFlags: TLoadResources;
 MaskColor: TColor): Boolean;
const
 ResMap: array [TResType] of Integer = (IMAGE_BITMAP, IMAGE_CURSOR, IMAGE_ICON);
var
 hImage: HImageList;
 Flags: Integer;
begin
 Flags := 0; //замени на LR_CREATEDIBSECTION;
 if lrDefaultColor in LoadFlags then Flags := Flags or LR_DEFAULTCOLOR;
 if lrDefaultSize in LoadFlags then Flags := Flags or LR_DEFAULTSIZE;
 if lrFromFile in LoadFlags then Flags := Flags or LR_LOADFROMFILE;
 if lrMap3DColors in LoadFlags then Flags := Flags or LR_LOADMAP3DCOLORS;
 if lrTransparent in LoadFlags then Flags := Flags or LR_LOADTRANSPARENT;
 if lrMonoChrome in LoadFlags then Flags := Flags or LR_MONOCHROME;
 hImage := ImageList_LoadImage(Instance, Name, Width, AllocBy, MaskColor,
   ResMap[ResType], Flags);
 if hImage <> 0 then
 begin
   CopyImages(hImage);
   ImageList_Destroy(hImage);
   Result := True;
 end
 else Result := False;
end;


 
Gero ©   (2004-08-27 10:03) [3]


> Slym   (27.08.04 07:49)

Ну и что это?



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.039 c
6-1115955780
Delphi forever
2005-05-13 07:43
2005.08.21
Прием и отправка почты (с прикрепленными файлами)


1-1122142486
ivanick
2005-07-23 22:14
2005.08.21
Кириллица в Delphi


4-1120460219
Alex Che
2005-07-04 10:56
2005.08.21
как определить размер зерна монитора


1-1122640151
mazepa
2005-07-29 16:29
2005.08.21
io error 53


14-1122669555
Kerk
2005-07-30 00:39
2005.08.21
Что-то старею.. всего 01-45, а я уже спать хочу...