Powerbasic Museum 2020-B

IT-Consultant: Patrice Terrier => The "Geek" corner => Topic started by: Patrice Terrier on September 26, 2008, 09:50:25 PM

Title: Animated composited Splash Screen
Post by: Patrice Terrier on September 26, 2008, 09:50:25 PM
Ray,
and others as well  ;)

Here is one example of a composited layered Splash Screen animation.

It uses 4 alphablended layers.


SUB SetImage(BYVAL hWnd AS LONG)
    LOCAL graphics, DesktopDC, hMemDC, hBmp, OldBmp, Img, imgW, imgH, ImgAttr, x, y, One AS LONG
    LOCAL rw AS RECT, bmp AS BITMAP, bi AS BITMAPINFO
    LOCAL dwp AS DWORD PTR
    LOCAL bf AS BLENDFUNCTION
    LOCAL lp, ptSrc AS POINTAPI
    LOCAL lpSize AS SIZEL
   
    STATIC LocalAlpha, LocalStepAlpha, xMove, FlipMove AS LONG   
   
    CALL GetWindowRect(hWnd, rw)
    lpSize.Cx = rw.nRight - rw.nLeft: lpSize.Cy = rw.nBottom - rw.nTop
    lp.X = rw.nLeft: lp.Y = rw.nTop

    DesktopDC = GetDC(0)
   
    '// Draw active frame to new memory DC
    hMemDC = CreateCompatibleDC(DesktopDC)
    hBmp = CreateCompatibleBitmap(DesktopDC, lpSize.Cx, lpSize.CY)
    OldBmp = SelectObject(hMemDC, hBmp)
    IF GdipCreateFromHDC(hMemDC, graphics) = 0 THEN
       CALL GdipSetInterpolationMode(graphics, 2)

       '// Draw layer 1 with respect of the z-order
       IF ImageArray(1) = 0 THEN ImageArray(1) = zLoadImageFromFile("LensCrown.png", imgW, imgH, 0)
       Img = ImageArray(1)
       IF Img THEN
          CALL GetImageSize(Img, imgW, imgH)
          CALL GdipDrawImageRectRectI(graphics, Img, x, y, imgW, imgH, 0, 0, imgW, imgH, 2, ImgAttr)
          '//CALL GdipDisposeImage(Img)
       END IF

       '// Draw layer 2 with respect of the z-order
       IF ImageArray(2) = 0 THEN ImageArray(2) = zLoadImageFromFile("LensOptical.png", imgW, imgH, 0)
       Img = ImageArray(2)
       IF Img THEN
          CALL GetImageSize(Img, imgW, imgH)
          IF LocalAlpha = 0 THEN LocalAlpha = 256
          IF LocalAlpha < 20 THEN
             LocalStepAlpha = 5
          ELSEIF LocalAlpha > 255 THEN
             LocalStepAlpha = -5
          END IF
          LocalAlpha = LocalAlpha + LocalStepAlpha

          ImgAttr = ZI_SetImageAlpha(LocalAlpha)
          CALL GdipDrawImageRectRectI(graphics, Img, 0, 0, imgW, imgH, 0, 0, imgW, imgH, 2, ImgAttr)
          '//CALL GdipDisposeImage(Img)
          imgAttr = 0
       END IF

       '// Draw layer 3 with respect of the z-order
       IF ImageArray(3) = 0 THEN ImageArray(3) = zLoadImageFromFile("LensFlare.png", imgW, imgH, 0)
       Img = ImageArray(3)
       IF Img THEN
          CALL GetImageSize(Img, imgW, imgH)
          IF FlipMove = 0 THEN
             xMove = xMove + 2
             IF xMove > 260 THEN FlipMove = -1
          ELSE
             xMove = xMove - 2
             IF xMove < 0 THEN FlipMove = 0
          END IF
          CALL GdipDrawImageRectRectI(graphics, Img, 103 + xMove, 100 + (xMove \ 2), imgW - (xMove\4), imgH - (xMove\4), 0, 0, imgW, imgH, 2, ImgAttr)
          '//CALL GdipDisposeImage(Img)
       END IF

       '// Draw layer 4 with respect of the z-order
       IF ImageArray(4) = 0 THEN ImageArray(4) = zLoadImageFromFile("LensLogo.png", imgW, imgH, 0)
       Img = ImageArray(4)
       IF Img THEN
          CALL GetImageSize(Img, imgW, imgH)
          CALL GdipDrawImageRectRectI(graphics, Img, 0, 0, imgW, imgH, 0, 0, imgW, imgH, 2, ImgAttr)
          '//CALL GdipDisposeImage(Img)
       END IF

       CALL GdipDeleteGraphics(graphics)
    END IF
   
    CALL GetObject(hBmp, sizeof(bmp), bmp)
   
    bf.BlendOp             = %AC_SRC_OVER
    bf.BlendFlags          = 0
    bf.AlphaFormat         = %AC_SRC_ALPHA '// Use source alpha
    bf.SourceConstantAlpha = 255 '//alpha
   
    CALL UpdateLayeredWindow (hWnd, DesktopDC, lp, lpSize, hMemDC, ptSrc, 0, bf, %ULW_ALPHA)
   
    CALL SelectObject(hMemDC, OldBmp)
    CALL DeleteObject(hBmp)
    CALL DeleteDC(hMemDC)
    CALL ReleaseDC(0, DesktopDC)
END SUB


Zip file updated on 08-09-2011

...
Title: Re: Animated composited Splash Screen (updated)
Post by: Patrice Terrier on September 27, 2008, 10:04:11 AM
I have updated the zip file to reduce CPU usage, loading/unloading the resource only once, using a global ImageArray() to store the image handles.

The zip file is attached to the first post of this thread.

Here is a screen shot hover BassBox (on VISTA)

(http://www.zapsolution.com/pictures/SplashBox.jpg)