c++课程设计报告(简易画图板).doc_第1页
c++课程设计报告(简易画图板).doc_第2页
c++课程设计报告(简易画图板).doc_第3页
c++课程设计报告(简易画图板).doc_第4页
c++课程设计报告(简易画图板).doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件工程专业课程设计(2012/2013学年 第2学期)题目:简易画图板的设计与实现 专 业 软件工程 学 生 姓 名 HJC 指 导 教 师 lsw 指 导 单 位 电子与信息工程学院 软件工程专业 日 期 2013年7月18日 教师评语 教师签名: 年 月 日成绩评定备 注一、课题名称设计题目:简易画图板的设计与实现二、课题内容和要求利用MFC完成画图板的基本功能。此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、三角形、任意多边形的绘制。并且能实现绘图的控制,包括画笔宽度,画笔样式和画笔颜色,画刷样式,画刷颜色和字体的设置,图形的保存和打开。3、 需求分析1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图工具,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,再插入一个菜单项,命名为设定,可提供画笔、画刷的样式及颜色选择,还有字体的设置。如果不选择,则按默认的画笔,画刷字体来绘制图形。2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形,椭圆,三角形及任意多边形,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。四、概要设计1) 对需要用到的变量进行初始化。2) 选择相应的图形之后就响应相应的消息处理函数,给m_shapeType赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。4) 选择图形或其它属性,可进行下一次绘制。开始 定义并初始化变shape 线色m_ncolor 填充色 m_fcolor 画笔pen画刷brush绘图起点opoint绘图终点cpoint选择线宽默认值(w=1)改变画笔属性选择线色默认值(黑色)改变画笔属性选择填充色默认值(黑色)改变画刷属性椭圆矩形直线响应函数OnEllipse()shape=3响应函数OnLine()shape=1响应函数OnRect()shape=2鼠标左键按下 响应函数OnLButtonDown()opoint=point鼠标移动 响应函数OnMouseMove()epoint=point响应OnPaint(),绘制图形鼠标左键弹起响应函数OnLButtonUp()刷新,得到图形结束图1 程序流程图五、详细设计1)创建单文档2) 编辑菜单3)创建工具栏4)在相应消息函数处添加代码,实现其功能5)选择要绘制的图形6)改变线宽7)改变线色,画刷颜色等8)改变图形样式,文字样式9)绘制图形10)关键代码任意多边形的绘制及填充:void CDrawView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);if (first)newpoint0 = newpoint1 = point;first = false;elsenewpoint+count = point;if (count=30)/MessageBox(数组 CPoint newpoint30 下标越界!a);return;dc.MoveTo(newpointcount-1);dc.LineTo(newpointcount);CView:OnLButtonDown(nFlags, point);void CDrawView:OnLButtonUp(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);dc.MoveTo(newpointcount-1);dc.LineTo(newpointcount);if (!move)first = true;CView:OnLButtonUp(nFlags, point);void CDrawView:OnLButtonDblClk(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);dc.MoveTo(newpointcount);dc.LineTo(newpoint0);dc.SelectStockObject(GRAY_BRUSH);dc.Polygon(newpoint,count+1);first = true;move = false;count = 1;CView:OnLButtonDblClk(nFlags, point);void CDrawView:OnMouseMove(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);if (nFlags = MK_LBUTTON)move = true;dc.SetROP2(R2_NOTXORPEN);dc.MoveTo(newpointcount-1);dc.LineTo(newpointcount);newpointcount = point;dc.MoveTo(newpointcount-1);dc.LineTo(newpointcount);CView:OnMouseMove(nFlags, point);设置程序图标:HICONico; AfxGetApp()-LoadIcon(IDR_MAINFRAME);(IDI_ICON1);SetIcon(ico,true);SetIcon(ico,false);工具栏的加载:if(!MY_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_LEFT|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!MY_ToolBar.LoadToolBar(IDR_TOOLBAR)TRACE0(未能创建工具栏n);return-1;/未能创建MY_ToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&MY_ToolBar);将位图图片分割加载为工具栏图标:代码过于冗长,不便添加,详细可在程序中查看。状态栏显示鼠标坐标:CStatusBar m_wndStatusBar;首先以上定义必须是public。m_sp.Format(_T(x=%d,y=%d),point.x,point.y);(CMainFrame *)GetParent()-m_wndStatusBar.SetWindowText(m_sp);文件操作(同时解决窗口变换时图形消失的现象):CString FileName;CMetaFileDC hdc;void CDraw:OnFileSave() CFileDialog file(TRUE); if(file.DoModal()=IDOK) FileName=file.GetPathName();HMETAFILE hmetaFile;hmetaFile=hdc.Close();CopyMetaFile(hmetaFile,FileName/*(meta.wmf)*/);hdc.Create();DeleteMetaFile(hmetaFile);void CDrawView:OnFileOpen() / TODO: Add your command handler code hereCFileDialog file(TRUE);if(file.DoModal()=IDOK) FileName=file.GetPathName();HMETAFILE hmetafile; hmetafile=GetMetaFile(FileName); hdc.PlayMetaFile(hmetafile); DeleteMetaFile(hmetafile); Invalidate();void CDrawView:OnDraw(CDC* pDC) / TODO: add draw code for native data here CDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); HMETAFILE hmetafile; hmetafile=hdc.Close(); pDC-PlayMetaFile(hmetafile); hdc.Create(); hdc.PlayMetaFile(hmetafile); DeleteMetaFile(hmetafile); 文字的添加及字体的设定:void CDrawBoardView:OnFontSet()/ TODO: 在此添加命令处理程序代码CFont m_font;int m_color;CFontDialog dlg;if(IDOK=dlg.DoModal()if(m_font.m_hObject)m_font.DeleteObject();m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);m_color=dlg.m_cf.rgbColors;/dlg.m_cc.rgbResult;/dlg.m_cf.rgbColors;CPaintDC dc(this);dc.SetTextColor(m_color);dc.SetBkMode(TRANSPARENT);dc.SelectObject(&m_font);if(m_shapeType=5)CFontStyle dlg;dlg.m_color =m_fontColor;CString temp;if(IDOK=dlg.DoModal()UpdateData();temp=dlg.m_word;m_fontColor=dlg.m_color;dc.SetTextColor(m_fontColor);dc.SetBkMode(TRANSPARENT);dc.SelectObject(&dlg.m_font);hdc.SelectObject(&dlg.m_font);hdc.SetTextColor(m_fontColor);hdc.SetBkMode(TRANSPARENT);dc.TextOut(point.x,point.y,temp);hdc.TextOut(point.x,point.y,temp);简单图形的实现(如直线,矩形,椭圆等)void CDrawBoardView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: 在此添加命令处理程序代码m_oldPoint=point;m_movepoint=point;m_penStart=true;CView:OnLButtonDown(nFlags, point);在鼠标左键弹起消息响应函数中实现绘图,代码如下:Void CDrawBoardView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/创建并获得设备描述CClientDC dc(this); switch (m_nDrawType)case 1:dc.SetPixel(point,RGB(255,0,0)); /*绘制点*/break;case 2: /*绘制直线*/dc.MoveTo(m_oldPoint);dc.LineTo(point);hdc.MoveTo(m_oldPoint);hdc.LineTo(point);break;case 3: /*绘制矩形*/ dc.Rectangle(CRect(m_oldPoint,point);hdc.Rectangle(CRect(m_oldPoint,point);break;case 4: /*绘制椭圆*/ dc.Ellipse(CRect(m_oldPoint,point);hdc.Ellipse(CRect(m_oldPoint,point);break;CView:OnLButtonUp(nFlags, point);在上述程序中,设置一个点,用到的函数是SetPixel,这也是CDC类的一个成员方法,该函数的生命形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);该函数是在指定的点设置一个像素。其中第一个参数(point)是指定的点,第二个参数(crColor)是指定的颜色。在程序中设定的颜色在系统颜色表中可能不存在,但系统会选择一种和这个颜色最接近的颜色。RGB是一个宏,它有三个参数,分别代表红、绿、蓝三种颜色的值。这三个参数BYTE类型,取值范围为0255。RGB(0,0,0)是黑色,RGB(255,255,255)是白色,将这三个分量设置成为0255之间的任意值,从而得到各种不同的颜色。这里的RGB(255,0,0)是红色。绘制直线时,首先调用MoveTo函数移动到原点,然后调用LineTo函数绘制到终点。绘制矩形时使用Rectangle函数,该函数声明形式为:BOOL Rectangle (LPCRECT lpRect);该函数有一个指向Crect对象的参数,后者可以利用两个点来构造。当用户选择椭圆菜单项时,调用Ellipes函数绘制一个椭圆。不同类之间的数据共享:if(IDOK=dlg.DoModal()m_nLineStyle=dlg.m_linestyle;str=dlg.m_linewidth;i =_ttoi(str);/注意!可能出错m_nLineWidth=i;void CDrawBoardView:OnBrushStyleSet()/ TODO: 在此添加命令处理程序代码CBrushStyle dlg;dlg.m_color=m_bclr;if(IDOK=dlg.DoModal()m_nBrushStyle=dlg.m_nBrushStyle;组合框数据导入及获取导入:BOOL CLineStyle:OnInitDialog()CDialogEx:OnInitDialog();/ TODO: 在此添加额外的初始化(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(1);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(2);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(3);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(4);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(5);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(11);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(21);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(31);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(41);(CComboBox*)(GetDlgItem(IDC_COMBO1)-AddString(_T(51);/在第5项之后插入_T(8)(CComboBox*)(GetDlgItem(IDC_COMBO1)-InsertString(5,_T(8);/选择默认第一项(CComboBox*)(GetDlgItem(IDC_COMBO1)-SetCurSel(0);return TRUE; / return TRUE unless you set the focus to a control/ 异常: OCX 属性页应返回 FALSE获取:void CLineStyle:OnCbnSelchangeCombo1()/ TODO: 在此添加控件通知处理程序代码int nSel; nSel =(CComboBox*)(GetDlgItem(IDC_COMBO1)-GetCurSel(); / 根据选中项索引获取该项字符串 (CComboBox*)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论