/ balltimeView.h : interface of the CBalltimeView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_BALLTIMEVIEW_H__1517C00C_BB30_11D5_B5B9_444553540000__INCLUDED_)
#define AFX_BALLTIMEVIEW_H__1517C00C_BB30_11D5_B5B9_444553540000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VELOCITY 5 /* pixels per move velocity */
#define BALLRAD 20 /* radius of the ball */
#define MINRAD 15 /* how close to the wall it can come */
class CBalltimeView : public CView
{
protected: // create from serialization only
CBalltimeView();
DECLARE_DYNCREATE(CBalltimeView)
// Attributes
public:
CBalltimeDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBalltimeView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
//}}AFX_VIRTUAL
// Implementation
public:
void DrawBall();
CDC* pDC;
int m_nYSize;
int m_nXSize;
BOOL m_bDrawOn;
virtual ~CBalltimeView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CBalltimeView)
afx_msg void OnShow();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in balltimeView.cpp
inline CBalltimeDoc* CBalltimeView::GetDocument()
{ return (CBalltimeDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BALLTIMEVIEW_H__1517C00C_BB30_11D5_B5B9_444553540000__INCLUDED_)
------------------------------------------------------------------------------------------
// balltimeView.cpp : implementation of the CBalltimeView class
//
#include "stdafx.h"
#include "balltime.h"
#include "balltimeDoc.h"
#include "balltimeView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBalltimeView
IMPLEMENT_DYNCREATE(CBalltimeView, CView)
BEGIN_MESSAGE_MAP(CBalltimeView, CView)
//{{AFX_MSG_MAP(CBalltimeView)
ON_COMMAND(IDM_SHOW, OnShow)
ON_WM_SIZE()
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBalltimeView construction/destruction
CBalltimeView::CBalltimeView()
{
// TODO: add construction code here
m_bDrawOn=FALSE;
}
CBalltimeView::~CBalltimeView()
{
}
BOOL CBalltimeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CBalltimeView drawing
void CBalltimeView::OnDraw(CDC* pDC)
{
CBalltimeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CBalltimeView diagnostics
#ifdef _DEBUG
void CBalltimeView::AssertValid() const
{
CView::AssertValid();
}
void CBalltimeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CBalltimeDoc* CBalltimeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBalltimeDoc)));
return (CBalltimeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBalltimeView message handlers
void CBalltimeView::OnShow()
{
// TODO: Add your command handler code here
if (m_bDrawOn)
m_bDrawOn = FALSE ; // toggle drawing on/off
else
m_bDrawOn = TRUE ;
}
void CBalltimeView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
m_nXSize = cx ;
m_nYSize = cy ;
}
int CBalltimeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(1,10,NULL);
return 0;
}
void CBalltimeView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (m_bDrawOn) DrawBall();
CView::OnTimer(nIDEvent);
}
void CBalltimeView::DrawBall()
{
/* DrawBall() draws a red ball on the window hWnd every time the */
/* function is called. The ball is BALLRAD in radius. The walls */
/* (client area size) are from 0,0 to nXSize,nYsize. The location */
/* is moved each time by VELOCITY units. The signs of the X and Y */
/* velocity terms nVelX,nVelY are reversed each time the ball gets */
/* within MINRAD units of a wall. This causes the ball to appear */
/* to bounce off the wall. We draw the ball at its old location */
/* using a white brush which effectively erases it. Then we redraw */
/* it at it's new location using a red brush */
static int bX = 2*BALLRAD, bY = 2*BALLRAD, // ball start X,Y
bVelX = VELOCITY, bVelY = VELOCITY; // X,Y velocity
// Erase the old ball
pDC = GetDC () ;
CBrush newBrush(RGB (255, 255,255));
CBrush* pOldBrush = pDC->SelectObject (&newBrush) ;
CPen newPen(PS_SOLID, 1, RGB(255,255,255));
CPen* pOldPen = pDC->SelectObject (&newPen) ;
pDC->Ellipse (bX-BALLRAD, bY-BALLRAD, bX+BALLRAD, bY+BALLRAD) ;
bX = bX + bVelX ; // compute new center X,Y of ball
bY = bY + bVelY ;
if (bY > m_nYSize) // check if user moved walls and hid ball
bY = 2 * BALLRAD ; // put the ball back at the starting...
if (bX > m_nXSize) // position if it is not going to be...
bX = 2 * BALLRAD ; // visible with the new window size
if (bY < MINRAD || m_nYSize - bY < MINRAD) // check if it hit a wall
bVelY = -1 * bVelY ; // if so, change direction
if (bX < MINRAD || m_nXSize - bX < MINRAD)
bVelX = -1 * bVelX ;
// Draw the ball in red at its new location
CBrush newBrush1(RGB (255,0,0));
CBrush* pOldBrush1 = pDC->SelectObject (&newBrush1) ;
pDC->Ellipse (bX-BALLRAD, bY-BALLRAD, bX+BALLRAD, bY+BALLRAD) ;
// get rid of pens and brushes
pDC->SelectObject (pOldBrush) ;
pDC->SelectObject (pOldBrush1) ;
pDC->SelectObject (pOldPen) ;
}
void CBalltimeView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
KillTimer(1);
}