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
...
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)