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


О железках:
Как владельцы iPhone могут быстро изменить фон сделанных селфи
Microsoft: Система безопасности Windows 7 устарела
Лей Джун рассказал о достижениях и планах Xiaomi
Samsung продемонстрировала преимущества технологии AMOLED
Представлен портативный ПК Gole1 Plus с сенсорным дисплеем
Топ новостей
Этично ли воскрешать умерших актёров?
Этично ли воскрешать умерших актёров?


Зеленоградские учёные создали  систему вспомогательного ...
Зеленоградские учёные создали систему вспомогательного ...


SNAPCHAT купил разработчиков
SNAPCHAT купил разработчиков


Суперкомпьютер будет управлять \
Суперкомпьютер будет управлять "умными" автомобилями


Создана батарейка, работающая на метоболизме
Создана батарейка, работающая на метоболизме


DISNEY откроет аттракцион по мотивам Аватара
DISNEY откроет аттракцион по мотивам Аватара


Поддержка сервисов CYANOGEN прекратится  в этом году
Поддержка сервисов CYANOGEN прекратится в этом году


Быстрейшие животные на грани вымирания
Быстрейшие животные на грани вымирания


Созданы искусственные стволовые клетки
Созданы искусственные стволовые клетки


Появилось устройство для передачи поцелуев
Появилось устройство для передачи поцелуев


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


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