Inno Setup - фоновое изображение GIF? [Дубликат]

Это из-за порядка выполнения. Если вы передадите вызов функции setTimeout, функция будет выполнена немедленно, то есть функция сразу же будет помещена в стек выполнения javascript.

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

1
задан TLama 31 January 2013 в 13:02
поделиться

2 ответа

Если вы хотите иметь установщика со слайд-шоу с фоновым изображением с бесконечным воспроизведением музыкальной дорожки, вы можете сделать это, например. следующее:

  • получить последнюю версию библиотеки InnoCallback для реализации таймера слайд-шоу
  • для воспроизведения музыки, например, самая последняя копия Inno Media Player для Unicode Inno Setup

Напишите сценарий, похожий на следующий, или download the complete project , который включает все необходимые файлы, используемые в следующем коде сценария. Итак, единственное, что вам нужно сделать, - это создать его в последней версии Unicode Inno Setup.

Обратите внимание, что Inno Media Player является библиотекой Unicode, и вы можете используйте его только с версиями Inno Setup Unicode, а не с ANSI! Существует поддержка ANSI версий Inno Setup ...!

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output
BackColor=clLime
BackColor2=clYellow
WindowVisible=yes

[Files]
Source: "Image1.bmp"; Flags: dontcopy
Source: "Image2.bmp"; Flags: dontcopy
Source: "AudioFile.mp3"; Flags: dontcopy
Source: "MediaPlayer.dll"; Flags: dontcopy
Source: "InnoCallback.dll"; Flags: dontcopy

[Code]
var
  TimerID: Integer;
  SlideID: Integer;
  BackImage: TBitmapImage;
const
  EC_COMPLETE = $01;
type
  TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD);
  TDirectShowEventProc = procedure(EventCode, Param1, Param2: Integer);

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
  external 'wrapcallback@files:InnoCallback.dll stdcall';    
function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT;
  lpTimerFunc: UINT): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
  external 'KillTimer@user32.dll stdcall'; 

function DSGetLastError(var ErrorText: WideString): HRESULT;
  external 'DSGetLastError@files:mediaplayer.dll stdcall';
function DSPlayMediaFile: Boolean;
  external 'DSPlayMediaFile@files:mediaplayer.dll stdcall';
function DSStopMediaPlay: Boolean;
  external 'DSStopMediaPlay@files:mediaplayer.dll stdcall';
function DSSetVolume(Value: LongInt): Boolean;
  external 'DSSetVolume@files:mediaplayer.dll stdcall';
function DSInitializeAudioFile(FileName: WideString; 
  CallbackProc: TDirectShowEventProc): Boolean; 
  external 'DSInitializeAudioFile@files:mediaplayer.dll stdcall';

procedure OnMediaPlayerEvent(EventCode, Param1, Param2: Integer); 
begin
  if EventCode = EC_COMPLETE then
  begin
    if DSInitializeAudioFile(ExpandConstant('{tmp}\AudioFile.mp3'), 
      @OnMediaPlayerEvent) then
    begin
      DSSetVolume(-2500);
      DSPlayMediaFile;
    end;
  end;
end;

procedure OnSlideTimer(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
  SysTime: DWORD);
begin
  case SlideID of 
    0: SlideID := 1;
    1: SlideID := 0;
  end;
  BackImage.Bitmap.LoadFromFile(
    ExpandConstant('{tmp}\Image' + IntToStr(SlideID + 1) + '.bmp'));
end;

procedure StartSlideTimer;
var
  TimerCallback: LongWord;
begin
  TimerCallback := WrapTimerProc(@OnSlideTimer, 4);
  { third parameter here is the timer's timeout value in milliseconds }
  TimerID := SetTimer(0, 0, 5000, TimerCallback);
end;

procedure KillSlideTimer;
begin
  if TimerID <> 0 then 
  begin
    if KillTimer(0, TimerID) then
      TimerID := 0;
  end;
end;

procedure InitializeWizard;
var
  ErrorCode: HRESULT;
  ErrorText: WideString;   
begin
  TimerID := 0;
  SlideID := 0;
  ExtractTemporaryFile('Image1.bmp');
  ExtractTemporaryFile('Image2.bmp');
  BackImage := TBitmapImage.Create(MainForm);
  BackImage.Parent := MainForm;
  BackImage.Top := 70;
  BackImage.Left := 10;  
  BackImage.AutoSize := True;
  BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'));
  StartSlideTimer;

  ExtractTemporaryFile('AudioFile.mp3');
  if DSInitializeAudioFile(ExpandConstant('{tmp}\AudioFile.mp3'), 
    @OnMediaPlayerEvent) then
  begin
    DSSetVolume(-2500);
    DSPlayMediaFile;
  end
  else
  begin
    ErrorCode := DSGetLastError(ErrorText);
    MsgBox('TDirectShowPlayer error: ' + IntToStr(ErrorCode) + '; ' + 
      ErrorText, mbError, MB_OK);
  end;
end;

procedure DeinitializeSetup;
begin
  KillSlideTimer;
  DSStopMediaPlay;
end;

Дополнительные ресурсы:

6
ответ дан Community 20 August 2018 в 14:15
поделиться
  • 1
    Можно сказать, что до начала воспроизведения звука требуется много времени, но, пожалуйста, учтите, что это не ошибка самой библиотеки, а первая инициализация графика DirectShow. – TLama 31 January 2013 в 03:07

Создание фоновой функции:

Пробовал ли вы Графический установщик ( http://www.graphical-installer.com )?

Это профессиональное расширение Inno Setup специально для этого (создание классно выглядящих инсталляторов с фоном), поэтому создание такого установщика занимает несколько минут (кодирование не требуется).

0
ответ дан Slappy 20 August 2018 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: