BMI.biHeight = cy;
BMI.biPlanes = 1;
BMI.biBitCount = 32;
BMI.biCompression = BI_RGB; // No compression
BYTE * pSrcBits = NULL;
HBITMAP hbmSrc = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBits, 0, 0l);
BYTE * pSrcBackBits = NULL;
HBITMAP hbmSrcBack = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBackBits, 0, 0l);
BYTE * pDestBits = NULL;
HBITMAP hbmDest = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pDestBits, 0, 0l);
// Copy our source and destination bitmaps onto our DIBSections,
// so we can get access to their bits using the BYTE *'s we passed into CreateDIBSection
CDC dc;
dc.CreateCompatibleDC(NULL);
HBITMAP hbmpOld = (HBITMAP) ::SelectObject(dc, hbmSrc);
::BitBlt(dc, 0, 0, cx, cy, pSrcDC->GetSafeHdc(), 0, 0, SRCCOPY);
::SelectObject(dc, hbmSrcBack);
::BitBlt(dc, 0, 0, cx, cy, pDestDC->GetSafeHdc (), 0, 0, SRCCOPY);
DWORD dwTimePer = nAnimationTime / nSteps;
::SelectObject(dc, hbmDest);
for (int i = 1; i < nSteps; ++i)
{
DWORD dwTime = GetTickCount ();
AlphaBlendU(pDestBits, pSrcBackBits, cx, cy, pSrcBits, (BYTE)(255 * i / nSteps));
pDestDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &dc, 0, 0, SRCCOPY);
dwTime = GetTickCount () - dwTime;
if (dwTime < dwTimePer)
{
Sleep(dwTimePer - dwTime);
}
}
::SelectObject(dc, hbmpOld);
DeleteObject(hbmSrc);
DeleteObject(hbmSrcBack);
DeleteObject(hbmDest);
}