www.pudn.com > CTableDemo.rar > Odom.cpp


// Odom.cpp : implementation file 
// 
 
#include "stdafx.h"  
#include "Odom.h" 
 
#define		IMAGE_WIDTH		16 
#define		IMAGE_HEIGHT		16 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// COdom 
 
COdom::COdom() 
{ 
	m_nNumber = 0; 
} 
 
COdom::~COdom() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(COdom, CStatic) 
	//{{AFX_MSG_MAP(COdom) 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// COdom message handlers 
 
int COdom::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CStatic::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	//	The odometer is implemented as an array of CCounter elements. 
	//	We use 16 x 16 bitmap images contained in CImageLists. 
	BOOL	success; 
	RECT	rect, 
				  ClientRect; 
 
	GetClientRect (&ClientRect); 
 
	//	Set initial speed of rotatiom 
	m_RotationRate = 30; 
 
	//	Create each counter window within the parent odometer window. 
	//	The number of windows (counters) is held in m_nCounters 
	rect.top = 0;	 
	rect.bottom = rect.top + ClientRect.bottom; 
	for (int i = 0; i < m_nCounters; i ++) 
	{ 
		rect.right = ClientRect.right - (i * IMAGE_WIDTH); 
		rect.left = rect.right - IMAGE_WIDTH; 
 
		m_Digits [i].m_TimeInterval = m_RotationRate; 
		m_Digits [i].m_RotationStyle = m_RotationStyle; 
		success = m_Digits [i].Create (NULL, WS_CHILD | WS_VISIBLE |  
															SS_BLACKFRAME | SS_BITMAP,  
															rect, this);  
		m_Digits [i].ShowWindow (SW_SHOW); 
	} 
 
	return 0; 
} 
 
void COdom::SetNumDigits (int nNum) 
{ 
	m_nCounters = nNum; 
} 
 
LRESULT COdom::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	int     i; 
	int		j = 0; 
 
	switch (message) 
	{ 
	case WM_SET_ROTATION_STYLE: 
		for (i = 0; i < m_nCounters; i ++) 
			m_Digits [i].m_RotationStyle = (int) lParam; 
		break; 
	case WM_RESET_COUNTERS: 
		//  set array elts to 0 then set digits to zero 
		ZeroNumberArray (); 
		for (i = m_nArrayDigits - 1; i >= 0; i --) 
		{ 
			m_Digits [j].SendMessage (WM_ADVANCE_COUNTER, 
																				m_DigitsArray [i], 0); 
			j ++; 
		} 
		break; 
	case WM_ADVANCE_COUNTERS: 
		if (m_nNumber) 
		{ 
			m_nArrayDigits = ParseNumberArray (); 
 
			if (m_nArrayDigits > m_nCounters) 
			{ 
				MessageBox ("Number has too many digits!", "ERROR!!", MB_OK); 
				return 0; 
			} 
 
			//	Send a message to each counter to rotate.  Send the 
			//		digit in wParam. 
			for (i = m_nArrayDigits - 1; i >= 0; i --) 
			{ 
				m_Digits [j].SendMessage (WM_ADVANCE_COUNTER, 
																				m_DigitsArray [i], 0); 
				j ++; 
			} 
		} 
		break; 
	} 
 
	return CStatic::WindowProc(message, wParam, lParam); 
} 
 
 
int COdom::ParseNumberArray () 
{ 
	//	Take the integer to be shown in the odometer and parse 
	//		it to fill digits array -- one integer per element. 
 
	TCHAR	buf [MAX_DIGITS]; 
 
	InitDigitsArray (); 
	sprintf (buf, "%d", m_nNumber); 
 
	int  j = 0; 
	int  len = strlen (buf); 
	for (int i = len - 1; i >= 0; i --) 
	{ 
		m_DigitsArray [i] = ((int) buf [i]) - 48; 
		j ++; 
	} 
 
	return len; 
} 
 
void COdom::InitDigitsArray () 
{ 
	for (int i = 0; i < m_nCounters; i ++) 
		m_DigitsArray [i] = 0; 
} 
 
void COdom::ZeroNumberArray () 
{ 
	//	Set all elts to zero 
	int	i; 
 
	for (i = 0; i < MAX_DIGITS; i ++) 
		m_DigitsArray [i] = 0; 
 
	m_nArrayDigits = m_nCounters; 
}