const
SRCCOPY = $CC0020;
HALFTONE = 4;
function StretchBlt(DestDC: LongInt; X, Y, Width, Height: Integer; SrcDC: LongInt; XSrc, YSrc, SrcWidth, SrcHeight: Integer; Rop: DWORD): Boolean; external 'StretchBlt@gdi32.dll stdcall';
function BitBlt(DestDC: LongWord; X, Y, Width, Height: Integer; SrcDC: LongWord; XSrc, YSrc: Integer; Rop: DWORD): BOOL; external 'BitBlt@gdi32 stdcall';
function SetStretchBltMode(DC: LongWord; StretchMode: Integer): Integer; external 'SetStretchBltMode@gdi32.dll stdcall';
function SetBrushOrgEx(hdc: Longint; nXOrg, nYOrg: Integer; var lppt: TPoint): BOOL; external 'SetBrushOrgEx@gdi32.dll stdcall';
procedure ResizeBMP(ABitMap: TBitmap; ANewWidth, ANewHeight: Integer);
var
tmpBmp: TBitmap;
divHeight,
divWidth: double;
pt: TPoint;
begin
tmpBmp := TBitmap.Create;
try
tmpBmp.Width := ABitMap.Width;
tmpBmp.Height := ABitMap.Height;
BitBlt(tmpBmp.Canvas.Handle, 0, 0, tmpBmp.Width, tmpBmp.Height,
ABitMap.Canvas.Handle, 0, 0, SRCCOPY);
divHeight := ABitMap.Height / ANewHeight;
divWidth := ABitMap.Width / ANewWidth;
if (divHeight = 1.0) and (divWidth = 1.0) then
begin
ANewWidth := ABitMap.Width;
ANewHeight := ABitMap.Height;
end
else if divHeight > divWidth then
begin
ANewWidth := trunc(ABitMap.Width / divHeight);
end
else
begin
ANewHeight := trunc(ABitMap.Height / divWidth);
end;
ABitMap.Width := ANewWidth;
ABitMap.Height := ANewHeight;
SetStretchBltMode(ABitMap.Canvas.Handle, HALFTONE);
SetBrushOrgEx(ABitMap.Canvas.Handle, 0, 0, pt);
StretchBlt(ABitMap.Canvas.Handle, 0, 0, ABitMap.Width, ABitMap.Height,
tmpBmp.Canvas.Handle, 0, 0, tmpBmp.Width, tmpBmp.Height, SRCCOPY);
finally
tmpBmp.Free;
end;
end;
procedure InitializeWizard();
var img: TBitmapImage;
begin
img := TBitmapImage.Create(WizardForm);
img.Parent := WizardForm.WelcomePage;
img.Bitmap.LoadFromFile('C:\Program Files (x86)\Inno Setup 5\Examples\BGImage.bmp');
img.SetBounds(ScaleX(0), ScaleY(0), ScaleX(250), ScaleY(250));
ResizeBMP(img.Bitmap, 200, 200);
end;