문제 설명
Inno Setup 설치 프로그램 이전의 시작 화면에 이미지가 표시되지 않음 (Image on a splash screen before Inno Setup installer does not display)
Inno Setup에서 설치 프로그램의 시작 화면을 만들려고 합니다. 인스톨러 시작시 2초 동안 표시되는 폼을 생성했는데 그 안에 이미지가 표시되지 않습니다.
ShowModal
기능을 사용할 때만 표시됩니다. , 하지만 2초 후에 닫히지 않습니다.
제 코드는 다음과 같습니다.
[Code]
var
SplashForm: TSetupForm;
BIRegistry: TBitmapImage;
procedure SplashScreen;
begin
SplashForm := CreateCustomForm;
SplashForm.Position := poScreenCenter;
SplashForm.BorderStyle := bsNone;
BIRegistry := TBitmapImage.Create(SplashForm);
BIRegistry.Bitmap.LoadFromFile(ExpandConstant('{tmp}\regtoexe.bmp'));
BIRegistry.Parent := SplashForm;
BIRegistry.AutoSize := True;
SplashForm.ClientHeight := BIRegistry.Height;
SplashForm.ClientWidth := BIRegistry.Width;
SplashForm.Show;
Sleep(2000);
SplashForm.Close;
end;
procedure InitializeWizard;
begin
ExtractTemporaryFile('regtoexe.bmp');
SplashScreen;
이 코드의 문제점은 무엇입니까?
참조 솔루션
방법 1:
That's because by calling Sleep
you freeze Windows message pump, so the image cannot draw.
Quick and dirty solution is to force repaint before the Sleep
:
SplashForm.Show;
SplashForm.Repaint;
Sleep(2000);
SplashForm.Close;
This is what Inno Setup Script Includes (ISSI) package was doing.
More correct way is to use the ShowModal
and have the modal window close automatically after specified time:
var
CloseSplashTimer: LongWord;
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord;
external 'SetTimer@User32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord;
external 'KillTimer@User32.dll stdcall';
procedure CloseSplashProc(
H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
begin
KillTimer(0, CloseSplashTimer);
SplashForm.Close;
end;
procedure SplashScreen;
begin
SplashForm := CreateCustomForm;
// rest of your splash window setup code
CloseSplashTimer := SetTimer(0, 0, 2000, CreateCallback(@CloseSplashProc));
SplashForm.ShowModal;
end;
Based on: MsgBox ‑ Make unclickable OK Button and change to countdown ‑ Inno Setup
(by yonni、Martin Prikryl)