www.pudn.com > BallMove.rar > BallMoveView.cpp
// BallMoveView.cpp : CBallMoveView 类的实现
//
#include "stdafx.h"
#include "BallMove.h"
#include "BallMoveDoc.h"
#include "BallMoveView.h"
#include ".\ballmoveview.h"
#include "IniDialog.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CBallMoveView
IMPLEMENT_DYNCREATE(CBallMoveView, CView)
BEGIN_MESSAGE_MAP(CBallMoveView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_COMMAND(ID_INI, OnIni)
ON_WM_TIMER()
ON_COMMAND(ID_ONMOVE, OnOnmove)
ON_COMMAND(ID_SAVE, OnSave)
END_MESSAGE_MAP()
// CBallMoveView 构造/析构
CBallMoveView::CBallMoveView()
{
// x=0;
y=0;
t=0;
}
CBallMoveView::~CBallMoveView()
{
}
BOOL CBallMoveView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CView::PreCreateWindow(cs);
}
// CBallMoveView 绘制
void CBallMoveView::OnDraw(CDC* pDC)
{
CBallMoveDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->Rectangle(10,500,800,502); //画地面
pDC->Ellipse(pDoc->m_top.x,pDoc->m_top.y,pDoc->m_bottom.x,pDoc->m_bottom.y);//画小球,每个时钟间隔位置发生变化
int index=pDoc->GetDrawNumber();
for(int i=0;iGetDraw(i)->Drawing(pDC); //画小球运动轨迹
}
// CBallMoveView 打印
BOOL CBallMoveView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CBallMoveView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印前添加额外的初始化
}
void CBallMoveView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印后添加清除过程
}
// CBallMoveView 诊断
#ifdef _DEBUG
void CBallMoveView::AssertValid() const
{
CView::AssertValid();
}
void CBallMoveView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CBallMoveDoc* CBallMoveView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBallMoveDoc)));
return (CBallMoveDoc*)m_pDocument;
}
#endif //_DEBUG
// CBallMoveView 消息处理程序
void CBallMoveView::OnIni()
{
CIniDialog IniDialog;
CBallMoveDoc *pDoc=GetDocument();
IniDialog.m_IniR=pDoc->m_R;
IniDialog.m_IniH=pDoc->m_H;
IniDialog.m_IniV=pDoc->m_V;
IniDialog.m_IniA=pDoc->m_A;
if(IniDialog.DoModal()==IDOK)
{
x=0;
y=0;
t=0;
pDoc->m_R=IniDialog.m_IniR;
pDoc->m_H=IniDialog.m_IniH;
pDoc->m_V=IniDialog.m_IniV;
pDoc->m_A=IniDialog.m_IniA;
pDoc->m_top.x=10;
pDoc->m_top.y=500-pDoc->m_H-pDoc->m_R*2; //根据小球高度,半径计算初始位置
pDoc->m_bottom.x=10+pDoc->m_R*2;
pDoc->m_bottom.y=500-pDoc->m_H;
s=pDoc->m_V*cos(pDoc->m_A)*0.1; //每个时钟时间小球横坐标的增量,
int index;
index=pDoc->m_ObArray.GetSize();
while(index--)
delete pDoc->m_ObArray.GetAt(index); //删除前次运动的轨迹
pDoc->m_ObArray.RemoveAll();
pDoc->SetModifiedFlag();
}
Invalidate();
}
void CBallMoveView::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBallMoveDoc *pDoc=GetDocument();
t=t+0.1; //每执行一次时间递增0.1秒
// x=x+s;
// PreY=y;
y=(pDoc->m_V)*sin(pDoc->m_A)*t-0.5*9.8*t*t; //小球相对于初始位置的高度
if (pDoc->m_bottom.y<=500) //判断小球是否到达地面
pDoc->m_top.x=pDoc->m_top.x+s;
pDoc->m_bottom.x=pDoc->m_bottom.x+s;
pDoc->m_top.y=(500-pDoc->m_H-pDoc->m_R*2)-y;
pDoc->m_bottom.y=(500-pDoc->m_H)-y; //以上为小球t 时刻位置
pDoc->SetModifiedFlag();
if (pDoc->m_bottom.y>500) //小球位置低于地面时,让小球刚好位于地面上,时钟停止
{
pDoc->m_bottom.y=500;
pDoc->m_top.y=500-pDoc->m_R*2;
pDoc->SetModifiedFlag();
KillTimer(1);
}
m_Ltop.x=pDoc->m_top.x+pDoc->m_R-1; //计算t时刻小球中心半径为2的另一小球位置
m_Ltop.y=pDoc->m_top.y+pDoc->m_R-1;
m_Lbottom.x=pDoc->m_bottom.x-pDoc->m_R+1;
m_Lbottom.y=pDoc->m_bottom.y-pDoc->m_R+1;
pDoc->AddDraw(m_Ltop,m_Lbottom); //将此小球位置添加到小球类中(用于显示运动轨迹).
Invalidate();
CView::OnTimer(nIDEvent);
}
void CBallMoveView::OnOnmove()
{
// TODO: 在此添加命令处理程序代码
SetTimer(1,100,NULL);
}
void CBallMoveView::OnSave()
{
}