рдбреЗрд▓реНрдлреА рдкрд░ рдПрдХ рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдмрдирд╛рдПрдБ

рдЫрд╡рд┐
рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИ (рдпрд╣ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рдЦрд┐рдбрд╝рдХреА рд╣реИ), рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХрдИ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдбреЗрд▓реНрдлреА рдореЗрдВ рд╕реНрдкрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдмрдирд╛рдиреЗ рдХреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рдЪреМрдХреЛрд░ рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдКрдкрд░ рдПрдХ рдЪрд┐рддреНрд░ рдЦрд┐рдВрдЪрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЪреМрдХреЛрд░ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЪрд┐рдХрдиреА рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрдВрджрд░ рдЦрд┐рдбрд╝рдХреА рд╣реИред
рдореИрдВрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рдРрд╕реА рдЦрд┐рдбрд╝рдХреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХрд┐рдирд╛рд░реЗ рдЕрд╕рдорд╛рди рдереЗ рдФрд░ рдмрджрд╕реВрд░рдд рд▓рдЧ рд░рд╣реЗ рдереЗред
рдЖрдЙрдЯрдкреБрдЯ "рд▓реЗрдпрд░реНрдб рд╡рд┐рдВрдбреЛрдЬ" (рд▓реЗрдпрд░реНрдбрд╡рд┐рдВрдбреЛ) рдерд╛ред

TSplash рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдмрдирд╛рдПрдВ (рдЪрд┐рддреНрд░: TPNGImage) рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ,
рд╢реЛ рд╕реНрдкрд▓реИрд╢, рдХреНрд▓реЛрдЬ рд╣рд┐рдбреНрд╕ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд┐рдВрдбреЛ рдХреЛ рд╕реНрддрд░рд┐рдд рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИ:
procedure TSplash.ToLayeredWindow; var BitMap: TBitMap; bf: TBlendFunction; BitmapSize: TSize; BitmapPos: TPoint; begin //    (32   , precalc  ) BitMap := TBitMap.Create; CreatePremultipliedBitmap(Bitmap,FImage); //  BlendFunction with bf do begin BlendOp := AC_SRC_OVER; BlendFlags := 0; AlphaFormat := AC_SRC_ALPHA; SourceConstantAlpha := 255; end; //   BitMap BitmapSize.cx := Bitmap.Width; BitmapSize.cy := Bitmap.Height; //   BitMap BitmapPos.X := 0; BitmapPos.Y := 0; //    SetWindowLong(SplashForm.Handle, GWL_EXSTYLE, GetWindowLong(SplashForm.Handle, GWL_EXSTYLE) + WS_EX_LAYERED); //      UpdateLayeredWindow( SplashForm.Handle, 0, nil,//pos @BitmapSize,//size bitmap.Canvas.Handle,//src @BitmapPos,//pptsrc 0, @bf, ULW_ALPHA ); BitMap.Free; end; 


CreatePremultipliedBitmap рдкреНрд░рдХреНрд░рд┐рдпрд╛ UpdateLayeredWindow рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ TPNGImage рдХреЛ 32-рдмрд┐рдЯ TBitMap рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИ:
 procedure CreatePremultipliedBitmap(DstBitMap: TBitmap; SrcPngImage: TPNGImage); type TRGBTripleArray = ARRAY[Word] of TRGBTriple; pRGBTripleArray = ^TRGBTripleArray; TRGBAArray = array[Word] of TRGBQuad; PRGBAArray = ^TRGBAArray; var x, y: Integer; TripleAlpha: Double; pColor: pRGBTripleArray; pAlpha: pbytearray; pBmp: pRGBAArray; begin DstBitMap.Height := SrcPngImage.Height; DstBitMap.Width := SrcPngImage.Width; DstBitMap.PixelFormat := pf32bit; for y := 0 to SrcPngImage.Height - 1 do begin pAlpha := SrcPngImage.AlphaScanline[y]; pColor := SrcPngImage.Scanline[y]; pBmp := DstBitMap.ScanLine[y]; for x := 0 to SrcPngImage.Width - 1 do begin pBmp[x].rgbReserved := pAlpha[x]; //     TripleAlpha := pBmp[x].rgbReserved / 255; pBmp[x].rgbBlue := byte(trunc(pColor[x].rgbtBlue * TripleAlpha)); pBmp[x].rgbGreen := byte(trunc(pColor[x].rgbtGreen * TripleAlpha)); pBmp[x].rgbRed := byte(trunc(pColor[x].rgbtRed * TripleAlpha)); end; end; end; 


TPNGImage рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдкрд╛рд░рднрд╛рд╕реА рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди-рдПрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
рдЫрд╡рд┐

