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


О железках:
Полностью глянцевый Xiaomi Mi 6 будет доступен ограниченным тиражом
Xiaomi представила трёхосевой стабилизатор для смартфонов
uTorrent сможет работать непосредственно в браузере
Безрамочный смартфон от Энди Рубина замечен на видео
Saygus V-Squared может получить чип Snapdragon 835
Топ новостей
Исследование: Приложения Android шпионят за пользовател ...
Исследование: Приложения Android шпионят за пользовател ...


Аналитик: Дешевые китайские смартфоны останутся в прошл ...
Аналитик: Дешевые китайские смартфоны останутся в прошл ...


Выпущен Huawei P10 с корпусом из 24-каратного золота
Выпущен Huawei P10 с корпусом из 24-каратного золота


Работники кибербезопастности нашли новый способ взлома  ...
Работники кибербезопастности нашли новый способ взлома ...


В ARK: Survival Evolved появились телепорты и подводные ...
В ARK: Survival Evolved появились телепорты и подводные ...


Apple заказала у Samsung 70 млн гибких OLED-дисплеев дл ...
Apple заказала у Samsung 70 млн гибких OLED-дисплеев дл ...


Калужский завод Samsung запустил линию QLED-телевизоров
Калужский завод Samsung запустил линию QLED-телевизоров


Huawei выпустила смартфон-долгожитель Enjoy 7 Plus
Huawei выпустила смартфон-долгожитель Enjoy 7 Plus


Philips презентовал новый 4G-смартфон
Philips презентовал новый 4G-смартфон


Nokia 3, 5, 6 и 3310 поступят в продажу в конце второго ...
Nokia 3, 5, 6 и 3310 поступят в продажу в конце второго ...


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


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