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;
}