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

📄 smallballview.cpp

📁 球会滚动,会碰壁反弹
💻 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 + -