?? 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 + -