版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单绘图程序1 需求说明1.1 问题描述设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。1.2功能说明1. 图形绘制功能:直线、椭圆、矩形。在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。2.可以绘制自由线段3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。4.可以保存绘图文件,保存后打开可以继续绘制。2. 1.3 数据说明在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩
2、形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.其他主要数据说明:int fd 判断是否为自由绘图模式int w 线宽int R RGB中的Rint G RGB中的Gint B RGB中的BCGraph类中int m_nType: 保存后重绘时用户的选择int qdx; 重绘起点xint qdy; 重绘起点yint zdx; 重绘终点xint zdy; 重绘终点yCLine
3、类中int cx; 重绘线宽int sx; 重绘起点xint sy; 重绘起点yint zx; 重绘终点xint zy; 重绘终点yint w; 重绘线宽 自定义颜色对话框关联变量:IDC_EDIT_REDintm_RedIDC_EDIT_GREENintm_GreenIDC_EDIT_BLUEint m_BlueIDC_SCROLL_REDCScrollBarm_SredIDC_SLIDER_GREENCSliderCtrl m_SgreenIDC_SPIN_BLUECSpinButtonCtrlm_Sblue 2 分析、设计与实现2.1 主要功能设计与实现2.1.1 有关文档视图功能的设计
4、与实现单文档结构可序列化的类CGraph从CObject派生可序列化的类CLine从CObject派生对话框类zdyyanse从CDialog派生2.1.2 有关消息处理的设计与实现方案:需要响应的消息应有:鼠标移动、鼠标左键按下、鼠标左键抬起、菜单栏中的画矩形、画直线、画椭圆、自由绘图、更多选项中的自定义颜色、工具栏中的红色、蓝色、绿色、线宽1、线宽2、线宽3、橡皮擦。整体思路为,用户选择不同的功能后就响应相应的消息处理函数,给xz赋对应的值。选择不同的线宽,线色,即可改变画笔或画刷的属性。鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数On
5、MouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),得到绘制图形。ID_DRAW_ELLIPSE:COMMAND 画椭圆ID_DRAW_LINE:COMMAND 画直线ID_DRAW_RECTANGLE:COMMAND 画矩形ON_WM_LBUTTONDOWN 鼠标左键按下ON_WM_LBUTTONUP 鼠标左键抬起ON_WM_MOUSEMOVE 鼠标移动void CDzyView:OnDrawEllipse() / TODO: Add your command handler code herexz=3;/当用户选择画椭圆,将变量xz赋值为3.void CDzyV
6、iew:OnDrawLine() / TODO: Add your command handler code herexz=1;/当用户选择画直线,将变量xz赋值为1.void CDzyView:OnDrawRectangle() / TODO: Add your command handler code herexz=2;/当用户选择画矩形,将变量xz赋值为2.void CDzyView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default
7、 sx=point.x;sy=point.y;fd=1;CView:OnLButtonDown(nFlags, point);/鼠标左键按下,将当前坐标赋值给sx,sy 并判断鼠标是否按下(fd=1)void CDzyView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this); /this一般指向本窗口或当前活动视图CPen pen; /定义画笔pen.CreatePen(PS_SOLID,w,RGB(R,
8、G,B); /创建画笔dc.SelectStockObject(NULL_BRUSH); dc.SelectObject(&pen); /获取画笔 fd=0;switch (xz)case 1:dc.MoveTo(sx,sy);dc.LineTo(ex,ey);break; case 2: dc.Rectangle(sx,sy,ex,ey);break;case 3:dc.Ellipse(sx,sy,ex,ey);break; CGraph *pGraph=new CGraph(xz,sx,sy,ex,ey,w,R,G,B); GetDocument()-m_obArray.Add(pGrap
9、h); CView:OnLButtonUp(nFlags, point); CDzyDoc* pDoc=GetDocument();/鼠标抬起时进行绘图,并将用户画的每一个图形对象保存到m_obArray中void CDzyView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultex=point.x;ey=point.y;CMainFrame *pFrame; pFrame=(CMainFrame *)AfxGetApp()-m_pMain
10、Wnd ; /获得指向主框架窗口的指针 CStatusBar *pStatus=&pFrame-m_wndStatusBar;/获得指向主框架窗口上状态条的地址 CString str; if(pStatus)str.Format(X=%d,point.x);pStatus-SetPaneText(1,str);/在第1个窗格中显示str的内容str.Format(Y=%d,point.y);pStatus-SetPaneText(2,str);/在第2个窗格中显示str的内容 if(xz=4) if(fd=1) CLine *pLine=new CLine(sx,sy,ex,ey,w,R,G
11、,B); GetDocument()-m_lineObarry.Add(pLine); CClientDC dc(this); CPen pen; /定义画笔 pen.CreatePen(PS_SOLID,w,RGB(R,G,B); /创建画笔 dc.SelectObject(&pen); /获取画笔 dc.MoveTo(sx,sy); dc.LineTo(point); sx=point.x; sy=point.y; CView:OnMouseMove(nFlags, point);/获取终点坐标,并进行自由绘图操作,同时在状态栏中显示鼠标当前坐标。并保存自由绘图的坐标。void CDzyV
12、iew:OnW1() / TODO: Add your command handler code herew=2;/将线宽设为2void CDzyView:OnW2() / TODO: Add your command handler code herew=3;/将线宽设为3void CDzyView:Onw3() / TODO: Add your command handler code herew=5;/将线宽设为5void CDzyView:OnBlue() / TODO: Add your command handler code hereR=0;G=0;B=255;/工具栏中选择蓝色
13、void CDzyView:OnRed() / TODO: Add your command handler code hereR=255;G=0;B=0;/工具栏中选择红色void CDzyView:OnGreen() / TODO: Add your command handler code hereR=0;G=255;B=0;/工具栏中选择绿色void CDzyView:OnFreedraw() / TODO: Add your command handler code herexz=4;/自由绘图void CDzyView:OnEraser() / TODO: Add your com
14、mand handler code hereR=255;G=255;B=255;xz=4;void CDzyView:Onzdy() / TODO: Add your command handler code herezdyyanse dlg; /定义对话框对象int result=dlg.DoModal();if(result=IDOK)R=dlg.m_Red; B=dlg.m_Blue; G=dlg.m_Green;2.1.3 有关菜单、工具栏、状态栏设计与实现保持原有菜单并添加 绘图工具-矩形 颜色与线宽-颜色 自由绘图 更多 椭圆 线宽-线宽1 直线 线宽2 线宽3工具栏:添加矩形、直
15、线、椭圆的快速绘图按钮 添加颜色快速选择按钮 添加线宽快速选择按钮状态栏:设计显示当前鼠标坐标 2.1.4 有关对话框的设计与实现通过菜单点击更多选项中的自定义颜色 弹出对话框 用滚动条、滑动条、旋转按钮修改3种颜色的值,并改变改变预览值的填充色初始化单色的值为0255,应把滚动控件值的变化范围限制在此区间,且初始值为0颜色的存储3种单色值存放在编辑框的关联变量中(int型)滚动控件当前值的变化和编辑框中数值的变化均应改变这3个关联变量(关联变量与编辑框、滚动控件联动)可在相应的消息处理函数中完成联动画图3种单色值每次变化,都重画椭圆,所以画椭圆的代码应放在每个消息处理函数中void zdyy
16、anse:OnChangeEditBlue() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEventMask()/ with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sblue.SetPos(m_Blue);/ TODO: Add yo
17、ur control notification handler code herevoid zdyyanse:OnChangeEditGreen() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEventMask()/ with the ENM_CHANGE flag ORed into the mask
18、.UpdateData();m_Sgreen.SetPos(m_Green);/ TODO: Add your control notification handler code herevoid zdyyanse:OnChangeEditRed() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEvent
19、Mask()/ with the ENM_CHANGE flag ORed into the mask.UpdateData();m_Sred.SetScrollPos(m_Red);/ TODO: Add your control notification handler code herevoid zdyyanse:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) / TODO: Add your message handler code here and/or call defaultif(pScrollBar=&m_S
20、red) / 滚动条switch(nSBCode) case SB_THUMBTRACK:/ 拖动划块m_Sred.SetScrollPos(nPos);m_Red=nPos;break; case SB_LINEDOWN:/ 按zuo按钮m_Red=m_Sred.GetScrollPos()+1;m_Sred.SetScrollPos(m_Red);break; case SB_LINEUP:/ 按 you按钮m_Red=m_Sred.GetScrollPos()-1;m_Sred.SetScrollPos(m_Red);break; if(pScrollBar-GetDlgCtrlID()
21、=IDC_SLIDER_GREEN ) / 滑动条 m_Green=m_Sgreen.GetPos(); UpdateData(false); CDC* pDC=GetDC(); CBrush newBrush; CPen newPen; newBrush.CreateSolidBrush(RGB(m_Red,m_Green,m_Blue); newPen.CreatePen(PS_SOLID,1,RGB(m_Red,m_Green,m_Blue); pDC-SelectObject(&newPen); pDC-SelectObject(&newBrush); pDC-Rectangle(50
22、,70,150,150); ReleaseDC(pDC);CDialog:OnHScroll(nSBCode, nPos, pScrollBar);BOOL zdyyanse:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_Sred.SetScrollRange(0,255);m_Sred.SetScrollPos(0);m_Sgreen.SetRange(0,255);m_Sgreen.SetPos(0);m_Sblue.SetRange(0,255);m_Sblue.SetPos(0)
23、;return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSEvoid zdyyanse:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) / TODO: Add your message handler code here and/or call defaultm_Blue=nPos;UpdateData(false); CDC* pDC=GetDC();
24、 CBrush newBrush; CPen newPen; newBrush.CreateSolidBrush(RGB(m_Red,m_Green,m_Blue); newPen.CreatePen(PS_SOLID,1,RGB(m_Red,m_Green,m_Blue); pDC-SelectObject(&newPen); pDC-SelectObject(&newBrush); pDC-Rectangle(50,70,150,150); ReleaseDC(pDC);CDialog:OnVScroll(nSBCode, nPos, pScrollBar);2.1.5 有关图形显示的设计
25、与实现为用户提供绘制矩形、椭圆、直线、自由曲线功能。根据用户不同选择赋予xz变量不同的值。然后在OnLButtonUp里添加如下代码。CClientDC dc(this); /this一般指向本窗口或当前活动视图CPen pen; /定义画笔pen.CreatePen(PS_SOLID,w,RGB(R,G,B); /创建画笔(字体,线宽,颜色)dc.SelectStockObject(NULL_BRUSH); dc.SelectObject(&pen); /获取画笔 fd=0;switch (xz)case 1:dc.MoveTo(sx,sy);dc.LineTo(ex,ey);break;
26、case 2: dc.Rectangle(sx,sy,ex,ey);break;case 3:dc.Ellipse(sx,sy,ex,ey);break;绘制直线时,首先调用MoveTo函数移动到原点,然后调用LineTo函数绘制到终点。自由曲线需要判断鼠标是否按下,并在OnMouseMove里添加如下代码:if(xz=4) if(fd=1) CLine *pLine=new CLine(sx,sy,ex,ey,w,R,G,B); GetDocument()-m_lineObarry.Add(pLine); CClientDC dc(this); CPen pen; /定义画笔 pen.Cre
27、atePen(PS_SOLID,w,RGB(R,G,B); /创建画笔 dc.SelectObject(&pen); /获取画笔 dc.MoveTo(sx,sy); dc.LineTo(point); sx=point.x; sy=point.y; 2.1.6 有关持久化的设计与实现定义的类支持序列化: 1.给工程添加一个可序列化的类CGraph。2. 在CGraph类中重载Serialize()成员函数。3. 在类CGraph实现文件中加入IMPLEMENT_SERIAL宏。4. 构造CGraph类,做准备工作。class CGraph : public CObject public:voi
28、d Draw(CDC* pDC);CGraph(int m_drawtype,int qdxx,int qdyy,int zdxx,int zdyy,int ztcx,int r,int g,int b);void Serialize(CArchive& ar);CGraph();virtual CGraph(); DECLARE_SERIAL(CGraph) int m_nType;int qdx;int qdy;int zdx;int zdy;int cx;int R;int G;int B;给类CGraph添加一个带参数的构造函数CGraph:CGraph(int m_drawtype,
29、 int qdxx, int qdyy, int zdxx, int zdyy, int ztcx, int r, int g, int b)m_nType=m_drawtype;qdx=qdxx;qdy=qdyy;zdx=zdxx;zdy=zdyy;cx=ztcx;R=r;G=g;B=b;5. 在文档类中定义一个成员变量(变量类型为CObArray,变量名为m_obArray。),用于保存每一个图形对象。6. 将用户画的每一个图形对象保存到m_obArray中。在OnLButtonUp函数中的原来代码的尾部添加如下代码:CGraph *pGraph=new CGraph(xz,sx,sy,e
30、x,ey,w,R,G,B); GetDocument()-m_obArray.Add(pGraph); CView:OnLButtonUp(nFlags, point); CDzyDoc* pDoc=GetDocument();7. 在CGraph类中完成绘图功能。8.保存和再显示图形。打开Serialize函数,将原来的代码删除,添加如下代码:m_obArray.Serialize(ar);完善CGraph:Serialize()函数,代码如下:void CGraph:Serialize(CArchive &ar)if (ar.IsStoring()arm_nTypeqdxqdyzdxzdycxRGm_nTypeqdxqdyzdxzdycxRGB;在视图类OnDraw中添加:if (pDoc-m_obArray.GetSize()for(int i=0;im_obArray.GetSize();i+)CDC* pDC = GetDC();(CGr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026高校教育热点考试题库(含答案)
- 2026成都二十中高一入学语文分班考试真题含答案
- 肠胃一到冬天就闹脾气 - 胃肠病日课件
- 麻疹风疹流行性腮腺炎三联防控课件
- 年终感恩:谢谢这一年遇见的人课件
- 2026年数字孪生系统建模工程师资格考试试题及答案
- 2026年游戏原画师游戏场景原画设计试题及答案
- 2026年新闻宣传业务岗位考试试题(含答案)
- 2026年事业单位行政管理知识考试试题及答案
- 2026年药品经营文件培训效果评估培训试题(含答案)
- 2025年广东省军事理论竞赛题库
- 急慢性肾衰竭的护理常规
- 药事管理与法规药事管理与法规药事药事管理与药事组织段立华9
- 辱骂调解协议书模板
- 【MOOC】一生的健康锻炼-西南交通大学 中国大学慕课MOOC答案
- 血透中医护理
- 小学语文整本书阅读《没头脑和不高兴》导读课件
- 烽火岁月中的木刻 课件 2024-2025学年浙人美版(2024)初中美术七年级上册
- VMware虚拟化平台巡检手册
- 100个细思极恐海龟汤及答案
- 保留灌肠操作流程及评分标准
评论
0/150
提交评论