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

Использование GDI+ для отображения анимированных GIF в установщике Inno Setup

Delphi , Мультимедиа , Микрофон

При создании установщика с помощью Inno Setup иногда возникает необходимость показать анимированный GIF-файл пользователю, чтобы обозначить, что установщик работает. Однако, Inno Setup не предоставляет стандартного способа отображения анимированных GIF. В этом случае можно воспользоваться встроенными возможностями Windows с помощью GDI+.

Для отображения анимированных GIF с помощью GDI+ в Inno Setup требуется реализовать несколько функций:

function SetTimer( hWnd, nIDEvent, uElapse, lpTimerFunc: Longword ): Longword;
external 'SetTimer@user32.dll stdcall';

function KillTimer( hWnd: HWND; uIDEvent: UINT ): BOOL;
external 'KillTimer@user32.dll stdcall';

function GdiplusStartup( var token: Longword; var inputbuf: GdiPlusStartupInput; var outputbuf: GdiplusStartupOutput ): GpStatus;
external 'GdiplusStartup@GdiPlus.dll stdcall';

function GdipCreateFromHWND( hWnd: HWND; var graphics: GpGraphics ): GpStatus;
external 'GdipCreateFromHWND@GdiPlus.dll stdcall';

function GdipLoadImageFromFile( filename: string; var image: GpImage ): GpStatus;
external 'GdipLoadImageFromFile@GdiPlus.dll stdcall';

function GdipDrawImageRect( graphics: GpGraphics; image: GpImage; x,y: single; width, height: single ): GpStatus;
external 'GdipDrawImageRect@GdiPlus.dll stdcall';

function GdipImageGetFrameDimensionsCount( image: GpImage; var count: Integer ): GpStatus;
external 'GdipImageGetFrameDimensionsCount@GdiPlus.dll stdcall';

function GdipImageGetFrameCount( image: GpImage; var dimensionID: TGuid; var count: Integer ): GpStatus;
external 'GdipImageGetFrameCount@GdiPlus.dll stdcall';

function GdipImageGetFrameDimensionsList( image: GpImage; var dimensionID: TGuid; count: Integer ): GpStatus;
external 'GdipImageGetFrameDimensionsList@GdiPlus.dll stdcall';

function GdipImageSelectActiveFrame( image: GpImage; dimensionID: TGuid; frameIndex: Integer ): GpStatus;
external 'GdipImageSelectActiveFrame@GdiPlus.dll stdcall';

Также потребуются следующие типы данных:

type
  TTimerProc = procedure( Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; SysTime: DWORD );
  GpGraphics = Longword;
  GpImage = Longword;
  Status = (
    Ok,                        {  0 }
    GenericError,              {  1 }
    InvalidParameter,          {  2 }
    OutOfMemory,               {  3 }
    ObjectBusy,                {  4 }
    InsufficientBuffer,        {  5 }
    NotImplemented,            {  6 }
    Win32Error,                {  7 }
    WrongState,                {  8 }
    Aborted,                   {  9 }
    FileNotFound,              {  10 }
    ValueOverflow,             {  11 }
    AccessDenied,              {  12 }
    UnknownImageFormat,        {  13 }
    FontFamilyNotFound,        {  14 }
    FontStyleNotFound,         {  15 }
    NotTrueTypeFont,           {  16 }
    UnsupportedGdiplusVersion, {  17 }
    GdiplusNotInitialized,     {  18 }
    PropertyNotFound,          {  19 }
    PropertyNotSupported       {  20 }
  );
  GpStatus = Status;

  GdiplusStartupInput = record
   GdiplusVersion          : Cardinal;
   DebugEventCallback      : Longword;
   SuppressBackgroundThread: BOOL;
   SuppressExternalCodecs  : BOOL;
  end;

  GdiplusStartupOutput = record
    NotificationHook  : Longword;
    NotificationUnhook: Longword;
  end;

И переменные:

  ClockImage: TPanel;
  TimerID: Integer;
  token: Longword;
  inputbuf: GdiplusStartupInput;
  outputbuf: GdiplusStartupOutput;
  graphics: GpGraphics;
  image: GpImage;
  status: GpStatus;
  count: Integer;
  dimensionID: array[ 0..1 ] of TGuid;
  iFrame: Integer;

Для инициализации GDI+ и загрузки анимированного GIF используйте следующий код:

  inputbuf.GdiplusVersion := 1;
  status := GdiplusStartup( token, inputbuf, outputbuf );
  { Assert( status ); }
  status := GdipCreateFromHWND( ClockImage.Handle, graphics );
  { Assert( status ); }
  status := GdipLoadImageFromFile( ExpandConstant( '{tmp}' ) + '\sand-clock-dribbble.gif', image );
  { Assert( status ); }
  { MsgBox( intToStr( image ), mbInformation, 1 ); }
  status := GdipDrawImageRect( graphics, image, 0, 0, ClockImage.Width, ClockImage.Height );
  { Assert( status ); }
  status := GdipImageGetFrameDimensionsCount( image, count );
  { Assert( status ); }
  { MsgBox( intToStr( count ), mbInformation, 1 ); }
  status := GdipImageGetFrameDimensionsList( image, dimensionID[ 0 ], count );
  { Assert( status ); }
  { MsgBox( intToStr( count ), mbInformation, 1 ); }
  status := GdipImageGetFrameCount( image, dimensionID[ 0 ], count );
  { Assert( status ); }
  { MsgBox( intToStr( count ), mbInformation, 1 ); }
  iFrame := 1
  status := GdipImageSelectActiveFrame( image, dimensionID[ 0 ], iFrame );

Для смены кадров анимированного GIF используйте таймер и стандартные функции GDI+:

procedure MyTimerProc( Arg1, Arg2, Arg3, Arg4: Longword );
begin
  if iFrame < count then begin
    iFrame := iFrame + 1;
  end else begin
    iFrame := 0
  end;

  status := GdipImageSelectActiveFrame( image, dimensionID[ 0 ], iFrame );
  status := GdipDrawImageRect( graphics, image, 0, 0, ClockImage.Width, ClockImage.Height );
end;

Полный исходный код доступен по ссылке: https://github.com/FiveTechSoft/mod_harbour/blob/master/windows/win64/setup/modharbour.iss

Для тестирования можно直接 скачать скомпилированный EXE по ссылке: https://github.com/FiveTechSoft/mod_harbour/actions/runs/102906695

Наслаждайтесь использованием GDI+ для отображения анимированных GIF в установщике Inno Setup!

Создано по материалам из источника по ссылке.

В этом контексте речь идет о том, как использовать GDI+ для отображения анимированных GIF в установщике Inno Setup, когда стандартных средств для этого не предусмотрено.


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

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




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


:: Главная :: Микрофон ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:06:24/0.0033590793609619/0