Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Объединение двух иконок

Delphi , Графика и Игры , ICO

Объединение двух иконок

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  I want to combine 2 icons like Windows does with 
  the links (the small arrow). 
  Can anyone tell me how that works? 
}

 function CombineIcons(FrontIcon, BackIcon: HIcon): HIcon;
 var
   WinDC: HDC;
   FrontInfo: TIconInfo;
   FrontDC: HDC;
   FrontSv: HBITMAP;
   BackInfo: TIconInfo;
   BackDC: HDC;
   BackSv: HBITMAP;
   BmpObj: tagBitmap;
 begin
   WinDC := GetDC(0);

   GetIconInfo(FrontIcon, FrontInfo);
   FrontDC := CreateCompatibleDC(WinDC);
   FrontSv := SelectObject(FrontDC, FrontInfo.hbmMask);

   GetIconInfo(BackIcon, BackInfo);
   BackDC := CreateCompatibleDC(WinDC);
   BackSv := SelectObject(BackDC, BackInfo.hbmMask);

   GetObject(FrontInfo.hbmMask, SizeOf(BmpObj), @BmpObj);
   BitBlt(BackDC, 0,0,BmpObj.bmWidth, BmpObj.bmHeight, FrontDC, 0,0,SRCAND);

   SelectObject(BackDC, BackInfo.hbmColor);
   DrawIconEx(BackDC, 0,0,FrontIcon, 0,0,0,0,DI_NORMAL);

   Result := CreateIconIndirect(BackInfo);

   SelectObject(FrontDC, FrontSv);
   DeleteDC(FrontDC);
   SelectObject(BackDC, BackSv);
   DeleteDC(BackDC);
   ReleaseDC(0,WinDC);
   DeleteObject(FrontInfo.hbmColor);
   DeleteObject(FrontInfo.hbmMask);
   DeleteObject(BackInfo.hbmColor);
   DeleteObject(BackInfo.hbmMask);
 end;

 // Remember: The icon created with this function must be destroyed with 
// DestroyIcon() function when finished using it. 

Программный код на Delphi, который комбинирует два иконки, аналогично тому, как Windows комбинирует иконки для ссылок (например, маленький стрелка). Код создает новую иконку, overlaying одну иконку на другую.

Вот шаг за шагом, что код делает:

  1. Определяет функцию CombineIcons, которая принимает два параметра - иконки (FrontIcon и BackIcon) и возвращает комбинированную иконку.
  2. Использует различные переменные для хранения handle-ов устройств контекстов (DC), масок битмапа, битмапов и других объектов.
  3. Код создает DC для передней иконки с помощью GetDC(0), которое возвращает DC основного монитора.
  4. Он получает информацию о передней иконке с помощью GetIconInfo и создает DC для маски передней иконки с помощью CreateCompatibleDC.
  5. Аналогично, он получает информацию о задней иконке и создает DC для маски задней иконки.
  6. Код использует BitBlt для комбинации двух иконок, overlaying заднюю иконку на переднюю. Используется операция SRCAND, которая копирует только пиксели из источника (задняя иконка), которые соответствуют пикселям в целевом (передней иконке) с тем же цветом.
  7. Он рисует переднюю иконку на заднюю с помощью DrawIconEx.
  8. Код создает новую иконку, вызывая CreateIconIndirect с комбинированной информацией из шагов 6 и 7.
  9. Наконец, код освобождает любые ресурсы, зарезервированные в ходе процесса (например, DC, битмапы), чтобы избежать утечек памяти.

Комментарий в конце напоминает пользователю, что созданная иконка должна быть уничтожена с помощью функции DestroyIcon после использования.

В альтернативном решении для современных версий Delphi (XE2 и позднее):

function CombineIcons(FrontIcon, BackIcon: TIcon): TIcon;
var
  IconInfo: TIconInfo;
begin
  Result := nil;

  GetIconInfo(BackIcon.Handle, IconInfo);
  IconInfo.dwFlags := ICF_OVERLAPPED;
  IconInfo.hbmMask := CreateCompatibleBitmap(GetDC(0), IconInfo.fVDevCaps.cbSize, 1);
  IconInfo.hbmColor := CreateCompatibleBitmap(GetDC(0), IconInfo.fVDevCaps.cbSize, 1);

  DrawIconEx(IconInfo.hdcAnd, 0, 0, FrontIcon.Handle, 0, 0, 0, 0, DI_NORMAL);
  Result := CreateIconIndirect(IconInfo);

  DeleteObject(IconInfo.hbmMask);
  DeleteObject(IconInfo.hbmColor);
end;

В этом альтернативном решении функция GetIconInfo используется для получения информации о задней иконке, а затем передняя иконка рисуется на ней с помощью DrawIconEx. Результатом комбинации является создание новой иконки с помощью CreateIconIndirect. Наконец, любые зарезервированные ресурсы освобождаются с помощью DeleteObject.

Объединение двух иконок в одну с использованием функции CombineIcons, которая позволяет комбинировать переднюю и заднюю части иконок Windows-стиля с помощью битблита и рисования иконки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ICO ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:55:47/0.0036811828613281/0