Автор: Victor_Dobrov
Дата сообщения: 27.07.2008 00:45
Chanka, вот исправленный [more=скрипт загрузки jpg]
#define Background "Background.jpg"
#define LoadImageLib "ImgGdiplus.dll" ;или IPicture.dll, ImgCtx.dll - идут с программой SBRunScr, или здесь: url=http://victor-dobrov.narod.ru/ImgGdiplus.dll
[Setup]
AppName=Picture to Background
AppVerName=Picture to Background
CreateAppDir=false
OutputBaseFilename=PictureToBackground
OutputDir=.
[Files]
Source: {#Background}; Flags: dontcopy noencryption
Source: {#LoadImageLib}; Flags: dontcopy noencryption
[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; 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 BackgroundOnResize(Sender: TObject); Begin
PictureToBitmap(BackgroundForm, BackgroundImage, ExpandConstant('{tmp}\' + ExtractFileName('{#Background}')));
if WizardForm.Visible then WizardForm.Show
End;
Procedure InitializeWizard; Begin
ExtractTemporaryFile(ExtractFileName('{#Background}'));
BackgroundForm:= TForm.Create(nil)
BackgroundForm.Caption:= WizardForm.Caption
BackgroundForm.BorderStyle:= bsNone { убрать для показа заголовка}
// BackgroundForm.OnResize:= @BackgroundOnResize;
BackgroundForm.OnActivate:= @BackgroundOnActivate;
MonitorInfo.cbSize:= SizeOf(MonitorInfo); GetMonitorInfo(1, MonitorInfo)
BackgroundImage:= TBitmapImage.Create(BackgroundForm);
BackgroundImage.SetBounds(0,0, MonitorInfo.Monitor.Right, MonitorInfo.Monitor.Bottom)
BackgroundImage.Align:= alClient;
// BackgroundImage.Stretch:= True;
BackgroundImage.Enabled:= False;
BackgroundImage.Parent:= BackgroundForm;
PictureToBitmap(BackgroundForm, BackgroundImage, ExpandConstant('{tmp}\' + ExtractFileName('{#Background}')));
ShowWindow(BackgroundForm.Handle, sw_ShowMaximized) // фоновое окно на полный экран
End;
Procedure DeinitializeSetup; Begin BackgroundForm.Free; End;
[/more], укажи свою картинку в ключе Background и проверь с новым вариантом.