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() 
{ 
    
}