int CLCDStreamingText::AddText(LPCTSTR szText) { CLCDText* pText = new CLCDText; pText->Initialize(); pText->SetText(szText); pText->SetOrigin(GetOrigin().x, GetOrigin().y); pText->SetLogicalOrigin(GetLogicalOrigin().x, GetLogicalOrigin().y); pText->SetSize(GetWidth(), GetHeight()); pText->SetBackgroundMode(OPAQUE); LOGFONT lf; GetObject(m_hFont, sizeof(LOGFONT), &lf); pText->SetFont(lf); m_bRecalcExtent = TRUE; m_Objects.push_back(pText); if (NULL == m_pQueueHead) { m_pQueueHead = pText; } // return the zero-based index return (int)(m_Objects.size()-1); }
void CLCDScrollingText::OnDraw(CLCDGfxBase &rGfx) { if (!m_nTextLength) { return; } // calculate the scrolling distance if (-1 == m_nScrollingDistance) { CLCDText::OnDraw(rGfx); if (SCROLL_VERT == m_eScrollDir) { // determine how far we have to travel until scrolling stops m_nScrollingDistance = ((GetHeight()) >= GetVExtent().cy) ? 0 : (GetVExtent().cy - GetHeight()); SetLogicalSize(GetVExtent().cx, GetVExtent().cy); } else { // determine how far we have to travel until scrolling stops m_nScrollingDistance = ((GetWidth()) >= GetHExtent().cx) ? 0 : (GetHExtent().cx - GetWidth()); SetLogicalSize(max(GetSize().cx, GetHExtent().cx), GetHExtent().cy); } } switch(m_eState) { case STATE_START_DELAY: if (m_dwEllapsedTime > m_dwStartDelay) { m_eState = STATE_SCROLL; m_dwEllapsedTime = 0; m_dwLastUpdate = GetTickCount(); } break; case STATE_END_DELAY: if (m_dwEllapsedTime > m_dwEndDelay) { if (m_bRepeat) { ResetUpdate(); break; } m_dwEllapsedTime = 0; m_dwLastUpdate = GetTickCount(); m_eState = STATE_DONE; } break; case STATE_SCROLL: { // TODO: add some anti-aliasing on the movement // how much time has ellapsed? // given the speed, what is the total displacement? float fDistance = (float)(m_dwSpeed * m_dwEllapsedTime) / 1000.0f; m_fTotalDistance += fDistance; // we dont want the total distnace exceed our scrolling distance int nTotalOffset = min((int)m_fTotalDistance, m_nScrollingDistance); if (SCROLL_VERT == m_eScrollDir) { SetLogicalOrigin(GetLogicalOrigin().x, -1 * nTotalOffset); } else { SetLogicalOrigin(-1 * nTotalOffset, GetLogicalOrigin().y); } m_dwLastUpdate = GetTickCount(); if (nTotalOffset == m_nScrollingDistance) { m_eState = STATE_END_DELAY; } } break; case STATE_DONE: break; default: break; } CLCDText::OnDraw(rGfx); }