www.pudn.com > rsdagl.rar > credits.cpp


#include 
#include "credits.h"

/////////////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CCredits, CStatic)

BEGIN_MESSAGE_MAP(CCredits, CStatic)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_DESTROY()
END_MESSAGE_MAP()


CCredits::CCredits ()
{
	m_crBackground = RGB(0, 0, 0);   // 默认的背景颜色
	m_nSpeed = CCredits::SPEED_MED;  //默认的速度
	m_nTimerID=0;
	
	m_nCurrentHeight = HT_NORMAL;
	m_nNextIndex=0;
	m_crHeading1 = RGB(255, 0, 0);   // default is red
	m_crHeading2 = RGB(255, 255, 0); // default is yellow
	m_crHeading3 = RGB(0, 255, 255); // default is cyan
	m_crNormal = RGB(255, 255, 255); // default is white
	
    //位图资源
	m_nClip=0;
	ResetContent();
	m_bBitmap = FALSE;
	m_nBmpWidth = 0;
}  
 

CCredits::~CCredits ()
{} 
 

void CCredits::Initialize ()
{ 
	if (IsWindowVisible())  
	{
		GetClientRect(&m_rcClient);
		CDC *pDC = GetDC();		
		CBrush brBackground(m_crBackground);
		pDC->FillRect(&m_rcClient, &brBackground);
		brBackground.DeleteObject();
		ReleaseDC(pDC);
		
		if (m_nTimerID > 0)
			KillTimer(m_nTimerID);
		if (m_strData.GetSize() > 0)
			m_nTimerID = SetTimer(DISPLAY_TIMER_ID, m_nSpeed, NULL);
		else
			m_nTimerID = 0;
		
		m_nNextIndex = 0;
		LoadNextLine();
	}
}  

void CCredits::OnTimer(UINT nIDEvent) 
{
	if (nIDEvent == DISPLAY_TIMER_ID) 
	{
		if (IsWindowVisible())  
		{
			ScrollWindow(0, SCROLLAMOUNT, &m_rcClient, &m_rcClient);
			m_nClip += abs(SCROLLAMOUNT);  
			UpdateWindow(); 
			if (m_nClip >= m_nCurrentHeight)
				LoadNextLine();
		}
	}
	else  
	{
		CStatic::OnTimer(nIDEvent);
	}
} 

void CCredits::OnPaint() 
{
	PAINTSTRUCT  ps;
	CDC         *pDC = BeginPaint(&ps);
	
	if (m_nTimerID == 0)  
		Initialize();
	else  
	{
		int ival = pDC->SaveDC();
		
		CRect rc(m_rcClient);
		rc.top = rc.bottom + SCROLLAMOUNT;
		
		CBrush brBackground(m_crBackground);
		pDC->FillRect(&rc, &brBackground);
		brBackground.DeleteObject();
		
		if (m_bBitmap)  
		{
			CDC memDC;
			memDC.CreateCompatibleDC(pDC);
			CBitmap *pOldBitmap = memDC.SelectObject(&m_bmpCurrent);
			pDC->BitBlt(rc.left + ((m_rcClient.right-m_nBmpWidth)/2), rc.top,
				m_nBmpWidth, abs(SCROLLAMOUNT),
				&memDC, 0, m_nClip + SCROLLAMOUNT, SRCCOPY);
			memDC.SelectObject(pOldBitmap);
		}
		else if (m_strCurrent.GetLength() > 0)  
		{
			pDC->SelectObject(&m_fntArial);
			pDC->SetTextColor(m_crColor);
			pDC->SetBkMode(TRANSPARENT);
			rc.top = rc.bottom - m_nClip;
			pDC->DrawText((LPCTSTR)m_strCurrent,
				m_strCurrent.GetLength() - m_nEscapeChar, &rc,
				DT_TOP | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE);
		}
		
		pDC->RestoreDC(ival);
	}
	EndPaint(&ps);
}  

void CCredits::OnDestroy() 
{
	ResetContent(); // kills the timer
	if (m_fntArial.GetSafeHandle())
		m_fntArial.DeleteObject();
	if (m_bmpCurrent.GetSafeHandle())
		m_bmpCurrent.DeleteObject();
	
	CStatic::OnDestroy(); // performs the object destruction
} 

enum CCredits::creditspeed CCredits::SetSpeed (enum creditspeed nSpeed)
{
	enum creditspeed nPrevSpeed = m_nSpeed;
	m_nSpeed = nSpeed;
	Initialize();
	return nPrevSpeed;
}  

