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


О железках:
Honor 10 с полноэкранным дисплеем 19:9, чипом Kirin 970 и 6 ГБ оперативной памяти представлен официально
Представлен игровой смартфон Nubia Red Magic с доступным ценником
Суб-бренд Huawei представил свой первый ноутбук Honor MagicBook
Apple выпустит две версии iPhone с двумя SIM-картами в этом году
Xiaomi выпустила салфетки для протирки дисплеев
Топ новостей
Футуристический концепт флагмана Nokia X
Футуристический концепт флагмана Nokia X


Xiaomi представила зеркало заднего вида Mi Smart Rearvi ...
Xiaomi представила зеркало заднего вида Mi Smart Rearvi ...


Битва смартфонов: Honor 9 Lite vs Xiaomi Mi A1
Битва смартфонов: Honor 9 Lite vs Xiaomi Mi A1


Сравнение скорости работы iPhone X и Huawei P20 Pro
Сравнение скорости работы iPhone X и Huawei P20 Pro


Alienware представила игровые ноутбуки 15R4 и 17R5
Alienware представила игровые ноутбуки 15R4 и 17R5


Топовая версия Honor 7C поступает в продажу
Топовая версия Honor 7C поступает в продажу


Устройства Cisco массово поражаются хакерами
Устройства Cisco массово поражаются хакерами


Насколько безопасны ваши данные, когда они хранятся в о ...
Насколько безопасны ваши данные, когда они хранятся в о ...


Samsung Galaxy S9 загружает данные со скоростью более 1 ...
Samsung Galaxy S9 загружает данные со скоростью более 1 ...


Xiaomi Mi 7 Plus получит сканер отпечатков в дисплее
Xiaomi Mi 7 Plus получит сканер отпечатков в дисплее


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


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