ads
ads
ads
ads
ads
МЕНЮ:
Главная Сотовая связь Софт Веб-мастеру Графика Железо Portable Игры Интернет Чудеса Науки Apache Delphi Drupal Flash Html Юмор Каталог ноутбуков FAQ
загрузка...


О железках:
iPhone 8 проверили на прочность
Основатель Microsoft извинился за Ctrl+Alt+Delete
Xiaomi хвастается продажей 1 млн смартфонов за 2 суток
iPhone 8 дали оценку ремонтопригодности
Panasonic представила два недорогих смартфона: Eluga Ray 500 и Eluga Ray 700
Топ новостей
Lenovo K8 Plus с 5,2-дюймовым FullHD дисплеем и двойной ...
Lenovo K8 Plus с 5,2-дюймовым FullHD дисплеем и двойной ...


LG V30 с 6-дюймовым P-OLED экраном представлен официаль ...
LG V30 с 6-дюймовым P-OLED экраном представлен официаль ...


Samsung выпустила планшет Galaxy Tab A 8.0 (2017)
Samsung выпустила планшет Galaxy Tab A 8.0 (2017)


Вместе с Mi Mix 2 компания Xiaomi представит Mi Note 3
Вместе с Mi Mix 2 компания Xiaomi представит Mi Note 3


Apple представила шумоподавляющие наушники Beats Studio ...
Apple представила шумоподавляющие наушники Beats Studio ...


Axon Multy — горизонтальная раскладушка от ZTE
Axon Multy — горизонтальная раскладушка от ZTE


Xiaomi Mi Mix 2 в рабочем состоянии замечен в Сети
Xiaomi Mi Mix 2 в рабочем состоянии замечен в Сети


Xiaomi Mi Note 3 не будет флагманом
Xiaomi Mi Note 3 не будет флагманом


Представлен смартфон Samsung Galaxy J7 Plus с двойной к ...
Представлен смартфон Samsung Galaxy J7 Plus с двойной к ...


Антивирус Google не смог выявить вирус, поразивший 20 м ...
Антивирус Google не смог выявить вирус, поразивший 20 м ...


О софте:
"Лунная деревня" приобретает очертания
BASSLET — гаджет любителей клубов
Хакеры способны взломать кардиостимуляторы
Новосибирские физики построят коллайдер
Китай изучит гравитационные волны


Age Of Comp » Delphi » Поддержка 32-х битных иконок с альфа каналом

Поддержка 32-х битных иконок с альфа каналом

Стандартный компонент TImageList входящий в состав любой версии Delphi, не поддерживает 32-х битных иконки с альфа каналом, что порой является большой проблемой при разработке графического интерфейса.

Эту проблему можно обойти созданием своего класса на основе TCustomImageList, который в свою очередь является предком стандартного TImageList. Все что нам понадобится, это переопределить метод Create в нашем новом классе:

Определяем наш новый класс

type
  T32ImageList = class(TCustomImageList)
    LibHandle: THandle;
    procedure LoadLib(LibName: string);
    procedure FreeLib;
    procedure AddIconFromLib(IconName: string);
    constructor Create(AOwner: TComponent); override;
  end;


Описываем реализацию методов класса

constructor T32ImageList.Create(AOwner: TComponent);
begin
  inherited Create(AOwner); //Вызываем родительский метод
  Create Self.Handle := ImageList_Create(
   Width, Height, ILC_COLOR32 or ILC_MASK, AllocBy, AllocBy);
  //Заменяем старый дескриптор на новый только уже
  // с поддержкой 32-х битных изображений ILC_COLOR32
  Self.LibHandle := 0; //Инициализируем дескриптор для подгрузки dll
end;  

procedure T32ImageList.LoadLib(LibName: string);
var
  HLib: THandle;
begin
  Hlib := 0;
  if LibHandle <> 0 then FreeLib;
  try
    HLib := LoadLibrary(PChar(LibName));
    if HLib = 0 then
      ShowMessage('Can not load library ' + LibName);
  finally
    LibHandle := HLib;
  end;
end;  

procedure T32ImageList.FreeLib;
begin
  if LibHandle <> 0 then FreeLibrary(LibHandle);
end;  

procedure T32ImageList.AddIconFromLib(IconName: string);
var
LIcon: TIcon;
begin
  try
    LIcon := TIcon.Create;
    LIcon.LoadFromResourceName(LibHandle, PChar(IconName));
    Self.AddIcon(LIcon);
  finally
    if LIcon.HandleAllocated then LIcon.Free;
  end;
end;


Процедуры LoadLib, FreLib и AddIconFromLib не обязательны, я их реализовал для удобной подгрузки иконок из отдельной dll библиотеки.

Пример использования класса:

Images: T32ImageList; // Глобальная переменная
procedure TForm1.LoadIcons;  // Некая процедура загрузки иконок
begin
  Images := T32ImageList.Create(Self); // Создаем наш класс
  Images.LoadLib('icons.dll'); // Подгружаем библиотеку с иконками icons.dll
  Images.AddIconFromLib('ICON_ADD'); // Добавляем иконки из icons.dll по имени
  Images.AddIconFromLib('ICON_EDIT');
  Images.AddIconFromLib('ICON_REMOVE');
  Images.FreeLib; // Выгружаем библиотеку из памяти
  MainMenu1.Images := Images; // Присваиваем наш ImageList к Главному меню.
end;


После таких не сложных манипуляций вы получите замечательные иконки в вашей программе.
Разумеется, что сами иконки должны быть в формате 32 бита и с альфа каналом.
Если вы подгружаете иконки из файлов, нужно учесть, что файл иконки может содержать в себе несколько форматов, например разных размеров 16х16, 32х32, или разных цветов 256, 16 миллионов и т.д. Для того чтобы программа знала, какого именно размера иконка вам нужна, необходимо предварительно задать размер. Что касается цветов, то тут небольшая загвоздка. Легче всего просто заранее отредактировать иконку и оставить в ней только те форматы, которые вы будите использовать.

Пример загрузки иконок из файлов:

procedure TForm1.LoadIcons;
var
TempIcon: TIcon;
begin
  Images := T32ImageList.Create(Self); // Создаем наш класс
  TempIcon := TIcon.Create; // Создаем иконку
  TempIcon.SetSize(16, 16); // Прописываем размер 16х16
  TempIcon.LoadFromFile('add.ico'); // Загружаем иконку из файла
  Images.AddIcon(TempIcon); // Добавляем иконку к списку
  TempIcon.Free; // Удаляем иконку из памяти
  MainMenu1.Images := Images; // Присваиваем наш ImageList к Главному меню.
end;


Нравится пост? Жми: