1、 青岛理工大学C+面向对象课程设计报告院(系): 计算机工程学院 专业: 网络工程专业 学 生 姓 名 : abc 班级:123 学号: 000 题目: 吹泡泡课程设计 起迄日期: 2011-7-3 到 2011-7-16 设计地点: 学院机房 指 导 教 师: 源程序 qq:793572097完成日期: 2011 年 7 月 14 号一需求分析: 1.要求与功能:世界经济的快速发展和计算机技术的日益成熟,计算机被应用到人类生活的各个领域,各种应用软件相继问世,严峻的形势在提醒我们要跟上时代的步伐,不断的去创新和完善。所以,我们必须学习更多的知识和编程工具来提高自身的能力。要求用鼠标左键随机在
2、客户区任何地方单击,可产生一个圆形的泡泡(泡泡的大小随机产生) ;可通过颜色对话框选择不同的颜色,绘出不同颜色的泡泡;可以保存文档,并能打开文档。程序属于一个简单的小游戏,需要用到画图,文档等的操作,更考验了对 MFC 对程序的封装性及内联函数的掌握与应用。当代社会,目前 Windows 已成为微机上的主流操作系统,几乎成为大家离不开的必要需求,在 Windows 平台上进行软件开发也已成为程序设计的主流,所以熟悉并掌握初级的可视化编程方法对我们未来的发展有直观重要的作用,也帮助我们把握了现代化使用工具的流行趋势。程序使用的 MFC 应用程序必须有且只能有一个从 WinApp 类派生的全局应用
3、程序对象,此对象在运行时刻控制应用程序中所有其他对象的活动。通过此项设计,了解 C+编程的基本工作原理和思想,培养分析,解决问题的能力。2. 程序功能分析:能够在客户区任意地方点击即产生一个圆形的泡泡;利用基于框架窗口的应用程序使编程更加简单清晰。能够对产生的文档进行保存,打印,打印预览等一些的功能;并可以在窗口区新建文档或者关闭,打开新文档。程序运行过程中须保证不因操作频繁而产生系统错误,系统安全,可靠,功能齐全,操作方便,界面友好,容易对程序的不足之处进行修改,在程序已有的功能上利用修改,或添加一些数据成员或函数来增加更多的功能,保证程序有良好的移植性和可扩充性。例如可以改善文档的打印预览
4、效果,进一步可以添加函数使得在泡泡窗口可以画出矩形或其他图形并录入字符,且对字符可是进行各种增删,修改操作。程序应用了对话框,程序利用它可以和用户进行交互式操作,对话框是应用程序,用于显示或提示并等待用户输入一个或多个控件,利用这些控件,用户可以输入文本,选择选项,并完成某一些特定命令。二.设计内容1.程序模块图 文档保存新建打开打印预览打印视图初始化消息响应打印参数画图框架窗口CMainFrame应用程序建立文档登记模板据初始化吹泡泡程序设计程序流程图设置数组,数据成员及函数建立文档,画出泡泡,修改视图关闭? 打开? 保存?新建?是 否 更新视图数据,登记模板结束开始3.程序代码/ 文档类
5、/class CMyDoc : public CDocumentDECLARE_DYNCREATE(CMyDoc)CArray m_rectBubble;public:CMyDoc();int GetListSize()return m_rectBubble.GetSize();CRect GetBubble(int index)return m_rectBubbleindex;void AddBubble(CRect rect)m_rectBubble.Add(rect);virtual BOOL OnNewDocument();virtual void DeleteContents();v
6、irtual void Serialize(CArchive;IMPLEMENT_DYNCREATE(CMyDoc, CDocument)/ 构造函数:调用 SDI,做初始化工作 .SDI 为单文档界面程序CMyDoc:CMyDoc()m_rectBubble.SetSize(256, 256); / 设置数组参数/ 打开新文档时调用,做初始化工作BOOL CMyDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;srand(unsigned)time(NULL); / 初始化随机数发生器return TRUE;/ 关闭文
7、档、建立新文档前调用void CMyDoc:DeleteContents() m_rectBubble.RemoveAll(); / 泡泡数组清零CDocument:DeleteContents();/读写文档时自动调用void CMyDoc:Serialize(CArchive / 视图类 / class CMyView : public CViewDECLARE_DYNCREATE(CMyView)public:CMyDoc* GetDocument()return (CMyDoc*)m_pDocument;virtual void OnInitialUpdate();virtual BO
8、OL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnDraw(CDC* pDC);afx_msg void OnLButtonDown(UINT nFlags, CPoint point); /afx_msg 标记的消息处理成员函数DECLARE_MESSAGE_MAP();IMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView)ON_WM_LBUTTONDOWN()ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON
9、_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ 建立新文档,打开文档时调用void CMyView:OnInitialUpdate()CView:OnInitialUpdate();Invalidate(); void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-SelectStock
10、Object(LTGRAY_BRUSH); for(int i=0; iGetListSize(); i+)pDC-Ellipse(pDoc-GetBubble(i);/ 消息响应函数void CMyView:OnLButtonDown(UINT nFlags, CPoint point)CMyDoc* pDoc = GetDocument(); / 取文档指针ASSERT_VALID(pDoc);int r = rand()%50+5;CRect rectBubble(point.x-r, point.y-r, point.x+r, point.y+r);pDoc-AddBubble(rec
11、tBubble); / 修改文档数据pDoc-SetModifiedFlag();InvalidateRect(rectBubble, FALSE); /文档数据产生变更后,要更新试图数据/ 设置打印参数BOOL CMyView:OnPreparePrinting(CPrintInfo* pInfo)pInfo-SetMaxPage(1); return DoPreparePrinting(pInfo);/ 框架窗口类 / class CMainFrame : public CFrameWndDECLARE_DYNCREATE(CMainFrame);IMPLEMENT_DYNCREATE(C
12、MainFrame, CFrameWnd)/ 应用程序类 / #define IDR_MAINFRAME 128class CMyApp : public CWinApppublic:virtual BOOL InitInstance();DECLARE_MESSAGE_MAP();BEGIN_MESSAGE_MAP(CMyApp, CWinApp)ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)ON_COMMAND(ID_FILE_PRINT_SETUP, CWinAp
13、p:OnFilePrintSetup)END_MESSAGE_MAP()/ 建立,登记文档BOOL CMyApp:InitInstance()CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( / 登记文档模板IDR_MAINFRAME,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CMyView);AddDocTemplate(pDocTemplate);CCommandLineInfo cmdInfo; / 创建及处理命令
14、行信息 SDIParseCommandLine(cmdInfo);if (!ProcessShellCommand(cmdInfo)return FALSE;m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();return TRUE;/ 全局应用程序对象CMyApp theApp;资源脚本文件:#include “afxres.h“#define IDR_MAINFRAME 128IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGINPOPUP “网络 082 张天国吹泡泡程序设计“BEGINMEN
15、UITEM “新建(CRect rectBubble(point.x-r, point.y-r, point.x+r, point.y+r);实现的,所以声明了一个数组 m_rectBubble 来存放所有泡泡的数据。m_rectBubble 是 CMyDoc 类的私有数据成员,在类外不可见;所以要定义一组成员函数作为该数据成员与外界的接口函数。函数 GetListSize()用来统计数组中泡泡的个数;函数 GetBubble()用于从数组中取一个泡泡数据;函数 AddBubble()用于将一个泡泡的数据加入数组。 视图派生类的 OnLButtonDown()函数用于响应操作的鼠标消息, On
16、Draw()函数是试图标准输出函数,在框架窗口的客户区输出,应用程序类设置了三个消息响应宏,用于进行文档设置的菜单栏的选项。标准化的输出函数,不需要对这些消息响应函数进行重载。在应用程序类的InitInstance()函数中建立了一个文档模板。 3.上机过程出现的问题及解决方案:最开始编制的程序只是单纯的画出泡泡,本应显示的菜单栏没有出现,也不能完成相应的操作,查找关于 MFC 的相关资料和请教他人发现,问题出在没有将所建文档与响应的操作对应联系起来,后来设置了文档指针 CMyDoc* pDoc = GetDocument();各个操作都必须将文档初始化后利用指针进行关联,用 pDoc-Add
17、Bubble(rectBubble);修改文档数据,在每次对文档的打开,关闭,创建新文档前需进行对视图的更新操作。由于画出的泡泡一开始没有设置大小和位置范围,在对程序进行了多次运行后出现了错误,有时候会在文档边角出现半个或者不完整的泡泡,仔细分析发现是没有对泡泡的半径进行限制,后来加入设置位置和大小的函数,int r = rand()%50+5;CRect rectBubble(point.x-r, point.y-r, point.x+r, point.y+r);重新运行后解决了问题。4.程序中可以改进的地方及说明:1. 在对文档进行打印预览的时候,文档中的泡泡出现在过于偏上的位置,用户对文
18、档的内容不能有很清楚的了解,修改一部分函数,可以达到打印输出与屏幕显示的比例想接近。实现这个功能必须在 CGraphicView 类中重载虚函数 OnPrepareDC()。首先,在 CGraphicView 类的声明中加上:virtual void OnPrepareDC(CDC *pDC,CPrintInfo *pInfo=NULL);然后采用跟鼠标响应消息函数一样的方法,设置映射模式。void CGraphicView:OnPrepareDC(CDC *pDC,CPrintInfo *pInfo)pDC-SetMapMode(MM_LOMETRIC);CView:OnPrepareDC(
19、pDC,pInfo);在修改消息映射函数 OnLButtonDown(),void CGraphicView:OnLButtonDown(UINT nFlags,CPoint point)CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);CClientDC dc(this); OnPrepareDC(int r = rand()%50+5; CRect rect(point.x-r,point.y-r,point.x+r,point.y+r);InvalidateRect(rect,FALSE); dc.DPtoLP(rect); pDoc-Ad
20、dBubble(rect); pDoc-SetModifiedFlag(); 这样打印预览效果比较好,文档基本显示在打印纸中部。输入输出:用鼠标左键在窗口客户区吹泡泡。使用文件菜单中的打印选项可打印窗口图象,图象位于打印纸上部,比例恰当.分 析:由于 OnDraw()函数输出使用逻辑坐标,所以存储数据(泡泡的包含矩形)也使用逻辑坐标。在 OnLButtonDown()函数中鼠标位置参数 point 为物理坐标,首先据此生成泡泡的包含矩形(物理坐标) ,更新窗口客户区的相关区域(物理坐标) ,然后将物理坐标的泡泡包含矩形转换为逻辑坐标并存入文档。CView 类的虚函数 OnPrepareDC()
21、用于设置设备环境,其原型为:virtual void OnPrepareDC( CDC* pDC,CPrintInfo* pInfo = NULL );其中参数 pDC 为指向设备环境的指针,pInfo 为指向 CPrintInfo 类对象的指针。CPrintInfo 类用来存放与打印有关的信息,其数据成员 m_nCurPage 为当前打印页的号码;m_rectPage 存放着当前打印纸上的可打印区域。常用成员函数有:设置从第几页开始打印。其原型为:void SetMinPage( UINT nMinPage );其中参数 nMinPage 为开始打印的页号。如果从文档的第 1 页开始打印,则
22、 nMinPage 的值应为 1。2. 绘制五颜六色的泡泡1在程序首部添加文件包含命令:#include 2在框架窗口类声明中添加一个 COLORREF 类型的数组,存放各泡泡的颜色:COLORREF m_colorBubble MAX_BUBBLE;3修改鼠标左键消息映射函数,添加使用颜色选择公用对话框的代码:void CMyWnd:OnLButtonDown ( UINT nFlags,CPoint point )if(m_nBubbleCount #include #include #include “afxres.h“#include “l.chsafxres.rc“#include “l.chsafxprint.rc“吹泡泡吹泡泡七主要参考文献:1郑莉C+语言程序设计(第 3 版) 北京:清华大学出版社,2005.72钱能C+程序设计教程(第 2 版) 北京:清华大学出版社,2005.83. 黄维通. Visual C+面向对象与可视化程序设计(第 2 版).北京:清华大学出版社,2003.124. 刘路放. Visual C+与面向对象程序设计教程(第二版). 北京:高等教育出版社,2007.85. 潘爱民. COM 原理与应用.北京:清华大学出版社,1999.116. 百度文库7. 西安交通大学 vc+讲义。8. 孙鑫 MFC 教程。