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


О железках:
Xiaomi Mi 5X с 5,5-дюймовым дисплеем и двойной 12-Мп основной камерой представлен официально
Meizu выпустила флагманы Pro 7 и Pro 7 Plus с дополнительным дисплеем
Microsoft: Paint жив и будет бесплатно доступен в Windows Store
Moto X4 с чипсетом Snapdragon 660 протестирован в Geekbench
Apple iPhone 7: преимущества покупки в 2017 году
Топ новостей
Samsung Galaxy J3 (2017) поступил в продажу в Европе
Samsung Galaxy J3 (2017) поступил в продажу в Европе


Samsung SM-G9600 со Snapdragon 840 замечен в Geekbench
Samsung SM-G9600 со Snapdragon 840 замечен в Geekbench


OnePlus признала ошибку с «желейной» прокруткой у OnePl ...
OnePlus признала ошибку с «желейной» прокруткой у OnePl ...


Xiaomi Mi 6 в белом цвете наконец-то поступает в продаж ...
Xiaomi Mi 6 в белом цвете наконец-то поступает в продаж ...


Определен самый неудачный смартфон Apple за всю историю
Определен самый неудачный смартфон Apple за всю историю


Самый маленький телевизор Xiaomi Mi TV получил 3C серти ...
Самый маленький телевизор Xiaomi Mi TV получил 3C серти ...


Xiaomi обещает свое присутствие почти во всех странах з ...
Xiaomi обещает свое присутствие почти во всех странах з ...


Samsung Galaxy C7 (2017) получит двойную основную камер ...
Samsung Galaxy C7 (2017) получит двойную основную камер ...


Представлен бюджетный 5-дюймовый стартфон Xolo Era 1X P ...
Представлен бюджетный 5-дюймовый стартфон Xolo Era 1X P ...


LG тихо выпустила 5,2-дюймовый смартфон Q8
LG тихо выпустила 5,2-дюймовый смартфон Q8


О софте:
"Лунная деревня" приобретает очертания
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;


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