Artem_ButenkoЦитата: Ребята, кто ранее работал с ISSI возможно сталкивался с примером скрипта, позволяющим с каждой новой страницей выводить новый фоновый рисунок, подскажите можно ли реализовать этот эффект средствами Inno Setup, если использовать .jpeg рисунки (возможно на основе isxbb.dll)?
Вот [more=пример вывода своей картинки]
#define Files "Slides"
#define Mask "*"
#define FindHandle
#define FindResult
#sub ExtractTemporaryFolder
#emit " ExtractTemporaryFile('"+ FindGetFileName(FindHandle) +"')"
#endsub
#define LoadImageLib "ImgGdiplus.dll" ;или IPicture.dll, ImgCtx.dll - идут с программой SBRunScr, или здесь: url=http://victor-dobrov.narod.ru/ImgGdiplus.dll
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Files]
Source: {#LoadImageLib}; Flags: dontcopy noencryption
Source: {#Files}\{#Mask}; DestDir: {tmp}; Flags: dontcopy
[Code]
type hDC = Longint; TSize = record CX, CY: UInt; end; TagMonitorInfo = record cbSize: DWord; Monitor, Work: TRect; dwFlags: DWord; end;
var MonitorInfo: TagMonitorInfo; BackgroundForm: TForm; BackgroundImage: TBitmapImage; Mem: array[0..31] of Integer; i, n: Integer; FS: TFileStream; Size, PicSize: TSize;
const SRCCOPY = $CC0020;
function GetDC(Wnd: HWnd): hDC; external 'GetDC@user32 stdcall delayload';
function CreateCompatibleDC(DC: hDC): hDC; external 'CreateCompatibleDC@gdi32 stdcall delayload';
function CreateCompatibleBitmap(DC: hDC; Width, Height: Integer): HBitmap; external 'CreateCompatibleBitmap@gdi32 stdcall delayload';
function SelectObject(DC: hDC; p2: LongWord): LongWord; external 'SelectObject@gdi32 stdcall delayload';
function ReleaseDC(Wnd: HWnd; DC: hDC): Longint; external 'ReleaseDC@user32 stdcall delayload';
function DeleteDC(DC: hDC): Boolean; external 'DeleteDC@gdi32 stdcall delayload';
function LoadPicture(Sw: TSize; name: PChar): Longint; external '_LoadPicture@8@files:{#LoadImageLib} stdcall delayload';
procedure StretchImg(Image, hDC: Longint; X,Y,XE,YE, srcX,srcY,srcXE,srcYE: Integer; dwROP: DWord); external '_StretchImg@44@files:{#LoadImageLib} stdcall delayload';
procedure ReleaseImg(LoadedImage: Longint); external '_ReleaseImg@4@files:{#LoadImageLib} stdcall delayload';
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32';
function GetMonitorInfo(hMonitor: Integer; var lpMonitorInfo: TagMonitorInfo): Boolean; external 'GetMonitorInfoA@user32';
Function ReadFileTag(File, onSet: String; var Tag: String; Buffer: Integer; First: Bool): Integer; var Str: String; Ind, Len: Integer; Begin
Result:= -1; FS:= TFileStream.Create(File, fmOpenRead);
if FS.Size < Buffer then Len:= FS.Size - Length(onSet) else Len:= Buffer - Length(onSet)
for Ind:= 0 to Len do begin SetLength(Str, Length(onSet))
FS.Seek(Ind, soFromBeginning)
FS.ReadBuffer(Str, Length(Str)) // FS.Position - в следующей позиции
if Str = onSet then begin Result:= Ind; FS.ReadBuffer(Tag, Length(Tag)); if First then Break; end;
end; FS.Free;
End;
Function GetPictureSize(File: String): TSize; var Buffer: String; Begin
Result.CX:= 0; Result.CY:= 0; SetLength(Buffer, $100) { буфер чтения бинарных данных}
Case Uppercase(ExtractFileExt(File)) of
'.JPG','.JPEG': begin { тэг JFIF: #FFC2 или #FFC0}
Mem[11]:= 6; Mem[12]:= 4; { позиция значений высоты и ширины в формате MotorolaWord}
n:= ReadFileTag(File, Chr($FF)+Chr($C2), Buffer, $6000, true) { загрузить в строку данные, если заголовок тэга найден}
if n < 0 then n:= ReadFileTag(File, Chr($FF)+Chr($C1), Buffer, $4000, true)
if n < 0 then n:= ReadFileTag(File, Chr($FF)+Chr($C0), Buffer, $8000, false); end; { расширенный заголовок}
'.BMP': begin
Mem[11]:=18; Mem[12]:=22; n:= ReadFileTag(File, 'BM', Buffer, $200, true); end;
'.GIF': begin
Mem[11]:= 4; Mem[12]:= 6; n:= ReadFileTag(File,'GIF8', Buffer, $200, true); end;
'.PNG': begin
Mem[11]:=15; Mem[12]:=19; n:= ReadFileTag(File, 'PNG', Buffer, $200, true); end;
end;
if n < 0 then begin MsgBox('Unknown Picture Size!', mbError, MB_OK); end;
if (Uppercase(ExtractFileExt(File)) = '.BMP') or (Uppercase(ExtractFileExt(File)) = '.GIF') then n:= -1 else n:= 1 { для Bmp и Gif менять мл. и ст. байт}
Result.CX:= Ord(Buffer[Mem[11]]) shl 8 + Ord(Buffer[Mem[11]+n]); Result.CY:= Ord(Buffer[Mem[12]]) shl 8 + Ord(Buffer[Mem[12]+n])
End;
Procedure PictureToBitmap(Parent: TWinControl; Bitmap: TBitmapImage; File: String); var PicStream, MemDC, WinDC: hDC; tmpBitmap: HBitmap; Begin
Size.CX:= Bitmap.Width; Size.CY:= Bitmap.Height;
PicSize:= GetPictureSize(File)
PicStream:= LoadPicture(Size, File);
WinDC:= GetDC(Parent.Handle);
MemDC:= CreateCompatibleDC(WinDC);
tmpBitmap:= CreateCompatibleBitmap(WinDC, Size.CX, Size.CY);
SelectObject(MemDC, tmpBitmap); { чтобы рисовать, нужно выбрать битмап в контекст, но напрямую не рисуется, поэтому используется временный}
StretchImg(PicStream, MemDC, 0, 0, Size.CX, Size.CY, 0, 0, PicSize.CX, PicSize.CY, SRCCOPY);
Bitmap.Bitmap.Handle:= tmpBitmap;
DeleteDC(MemDC); ReleaseDC(Parent.Handle, WinDC); ReleaseImg(PicStream); Parent.Invalidate;
End;
Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;
Procedure ShowPageImage(CurPageID: Integer); var picFile, res, str, Mask: String; Begin
str:= 'jpg|jpeg|bmp|png|gif'; // WizardForm.Caption:= 'фон для этой страницы: '+ IntToStr(CurPageID) +'.'+ str
Repeat
res:=str; str:= Copy(str, Pos('|', str)+1, Length(str))
if Length(res) <= Length(str) then Mask:= res else Mask:= Copy(res, 1, Length(res) - Length(str) -1)
picFile:= AddBackslash(ExpandConstant('{tmp}')) + IntToStr(CurPageID) +'.'+ Mask
if FileExists(picFile) then begin
BackgroundImage.SetBounds(0,0, MonitorInfo.Monitor.Right, MonitorInfo.Monitor.Bottom)
PictureToBitmap(BackgroundForm, BackgroundImage, picFile);
ShowWindow(BackgroundForm.Handle, sw_ShowMaximized) // фоновое окно на полный экран
Exit; // картинка найдена, следующие можно не искать...
end ShowWindow(BackgroundForm.Handle, sw_Hide) //скрыть фон, если картинка для новой страницы не найдена
Until Length(res) = Length(str) { поиск файлов в папке выполняется для каждой маски}
End;
Procedure CurPageChanged(CurPageID: Integer);
Begin
ShowPageImage(CurPageID)
End;
Procedure InitializeWizard;
Begin
#for {FindHandle = FindResult = FindFirst(".\" + AddBackslash(Files) + Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ExtractTemporaryFolder
BackgroundForm:= TForm.Create(nil)
BackgroundForm.Caption:= WizardForm.Caption
BackgroundForm.BorderStyle:= bsNone { убрать для показа заголовка}
BackgroundForm.OnActivate:= @BackgroundOnActivate;
MonitorInfo.cbSize:= SizeOf(MonitorInfo); GetMonitorInfo(1, MonitorInfo)
BackgroundImage:= TBitmapImage.Create(BackgroundForm);
BackgroundImage.Parent:= BackgroundForm;
End;
Procedure DeinitializeSetup; Begin BackgroundForm.Free; End;
[/more] для каждой страницы, за основу взят скрипт загрузки рисунка в фоновое окно.
Грузятся картинки с расширением jpeg, gif, png, bmp. Имена файлов должны быть формата CurPageID.расширение.
Библиотека ImgGdiPlus.dll имеется в комплекте
Corona Skin или
здесь.