// AnimateStatic.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Animation.h" #include "AnimateStatic.h" #include #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAnimateStatic CAnimateStatic::CAnimateStatic() : m_nAnimationType(xtpAniRandom) , m_nAnimationDelay(500) , m_nAnimationSteps(10) { m_bAnimationFinished = FALSE; } CAnimateStatic::~CAnimateStatic() { } BEGIN_MESSAGE_MAP(CAnimateStatic, CStatic) //{{AFX_MSG_MAP(CAnimateStatic) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAnimateStatic message handlers void CAnimateStatic::OnDraw(CDC* pDC) { CDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC); CXTPBitmapDC bitmap(&dcCompatible, &m_bmpGear); BITMAP info; m_bmpGear.GetObject(sizeof(info), &info); pDC->BitBlt(0, 0, info.bmWidth, info.bmHeight, &dcCompatible, 0, 0, SRCCOPY); pDC->Draw3dRect(0, 0, info.bmWidth, info.bmHeight, 0, 0); } void CAnimateStatic::OnPaint() { CPaintDC dc(this); CXTPClientRect rClient(this); CXTPBufferDC memDC(dc, rClient, GetXtremeColor(COLOR_WINDOW)); OnDraw(&memDC); if (!m_bAnimationFinished) { // create animation device context. CXTPAnimationDC animationDC(dc, rClient, GetXtremeColor(COLOR_WINDOW)); OnDraw(&animationDC); // set animation attributes. animationDC.Animate(m_nAnimationType, m_nAnimationSteps, m_nAnimationDelay); m_bAnimationFinished = TRUE; } } void CAnimateStatic::PreSubclassWindow() { CStatic::PreSubclassWindow(); // add our custom animation handler. CXTPAnimationDC::SetCustomAnimation(CustomAnimation); m_bmpGear.LoadBitmap(IDB_CODEJOCKGEAR); } void AFX_CDECL CAnimateStatic::CustomAnimation(CRect rc, CDC* pDestDC, CDC* pSrcDC, int nType, int nSteps, int nAnimationTime) { switch (nType) { case animateNoise: { int nCount = (nAnimationTime / 100) * rc.Width() * rc.Height() / 2; for (int j = 0; j < nCount; j++) { CPoint pt(rand() % rc.Width(), rand() % rc.Height()); pDestDC->SetPixel(pt, pSrcDC->GetPixel(pt)); } } break; case animateStretch: { for (int i = 0; i < rc.Height(); i += (1 + (rc.Height() / nSteps))) { pDestDC->StretchBlt(rc.left, rc.top, rc.Width(), i, pSrcDC, 0, 0, rc.Width(), rc.Height(), SRCCOPY); Sleep(nAnimationTime / nSteps); } } break; case animateCircles: { CXTPBufferDC backDC(pDestDC->GetSafeHdc(), rc, (COLORREF)-1L); backDC.TakeSnapshot(); // copy image from screen const int nDiameter = 16; for (int i = 0; i < nSteps; i++) { double dRadius = (double)nDiameter / 1.5 * double(i + 1) / nSteps; for (int y = 0; y < rc.Height(); y++) { int yDist = abs(y % nDiameter - nDiameter / 2); for (int x = 0; x < rc.Width(); x++) { int xDist = abs(x % nDiameter - nDiameter / 2); if (sqrt((double)(yDist * yDist) + (xDist * xDist)) < dRadius) { backDC.SetPixel(x, y, pSrcDC->GetPixel(x, y)); } } } pDestDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &backDC, 0, 0, SRCCOPY); Sleep(nAnimationTime / nSteps); } } break; default: CXTPAnimationDC::DefaultAnimation(rc, pDestDC, pSrcDC, nType, nSteps, nAnimationTime); } } void CAnimateStatic::Animate() { m_bAnimationFinished = FALSE; ShowWindow(SW_HIDE); ShowWindow(SW_SHOW); }