рдкреВрд░реНрдг рдореЙрдбреНрдпреВрд▓ рдХреЛрдб:
 {*******************************************************} { Splash Screen Library v1.01 } { } { Copyright(c) 2006-2012 ErrorSoft } { } {      } {  () SplashScreen-   } {  } { } { ,   ,  : } { Enter256@yandex.ru } { } {*******************************************************} unit SplashScreen; interface uses Windows, PNGImage, Forms, Graphics; type TSplashForm = TForm; TSplash = class private FImage: TPNGImage; SplashForm: TSplashForm; procedure SetImage(value: TPNGImage); procedure ToLayeredWindow; public constructor Create; overload; constructor Create(Image: TPNGImage); overload; destructor Destroy; procedure Show(StayOnTop: Boolean); procedure Close; property Image: TPNGImage read FImage write SetImage; end; implementation procedure CreatePremultipliedBitmap(DstBitMap: TBitmap; SrcPngImage: TPNGImage); type TRGBTripleArray = ARRAY[Word] of TRGBTriple; pRGBTripleArray = ^TRGBTripleArray; TRGBAArray = array[Word] of TRGBQuad; PRGBAArray = ^TRGBAArray; var x, y: Integer; TripleAlpha: Double; pColor: pRGBTripleArray; pAlpha: pbytearray; pBmp: pRGBAArray; begin DstBitMap.Height := SrcPngImage.Height; DstBitMap.Width := SrcPngImage.Width; DstBitMap.PixelFormat := pf32bit; for y := 0 to SrcPngImage.Height - 1 do begin pAlpha := SrcPngImage.AlphaScanline[y]; pColor := SrcPngImage.Scanline[y]; pBmp := DstBitMap.ScanLine[y]; for x := 0 to SrcPngImage.Width - 1 do begin pBmp[x].rgbReserved := pAlpha[x]; //     TripleAlpha := pBmp[x].rgbReserved / 255; pBmp[x].rgbBlue := byte(trunc(pColor[x].rgbtBlue * TripleAlpha)); pBmp[x].rgbGreen := byte(trunc(pColor[x].rgbtGreen * TripleAlpha)); pBmp[x].rgbRed := byte(trunc(pColor[x].rgbtRed * TripleAlpha)); end; end; end; constructor TSplash.Create; begin SplashForm := TSplashForm.Create(nil); FImage := TPNGImage.Create; end; constructor TSplash.Create(Image: TPNGImage); begin SplashForm := TSplashForm.Create(nil); FImage := TPNGImage.Create; FImage.Assign(Image); end; destructor TSplash.Destroy; begin SplashForm.Free; FImage.Free end; procedure TSplash.SetImage(value: TPNGImage); begin FImage.Assign(value); end; procedure TSplash.ToLayeredWindow; var BitMap: TBitMap; bf: TBlendFunction; BitmapSize: TSize; BitmapPos: TPoint; begin //    (32   , precalc  ) BitMap := TBitMap.Create; CreatePremultipliedBitmap(Bitmap,FImage); //  BlendFunction with bf do begin BlendOp := AC_SRC_OVER; BlendFlags := 0; AlphaFormat := AC_SRC_ALPHA; SourceConstantAlpha := 255; end; //   BitMap BitmapSize.cx := Bitmap.Width; BitmapSize.cy := Bitmap.Height; //   BitMap BitmapPos.X := 0; BitmapPos.Y := 0; //    SetWindowLong(SplashForm.Handle, GWL_EXSTYLE, GetWindowLong(SplashForm.Handle, GWL_EXSTYLE) + WS_EX_LAYERED); //      UpdateLayeredWindow( SplashForm.Handle, 0, nil,//pos @BitmapSize,//size bitmap.Canvas.Handle,//src @BitmapPos,//pptsrc 0, @bf, ULW_ALPHA ); BitMap.Free; end; procedure TSplash.Show(StayOnTop: Boolean); begin //    with SplashForm do begin BorderStyle := bsNone; Width := FImage.Width; Height := FImage.Height; Position := poDesktopCenter; if StayOnTop then formstyle := fsStayOnTop; end; //   ""  ToLayeredWindow; //  SplashForm.Show; end; procedure TSplash.Close; begin SplashForm.Close; end; end. 



рдореЙрдбреНрдпреВрд▓ рдбреЗрд▓реНрдлреА рдПрдХреНрд╕рдИ рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
TSplash.zip
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдмрдирд╛ рджреЗрдЧрд╛ред

UPD: рдЕрдм рдЬрдм Show (StayOnTop: Boolean) рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдкреНрд▓реИрд╢рд╕реНрдХреНрд░реАрди рдХреЛ рд╕рднреА рд╡рд┐рдВрдбреЛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

Source: https://habr.com/ru/post/In146101/


All Articles