📄 smallballview.cpp
字号:
// SmallBallView.cpp : implementation of the CSmallBallView class
//
#include "stdafx.h"
#include "SmallBall.h"
#include "SmallBallDoc.h"
#include "SmallBallView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSmallBallView
IMPLEMENT_DYNCREATE(CSmallBallView, CView)
BEGIN_MESSAGE_MAP(CSmallBallView, CView)
//{{AFX_MSG_MAP(CSmallBallView)
ON_WM_TIMER()
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_STOP, OnStop)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSmallBallView construction/destruction
CSmallBallView::CSmallBallView()
{
m_nR = 7; //半径不要太大
m_nX = m_nR; //当前坐标X
m_nY = m_nR; //当前坐标Y
m_nMoveX = 5; //X方向平移量
m_nMoveY = 5; //Y方向平移量
}
CSmallBallView::~CSmallBallView()
{
}
BOOL CSmallBallView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSmallBallView drawing
void CSmallBallView::OnDraw(CDC* pDC)
{
CSmallBallDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
GetClientRect(&m_Rect); //获得View大小
//画线
int nOX = m_Rect.right/2, nOY=m_Rect.bottom/2;
CPen NewPen, *pOldPen;
NewPen.CreatePen(PS_SOLID,3,RGB(255,0,0));
pOldPen=pDC->SelectObject(&NewPen);
pDC->MoveTo(nOX-int(0.4*m_Rect.right), nOY);
pDC->LineTo(nOX+int(0.4*m_Rect.right), nOY);
pDC->SelectObject(pOldPen);
NewPen.DeleteObject();
//画一个起始小球
pDC->SetROP2(R2_XORPEN); //使用异或笔
pDC->Ellipse(m_nX-m_nR, m_nY-m_nR, m_nX+m_nR, m_nY+m_nR);
}
/////////////////////////////////////////////////////////////////////////////
// CSmallBallView printing
BOOL CSmallBallView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSmallBallView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSmallBallView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CSmallBallView diagnostics
#ifdef _DEBUG
void CSmallBallView::AssertValid() const
{
CView::AssertValid();
}
void CSmallBallView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSmallBallDoc* CSmallBallView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSmallBallDoc)));
return (CSmallBallDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSmallBallView message handlers
void CSmallBallView::OnTimer(UINT nIDEvent)
{
if(nIDEvent!=1) return; //若不是ID=1的计时器发出的消息则返回
CDC* pDC=GetDC(); //得到 PDC
pDC->SetROP2(R2_XORPEN); //使用异或笔
//擦掉前一个小球
pDC->Ellipse(m_nX-m_nR, m_nY-m_nR, m_nX+m_nR, m_nY+m_nR);
//----------------------------------------------------------------------
// 上面这条语句也可以用下面的这条语句代替, 每次调用InvalidateRect
// 都会发出WM_PAINT消息,调用OnDraw函数清除指定矩形区域
// InvalidateRect(new CRect(m_nX-m_nR, m_nY-m_nR, m_nX+m_nR, m_nY+m_nR));
//----------------------------------------------------------------------
//如果碰到View的边框,则反弹(入射角和反射角相同)
if(m_nX==m_nR || m_nX==m_Rect.right-m_nR) m_nMoveX = -m_nMoveX;
if(m_nY==m_nR || m_nY==m_Rect.bottom-m_nR) m_nMoveY = -m_nMoveY;
//计算小球新坐标
m_nX = m_nX + m_nMoveX;
m_nY = m_nY + m_nMoveY;
//处理计算后新坐标的特殊情况
if(m_nX<m_nR) m_nX = m_nR; // X坐标
else if(m_nX>m_Rect.right-m_nR) m_nX = m_Rect.right-m_nR;
if(m_nY<m_nR) m_nY = m_nR; // Y坐标
else if(m_nY>m_Rect.bottom-m_nR) m_nY = m_Rect.bottom-m_nR;
//画新小球
pDC->Ellipse(m_nX-m_nR, m_nY-m_nR, m_nX+m_nR, m_nY+m_nR);
CView::OnTimer(nIDEvent);
}
void CSmallBallView::OnStart()
{
SetTimer(1,100,NULL);
}
void CSmallBallView::OnStop()
{
KillTimer(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -