| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- #include "stdafx.h"
 
- #include ".\saveanimation.h"
 
- #include "PerfTimer.h"
 
- CSaveAnimation::CSaveAnimation(void)
 
- {
 
- 	m_dLeftPercent = 0;
 
- 	m_dTopPercent = 0;
 
- 	m_dRightPercent = 0;
 
- 	m_dBottomPercent = 0;
 
- 	m_dSpeed = 40;
 
- }
 
- CSaveAnimation::~CSaveAnimation(void)
 
- {
 
- }
 
- void CSaveAnimation::DoAnimation(CRect crStart, CRect crEnd, CWnd *pWnd)
 
- {
 
- 	m_crStart = crStart;
 
- 	m_crEnd = crEnd;
 
- 	long lMaxDist = GetMaxDistance();
 
- 	GetPercentages(lMaxDist);
 
- 	CDC* pDC = pWnd->GetDC();
 
- 	CRect crCur(m_crStart);
 
- 	CRect crPrev(-1, -1, -1, -1);
 
- 	MSG msg;
 
- 	double dCurLeft = crCur.left;
 
- 	double dCurTop = crCur.top;
 
- 	double dCurRight = crCur.right;
 
- 	double dCurBottom = crCur.bottom;
 
- 	CPerfTimer Timer;
 
- 	for(int i = 0; i < lMaxDist/m_dSpeed; i++)
 
- 	{	
 
- 		//don't do the first time
 
- 		if(i > 0)
 
- 		{
 
- 			//wait 20ms between paints
 
- 			while(Timer.Elapsedms() < 10)
 
- 			{
 
- 				Sleep(1);
 
- 			}
 
- 			//Remove the old focus rect
 
- 			pDC->DrawFocusRect(crPrev);
 
- 		}
 
- 		Timer.Start(TRUE);
 
- 		pDC->DrawFocusRect(crCur);
 
- 		crPrev = crCur;
 
- 		dCurLeft -= m_dLeftPercent * m_dSpeed;
 
- 		dCurTop -= m_dTopPercent * m_dSpeed;
 
- 		dCurRight -= m_dRightPercent * m_dSpeed;
 
- 		dCurBottom -= m_dBottomPercent * m_dSpeed;
 
- 		crCur.left = (int)dCurLeft;
 
- 		crCur.top = (int)dCurTop;
 
- 		crCur.right = (int)dCurRight;
 
- 		crCur.bottom = (int)dCurBottom;
 
- 		while (PeekMessage(&msg, pWnd->m_hWnd, 0, 0, PM_REMOVE))
 
- 		{
 
- 			TranslateMessage(&msg);
 
- 			DispatchMessage(&msg);
 
- 		}
 
- 	}
 
- 	//Draw one more time to remove the last focus rect
 
- 	pDC->DrawFocusRect(crPrev);
 
- 	while (PeekMessage(&msg, pWnd->m_hWnd, 0, 0, PM_REMOVE))
 
- 	{
 
- 		TranslateMessage(&msg);
 
- 		DispatchMessage(&msg);
 
- 	}
 
- 	pWnd->ReleaseDC(pDC);
 
- }
 
- long CSaveAnimation::GetMaxDistance()
 
- {
 
- 	long lMax = 0;
 
- 	if(abs(m_crStart.left - m_crEnd.left) > lMax)
 
- 		lMax = abs(m_crStart.left - m_crEnd.left);
 
- 	if(abs(m_crStart.top - m_crEnd.top) > lMax)
 
- 		lMax = abs(m_crStart.top - m_crEnd.top);
 
- 	if(abs(m_crStart.right - m_crEnd.right) > lMax)
 
- 		lMax = abs(m_crStart.right - m_crEnd.right);
 
- 	if(abs(m_crStart.bottom - m_crEnd.bottom) > lMax)
 
- 		lMax = abs(m_crStart.bottom - m_crEnd.bottom);
 
- 	return lMax;
 
- }
 
- void CSaveAnimation::GetPercentages(long lMaxDist)
 
- {
 
- 	if(lMaxDist > 0)
 
- 	{
 
- 		m_dLeftPercent = (m_crStart.left - m_crEnd.left) / (double)lMaxDist;
 
- 		m_dTopPercent = (m_crStart.top - m_crEnd.top) / (double)lMaxDist;
 
- 		m_dRightPercent = (m_crStart.right - m_crEnd.right) / (double)lMaxDist;
 
- 		m_dBottomPercent = (m_crStart.bottom - m_crEnd.bottom) / (double)lMaxDist;
 
- 	}
 
- }
 
 
  |