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 */