COLORREF CCredits::SetColorBk (COLORREF crNew)
{
	COLORREF cr=m_crBackground;
	m_crBackground = crNew;
	Initialize();
	return cr;
}
COLORREF CCredits::SetColorH1 (COLORREF crNew)
{
	COLORREF cr=m_crHeading1;
	m_crHeading1 = crNew;
	Initialize();
	return cr;
}
COLORREF CCredits::SetColorH2 (COLORREF crNew)
{
	COLORREF cr=m_crHeading2;
	m_crHeading2 = crNew;
	Initialize();
	return cr;
}
COLORREF CCredits::SetColorH3 (COLORREF crNew)
{
	COLORREF cr=m_crHeading3;
	m_crHeading3 = crNew;
	Initialize();
	return cr;
}
COLORREF CCredits::SetColorText (COLORREF crNew)
{
	COLORREF cr=m_crNormal;
	m_crNormal = crNew;
	Initialize();
	return cr;
}


 

void CCredits::LoadNextLine ()
{
    // font variables
	BOOL      bUnderline=FALSE;
	BOOL      bItalic=FALSE;
	int       nWeight=FW_BOLD;
	
    // reset these variables
	if (m_fntArial.GetSafeHandle())
		m_fntArial.DeleteObject();
	if (m_bmpCurrent.GetSafeHandle())
		m_bmpCurrent.DeleteObject();
	m_bBitmap = FALSE;
	m_nEscapeChar=1;
	m_strCurrent = (m_strData.GetSize() > 0 ? m_strData[m_nNextIndex++] : _T(""));
	
    // get length of text
	int       nLength = m_strCurrent.GetLength(); // do this for speed
	
	if (nLength > 0) 
	{
		switch (m_strCurrent[nLength-1])  
		{
			
		default:
			m_nEscapeChar = 0;
		case CH_NORMAL:
			m_nCurrentHeight = HT_NORMAL;
			nWeight = FW_THIN;
			m_crColor = m_crNormal;
			break;
			
		case CH_HEADING1:
			bUnderline = TRUE;
			m_nCurrentHeight = HT_HEADING1;
			m_crColor = m_crHeading1;
			break;
			
		case CH_HEADING2:
			m_nCurrentHeight = HT_HEADING2;
			m_crColor = m_crHeading2;
			break;
			
		case CH_HEADING3:
			m_nCurrentHeight = HT_HEADING3;
			m_crColor = m_crHeading3;
			break;
			
		case CH_BITMAP:
			m_bBitmap = TRUE;
			
			CString   strBitmap = m_strCurrent.Left(nLength - 1);
			BITMAP    bmInfo;
			BOOL      bOK=FALSE;
			// check for specified numeric id
			if (m_strCurrent.Left(9) == _T("__RC_ID__")) {
				int nID=0; 
				
				strBitmap.Delete(0, 9);
				_stscanf((LPCTSTR)strBitmap, _T("%d"), &nID);
				bOK = m_bmpCurrent.LoadBitmap(nID);
			}
			else  
			{
				bOK = m_bmpCurrent.LoadBitmap((LPCTSTR)strBitmap);
			}
			// load the bitmap - give message on error
			if (!bOK)  
			{
				CString str; 
				str.Format(_T("Could not find bitmap resource \"%s\". "), strBitmap); 
#ifdef _DEBUG
				AfxMessageBox(str); 
#endif
				m_nCurrentHeight = 0;
			}
			else  
			{
				// get bitmap info
				m_bmpCurrent.GetObject(sizeof(BITMAP), &bmInfo);
				m_nCurrentHeight = bmInfo.bmHeight;
				m_nBmpWidth = bmInfo.bmWidth;
			}
			break;
		} /* switch */
	} /* if not empty */
	else 
	{
		// make blank line the size of normal text
		m_nCurrentHeight = HT_NORMAL;
	}
	
	if (!m_bBitmap && nLength > 0)  
	{
		// create a font
		m_fntArial.CreateFont(m_nCurrentHeight, 0, 0, 0, nWeight, bItalic,
			bUnderline, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
			CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
			VARIABLE_PITCH | 0x04 | FF_DONTCARE, (LPSTR)"Arial");
	}
    // reset current index if necessary
	if (m_nNextIndex >= m_strData.GetSize())  
	{
		m_nNextIndex = 0;
	}
    // reset clipped region and distance scrolled
	m_nClip = 0;
	
} /* CCredits::LoadNextLine */