求一个MFC小程序,比如小球碰撞啦计算器啦,最主要要有以下这几项:
一、 设计任务1.1 任务描述使用MFC框架设计一个小球在客户区内运动,小球和客户区边界发生碰撞后,改变运动方向。1.2 设计要求1. 自定义屏幕二维坐标系:x轴水平向右为正,y轴垂直向上为正,坐标系原点位于客户区中心。2. 使用控制按钮播放或停止动画。3. 使用定时器函数控制小球的运动。4. 使用双缓冲技术实现动画。5. 当改变窗体大小时,小球的位置恢复原点。1.3 效果图设计效果图如图1所示。 图1 小球碰撞效果图二、 设计思路本设计首先构建双缓冲框架,小球和客户区边界发生碰撞后,改变运动方向。三、 关键源代码及注释3.1 双缓冲函数void CTestView::DoubleBuffer()//双缓冲{ CDC* pDC=GetDC(); GetClientRect(&rect);//获得客户区的大小 pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系 pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围 pDC->SetViewportExt(rect.Width(),-rect.Height());//x轴水平向右,y轴垂直向上 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//屏幕中心为原点 CDC MemDC;//内存DC CBitmap NewBitmap,*pOldBitmap;//内存中承载图像的临时位图 MemDC.CreateCompatibleDC(pDC);//建立与屏幕pDC兼容的MemDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 pOldBitmap=MemDC.SelectObject(&NewBitmap);//将兼容位图选入MemDC MemDC.SetMapMode(MM_ANISOTROPIC);//MemDC自定义坐标系 MemDC.SetWindowExt(rect.Width(),rect.Height()); MemDC.SetViewportExt(rect.Width(),-rect.Height()); MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2); DrawObject(&MemDC); BorderTest(); pDC->BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height(),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存位图拷贝到屏幕 MemDC.SelectObject(pOldBitmap);//恢复位图 NewBitmap.DeleteObject();//删除位图 MemDC.DeleteDC();//删除MemDC ReleaseDC(pDC);//释放DC}3.2 绘制球体函数 球体采用Ellipse函数绘制,球体中心位于屏幕中心,球体半径取客户区宽度的1/20。球体边界和内部的填充色均为绿色。void CTestView::DrawObject(CDC *pDC)//绘制球面{ CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0)); pOldPen=pDC->SelectObject(&NewPen); CBrush NewBrush,*pOldBrush; NewBrush.CreateSolidBrush(RGB(0,255,0)); pOldBrush=pDC->SelectObject(&NewBrush); r=rect.Width()/20; //球体半径 pDC->Ellipse(point.x-r,point.y+r,point.x+r,point.y-r); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen);}3.3 碰撞检测函数 根据point±r与客户区的半宽度和半高度之间的关系,可以判断球体是否和客户区边界发生碰撞。若发生碰撞,则改变球体的运动方向direction。void CTestView::BorderTest(){ int nWidth=rect.Width()/2; int nHeight=rect.Height()/2; if(point.x+r>nWidth) //与右边界发生碰撞 direction.x=-1; if(point.x-r<-nWidth) //与左边界发生碰撞 direction.x=1; if(point.y+r>nHeight) //与上边界发生碰撞 direction.y=-1; if(point.y-r<-nHeight) //与下边界发生碰撞 direction.y=1;}3.4 重置球体位置函数为视图添加WM_SIZE消息映射四、 总结4.1 设计方案拓展4.2 目前存在的问题五、 参考文献