AnimateStatic.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:4k
- // AnimateStatic.cpp : implementation file
- //
- #include "stdafx.h"
- #include "Animation.h"
- #include "AnimateStatic.h"
- #include <math.h>
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAnimateStatic
- CAnimateStatic::CAnimateStatic()
- : m_nAnimationType(xtWindowsDefault)
- , 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);
-
- CXTMemDC memDC(&dc, rClient, GetXtremeColor(COLOR_WINDOW));
- OnDraw(&memDC);
-
- if (!m_bAnimationFinished)
- {
- // create animation device context.
- CXTAnimationMemDC 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.
- CXTAnimationMemDC::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:
- {
- CXTMemDC backDC(pDestDC, rc, (COLORREF)-1L);
- backDC.FromDC(); // 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:
- CXTAnimationMemDC::DefaultAnimation(rc, pDestDC, pSrcDC, nType, nSteps, nAnimationTime);
- }
- }
- void CAnimateStatic::Animate()
- {
- m_bAnimationFinished = FALSE;
- ShowWindow(SW_HIDE);
- ShowWindow(SW_SHOW);
- }