⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sinusstatic.cpp

📁 一个完整的数字硬盘录像机系统软件
💻 CPP
字号:
// SinusStatic.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "SinusStatic.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
CSinusStatic::CSinusStatic()
{
	m_bInitialized = false;
	m_bRunning		= false;
	m_nTimer			= 0;
	m_nTextPos		= 0;
	m_nSinusPos		= 0;
	m_nPixLeft		= 0;
	m_nSinusOffset = 0;
	m_nSinusSpeed = -3;

	m_pFont			= NULL;
	m_pDCScroll		= NULL;
	m_pDCSinus		= NULL;
	m_pBMScroll		= NULL;
	m_pBMSinus		= NULL;	
	
	const double rad = 2.0*3.141592654/360.0;
	int i; float f;
	for(i=0, f=0.0; i<720; i++, f+=0.5f)
		m_dSinusTable[i] = sin(rad*f);
}

CSinusStatic::~CSinusStatic()
{
	Cleanup();
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CSinusStatic, CStatic)
	//{{AFX_MSG_MAP(CSinusStatic)
	ON_WM_FONTCHANGE()
	ON_WM_SIZE()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::Initialize()
{
	ASSERT(::IsWindow(m_hWnd));
	if(m_bInitialized==true)
		return;
	CFont* pOldFont;
	CDC* pDC = GetDC();
	ASSERT(pDC);
	if(m_pFont)
		pOldFont = pDC->SelectObject(m_pFont);

	TEXTMETRIC tm;
	VERIFY(pDC->GetTextMetrics(&tm));
	m_nCharHeight = tm.tmHeight;
	m_nCharWidth  = tm.tmMaxCharWidth;

	GetClientRect(m_rcClient);

	Cleanup();
	m_pDCScroll = new CDC;
	m_pDCSinus	= new CDC;
	m_pBMScroll	= new CBitmap;
	m_pBMSinus	= new CBitmap;
	ASSERT(m_pDCScroll && m_pDCSinus && m_pBMScroll && m_pBMSinus);

	m_rcScroll.SetRect(0, 0, m_rcClient.Width()+m_nCharWidth, m_nCharHeight);
	
	VERIFY(m_pDCScroll->CreateCompatibleDC(pDC));
	VERIFY(m_pBMScroll->CreateCompatibleBitmap(pDC, m_rcScroll.Width(), m_rcScroll.Height()));
	
	m_pDCScroll->SelectObject(m_pBMScroll);
	m_pDCScroll->PatBlt(0,0,m_rcScroll.Width(),m_rcScroll.Height(),BLACKNESS);
	m_pDCScroll->SetTextColor(RGB(255,255,192));
	m_pDCScroll->SetBkColor(RGB(0,0,0));
	
	if(m_pFont)
		m_pDCScroll->SelectObject(m_pFont);
	
	VERIFY(m_pDCSinus->CreateCompatibleDC(pDC));
	VERIFY(m_pBMSinus->CreateCompatibleBitmap(pDC, m_rcClient.Width(), m_rcClient.Height()));
	
	m_pDCSinus->SelectObject(m_pBMSinus);
	m_pDCSinus->PatBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), BLACKNESS);

	ReleaseDC(pDC);
	
	if(m_pFont)
	  pDC->SelectObject(pOldFont);

	m_bInitialized = true;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::OnFontChange() 
{
	CStatic::OnFontChange();
	m_bInitialized = false;	
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::OnSize(UINT nType, int cx, int cy) 
{
	CStatic::OnSize(nType, cx, cy);
	m_bInitialized = false;	
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CALLBACK AFX_EXPORT CSinusStatic::TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{
	ASSERT(hWnd);
	CSinusStatic* pSin = (CSinusStatic*)CWnd::FromHandle(hWnd);
	pSin->Scroll();
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::SetText(LPCTSTR lpszText)
{
	m_strText = lpszText;
	m_nTextPos = 0;
	m_bInitialized = false;	
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::Start()
{
	ASSERT(::IsWindow(m_hWnd));

	if(m_bRunning)
		Stop();

	m_bRunning = true;
	Initialize();
	m_nTimer = SetTimer(1, 15, TimerProc);
	ASSERT(m_nTimer!=0);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::Stop()
{
	ASSERT(::IsWindow(m_hWnd));

	if(m_bRunning)
	{
		ASSERT(m_nTimer!=0);
		KillTimer(m_nTimer);
		m_bRunning = false;
	}
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BYTE CSinusStatic::GetNextChar()
{
	if(m_nTextPos >= m_strText.GetLength())
		m_nTextPos = 0;
	BYTE ch=(BYTE)m_strText[m_nTextPos++];
	return ch;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::Scroll()
{
	if(m_bInitialized && m_bRunning)
	{
		DoCharBlit();
		DoSinScroll();
		
		CDC* pDC = GetDC();
		pDC->BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), m_pDCSinus, 0, 0, SRCCOPY);
		ReleaseDC(pDC);
	}
	else
		Initialize();
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::DoCharBlit()
{
	if(m_nPixLeft <= 0)
	{
		CString str="";
		BYTE c = GetNextChar();
		str=c;
        if(c>160)
          str+=GetNextChar();
		m_pDCScroll->PatBlt(m_rcClient.right, m_rcScroll.top, m_rcScroll.right, m_rcScroll.bottom, BLACKNESS);
		CSize sz = m_pDCScroll->GetTextExtent(str, str.GetLength());
		m_pDCScroll->TextOut(m_rcClient.right, m_rcScroll.top, str, str.GetLength());

		m_nPixLeft = sz.cx;
	}
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::DoSinScroll()
{
	int nScrollWidth = -2;
	m_pDCScroll->BitBlt(0, 0, m_rcScroll.Width()-2, m_rcScroll.Height(), m_pDCScroll, 2, 0, SRCCOPY);
	m_pDCSinus->PatBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), BLACKNESS);
	m_nSinusPos = GetNextSinusOffset();
	for(int i=0; i<m_rcClient.Width(); i++)
	{
		double d = GetNextSinValue();
		int y = ((m_rcClient.Height() - 2*m_rcScroll.Height()) >> 1) + (m_rcScroll.Height() >> 1);
		y += (int)(d * y);
		m_pDCSinus->BitBlt(i, y, 1, y+m_rcScroll.Height(), m_pDCScroll, i, 0, SRCCOPY);
	}
	m_nPixLeft += nScrollWidth;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::OnClose() 
{
	Stop();	
	CStatic::OnClose();
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
double CSinusStatic::GetNextSinValue()
{
	if(++m_nSinusPos >= 720)
		m_nSinusPos = 0;

	return m_dSinusTable[m_nSinusPos];
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
int CSinusStatic::GetNextSinusOffset()
{
	m_nSinusOffset += m_nSinusSpeed;
	
	if(m_nSinusSpeed > 0 && m_nSinusOffset >= 720)
		m_nSinusOffset = 0;
	else if(m_nSinusSpeed < 0 && m_nSinusOffset < 0)
		m_nSinusOffset = 719;
	return m_nSinusOffset;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::SetFont(CFont * pFont)
{
	ASSERT(pFont);
	m_pFont			= pFont;
	m_nTextPos		= 0;
	m_bInitialized = false;	
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::SetSinusSpeed(int n)
{
	m_nSinusSpeed = n;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CSinusStatic::Cleanup()
{
	delete m_pDCScroll;
	delete m_pDCSinus;
	delete m_pBMScroll;
	delete m_pBMSinus;

	m_pDCScroll		= NULL;
	m_pDCSinus		= NULL;
	m_pBMScroll		= NULL;
	m_pBMSinus		= NULL;	
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -