已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC编程及应用课程设计报告题目: 直线和曲线的绘制与计算器的编制 时间: 2011年6月8日 评语:一直线和曲线的绘制程序1.程序的功能简介本程序是单文档程序,程序的功能是按下鼠标左键可以画红色的直线,按下鼠标左键并同时按下SHIFT键可以画任意黑色的曲线。可以利用菜单对已存储的直线进行删除,在程序退出时,会提示对文档进行保存(只保存绘制的直线,曲线不予保存),可以将之前保存的图形重新绘制出来。2.程序的设计思路和实现方法(1)对直线和曲线的绘制是在视图类中完成的在视图类里定义了四个私有成员变量:int m_nDraw;/显示画线状态,1表示画线,0表示不画线,在视图类的构/造函数里初始化赋值为0HCURSOR m_hCursor;/光标句柄,改变画线时的光标形状CPoint m_ posOld;/当前鼠标位置(画线终点坐标)CPoint m_posOrigin;/鼠标起始位置(画线起点坐标)添加鼠标左键按下的消息响应函数,代码为void CNie_homeworkView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_posOld=point;/画线的起点和终点位置都m_posOrigin=point;/初始化为鼠标按下的位置this-SetCapture();/连续跟踪鼠标消息m_nDraw=1;/开始画线 m_hCursor=AfxGetApp()-LoadStandardCursor(IDC_CROSS);/设置画线的光标为十字形RECT theRect;GetClientRect(&theRect);/得到视图窗口的客户区大小ClientToScreen(&theRect);/进行坐标转换ClipCursor(&theRect);/只在客户区显示光标CView:OnLButtonDown(nFlags, point);添加鼠标移动消息响应函数,代码为:void CNie_homeworkView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultSetCursor(m_hCursor);/使用十字光标画线CClientDC dc(this);/产生当前窗口的设备对象if(m_nDraw)/画线状态为1时,画线CPen NewPen,*pOldPen;NewPen.CreatePen(PS_DASH,1,RGB(255,0,0);/产生一个像素宽的红色虚线画笔pOldPen=dc.SelectObject(&NewPen);/将当前画笔设置为刚刚产生的画笔属性 if(nFlags & MK_SHIFT)/按下SHIFT键时,画任意曲线dc.MoveTo(this-m_posOld); dc.LineTo(point);/从终点继续画线 this-m_posOld=point;/将鼠标位置赋给终点else /画直线 dc.SetROP2(R2_WHITE);/设置画笔颜色为白色 dc.MoveTo(m_posOrigin); dc.LineTo(m_posOld);/从起点到终点画直线 dc.SetROP2(R2_COPYPEN);/使用画笔颜色 dc.MoveTo(m_posOrigin); dc.LineTo(point);/从起点到鼠标位置画直线 m_posOld=point;/把鼠标位置赋给终点dc.SelectObject(pOldPen);UpdateWindow();/通知视图窗口更新CView:OnMouseMove(nFlags, point);在鼠标左键放开时,完成直线或曲线的绘制。添加鼠标左键放开的消息响应函数:void CNie_homeworkView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this); SetCursor(m_hCursor);/使用十字光标画线CPen *pOldPen;CPen NewPen(PS_SOLID,1,RGB(255,0,0);pOldPen=dc.SelectObject(&NewPen); dc.SetROP2(R2_NOT);/设置画笔颜色为与画板相反的颜色if(nFlags & MK_SHIFT)/按下SHIFT键时,画任意曲线dc.MoveTo(this-m_posOld);dc.LineTo(point);/从终点继续画线this-m_posOld=point;/将鼠标位置赋给终点else dc.MoveTo(m_posOrigin);dc.LineTo(m_posOld);/从起点到终点画直线dc.SetROP2(R2_COPYPEN);/使用画笔颜色dc.MoveTo(m_posOrigin); dc.LineTo(point);/从起点到鼠标位置画直线m_posOld=point;/把鼠标位置赋给终点CNie_homeworkDoc *pDoc=GetDocument(); pDoc-AddLine(m_posOrigin.x,m_posOrigin.y,point.x,point.y);/将直线的信息存储到数组中 this-m_nDraw =0;/画线完成,画线状态重设为0 :ReleaseCapture ();/释放鼠标 ClipCursor(NULL);/允许鼠标点击this-m_hCursor=AfxGetApp()-LoadStandardCursor(IDC_ARROW);/重设光标形状为箭头CView:OnLButtonUp(nFlags, point);(2)对直线的存储与删除是在文档类中实现的 在工程中添加了一个新类CLine,定义了四个类的私有成员,分别存放的是直线的起始点的x、y坐标。在文档类中添加了CObArray类的一个对象m_posArray作为受保护的成员,里面存放的是指向Cline类的对象的指针。 为了能够对数据进行存储,我们对CLine类和文档类进行了串行化处理。在CLine类中进行了申明:protected:DECLARE_SERIAL(CLine)/申明对数据的串行化处理在CLine类的构造函数之前也进行了申明:IMPLEMENT_SERIAL(CLine,CObject,1);在文档类中进行了申明:protected:DECLARE_DYNCREATE(CNie_homeworkDoc)在视图类的构造函数之前进行了申明:IMPLEMENT_DYNCREATE(CNie_homeworkView, CView)在CLine类和文档类中分别对数据串行化函数进行了重载。代码如下:void CLine:Serialize(CArchive &ar)/函数重载,进行数据的串行化处理if(ar.IsStoring()arm_nStartXm_nStartYm_nEndXm_nStartXm_nStartYm_nEndXm_nEndY;void CNie_homeworkDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO: add storing code herethis-m_posArray.Serialize(ar);else/ TODO: add loading code herem_posArray.Serialize(ar); 为了能够利用菜单进行直线的删除操作,在文档类中定义了下列函数:public:void AddLine(int,int,int,int);/成员函数,将CLine类的对象添加进入数组内CLine *GetLineAt(int);/成员函数,获取数组内的一个CLine对象int GetNumberOfAllLines(void);/成员函数,获取数组中所有CLine对象的个数void DeleteContent(void);/删除数组中的CLine对象对菜单的撤销命令,利用类向导连接了以下两个命令函数:void CNie_homeworkDoc:OnEditUndo() / TODO: Add your command handler code here int nIndex=m_posArray.GetUpperBound();/获得数组中直线的条数 if(nIndex=0)/数组中有直线时 delete m_posArray.GetAt(nIndex);/得到最后一条直线 m_posArray.RemoveAt(nIndex);/删除最后一条直线 UpdateAllViews(NULL);/更新视窗 SetModifiedFlag(); void CNie_homeworkDoc:OnUpdateEditUndo(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-Enable(m_posArray.GetSize();/数组中没有直线时,菜单项中撤销命令变为不可操作此外,在程序退出时,删除所有存储的直线,这只需在文档类的析构函数中调用DeleteContent();/程序结束时,删除动态数组占用的空间为了能够打开之前保存的图形,在CLine类里定义了如下成员函数void CLine:DrawLine(CDC *pDC) /CLine类的成员函数,画直线CPen NewPen(PS_SOLID,1,RGB(255,0,0);CPen *pOldPen=pDC-SelectObject(&NewPen);/产生画笔pDC-SetROP2(R2_COPYPEN);/使用画笔颜色pDC-MoveTo(m_nStartX,m_nStartY);pDC-LineTo(m_nEndX,m_nEndY);/从起点到终点画直线pDC-SelectObject(pOldPen);3.程序的编制过程中遇到的主要问题和解决办法程序在编制过程中遇到的最大的一个问题是数据的串行化处理时,我只在CLine类中进行了申明protected:DECLARE_SERIAL(CLine)而忘记在CLine类的构造函数前添加申明IMPLEMENT_SERIAL(CLine,CObject,1);导致在编译过程中程序出错,而自己还不知道错在哪里。请教老师之后,我也查了相关的书籍(参考文献12),看到了书中的例子,对照着改了过来。4.程序还可加以改进的地方 程序还可以改进的地方有不少。第一个是画笔颜色和形状不可选,也没有设置橡皮擦,另一个就是对绘制的曲线不能进行存储。限于时间有限,并没有往这几个方面多加考虑。二计算器的编制程序1.程序的功能简介 本程序是有模式对话框程序,嵌入在直线和曲线的绘制程序内。程序的功能是可以利用该计算器进行一般的科学运算,包括加、减、乘、除、求倒数、求相反数、向下取整;求正弦值、余弦值、正切值、自然对数值、常数对数值、自然底数幂;求平方、立方,开平方、开立方,阶乘;对错误输入的更改或清除,对运算结果的输出显示以及更改或清除。2.程序的设计思路和实现方法(1)参考了文献1中的第五章首先在工程中建立一个新的类:class CCalculatorDlg : public CDialog类中定义一个成员变量 protected: HICON m_hIcon;/对话框的图标在CalculatorDlg.cpp文件中添加头文件math.h和下列全局变量double result=0;/初值赋为0,表示计算结果int count=0;/初值赋为0,指示数据按钮的输入状态,1表示有数据按钮按下,/0表示无数据按钮按下char c= ;/初值赋为空格,指示二元运算符,即 c=+,-,*,/接着创建一个新的对话框,添加了一个编辑控制框,两个成组框,三十三个按钮。得到如下形式的一个对话框:将这个对话框的ID值设为IDD_Calculator,在菜单中添加一项,命名为Calculator,对应的ID值也设为IDD_Calculator。给编辑控制框添加一个成员 CEditm_edit;(2)下面给三十三个按钮连接代码 对于数字按钮09,连接的代码类似。以0为例:void CCalculatorDlg:OnBUTTONnum0() / TODO: Add your control notification handler code hereif(count=0)m_edit.SetWindowText(0);/若第一次按下0,则在窗口中显示0elsechar b40;m_edit.GetWindowText(b,20);int len=strlen(b);blen=0;blen+1=0; /将0作为字符加入字符数组的末尾m_edit.SetWindowText(b);count=1;/指示已有数据按钮按下在数据输入时,对小数点的处理比较麻烦,我的处理方法是:void CCalculatorDlg:OnBUTTONdot() / TODO: Add your control notification handler code herechar b40;m_edit.GetWindowText(b,20);int len=strlen(b);if(len=0|(len=1&b0=-)/如果之前无数据输入或输入/的是一个单个的负号,return; /则对该按钮不予处理elseint i; for(i=0;i0)for(int i=len;i0;i-)bi=bi-1;b0=-;/之前的数据为正时,在数据最前面加负号blen+1=0;m_edit.SetWindowText(b);else if(atof(b)0)for(int i=0;ilen;i+)bi=bi+1;/之前的数据为负时,去掉负号m_edit.SetWindowText(b);elsereturn;对于其它的运算,由于都是一元运算,所以程序代码也都类似,下面只举一例,开平方运算:void CCalculatorDlg:OnBUTTONsqrt() / TODO: Add your control notification handler code herechar b40;m_edit.GetWindowText(b,20);double n=atof(b);/将之前的数据转化为double型数据if(nLoadIcon(IDI_ICON1);/装载新图标hOld=(HICON)GetClassLong(m_hWnd,GCL_HICON);/原来在标题栏上的图标if(hNew!=hOld)DestroyIcon(hOld);/销毁远标题栏图标,并释放所占用的空间SetClassLong(m_hWnd,GCL_HICON,(long)hNew);/设置新的图标 RedrawWindow(NULL,NULL,RDW_FRAME);/非客户区重画其实,我还在CCalculator类里添加了成员函数afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();以及它们相应的函数代码,编译运行也都没有问题。但是就是无法显示我自己为对话框设计的图标。目前,还没有找到解决办法。4.程序还可加以改进的地方 可以改进的地方一个就是可以设计自己的图标,让程序看起来更具有属于自己的特性。另外,我觉得应该也可以让计算器的使用者自行决定运算时的精度(本程序中默认为小数点后6位,运算的操作数及结果不超过40位);还应该让使用者能够决定运算时使用弧度制还是角度制;应该加入圆括号按钮,可以改变运算的顺序等等。三 MFC课程学习的体会以及个人的一些建议通过对这门课程的学习,使我对windows运行机制有了更深刻的了解,同时也使我个人的程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 难忘的童年记事并抒情作文8篇
- 提高工作效率质量承诺书6篇
- 2025版权转让合同范本参考
- 2025版解除劳动合同示范文本新版
- 守护环境的行动抒情作文11篇
- 财务报表合并快速计算及错误预防表格模板
- 2026年天津国家电网招聘考试面试考题及答案
- 2025年安徽中烟工业有限责任公司招聘(申论)复习题库及答案
- 铝锰铁合金行业深度研究报告
- 蜂窝煤行业深度研究报告
- 2025-2026学年青岛版(2024)小学科学三年级上册(全册)每课教学反思
- (2025年标准)代输液免责协议书
- 【《金融服务适老化存在的主要问题及完善措施建议》10000字】
- 《现代货币金融学说》形考任务(1-3)及章节(1-12)试题及答案解析
- 2025至2030中国抗体和试剂研究行业项目调研及市场前景预测评估报告
- 护士行为与护理纠纷
- 口腔牙齿比色
- 第9课 体验算法控制 课件 2025-2026学年五年级上册信息技术浙教版
- 血常规复检规则与报告解读
- 劳务管理培训课件
- 肝动脉灌注化疗(HAIC)围手术期护理指南
评论
0/150
提交评论