用类实现画图及图元操作.ppt

上传人:sccc 文档编号:5636213 上传时间:2023-08-04 格式:PPT 页数:20 大小:104.04KB
返回 下载 相关 举报
用类实现画图及图元操作.ppt_第1页
第1页 / 共20页
用类实现画图及图元操作.ppt_第2页
第2页 / 共20页
用类实现画图及图元操作.ppt_第3页
第3页 / 共20页
用类实现画图及图元操作.ppt_第4页
第4页 / 共20页
用类实现画图及图元操作.ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《用类实现画图及图元操作.ppt》由会员分享,可在线阅读,更多相关《用类实现画图及图元操作.ppt(20页珍藏版)》请在三一办公上搜索。

1、用类实现画图及图元操作,信息工程学院蓝善祯,画图基类CShape画线类CLine在单文档程序中使用自己的类链表(或数组)记录每个图元对象OnDraw重画画椭圆类CEllipse图元的选中、移动、删除的原理图元的层次图元的变形等原理,画图基类CShape,首先,为了使画图类型更直观,将m_nDrawType改成枚举类型.enum/1:线 2:圆 3:矩形 随手画DRAW_LINE=1,DRAW_CIRCLE,DRAW_RECTANGLE,DRAW_PENm_emDrawType;,画图基类CShape,基类应该有的属性和函数有哪些?大家思考一下,各种图元的共性是什么?起点和终点区域画笔和画刷的属

2、性是否选中移动参考点画图过程是否结束(用于画折线、多边形等)缩放属性,画图基类CShape,成员函数:画自己 Draw设置起点和终点设置画笔属性 画刷属性更新终点坐标(用于鼠标移动时)判断是否选中和清除选中状态设置参考点移动更新变形,首先新建一个画图基类CShape(由CObject类派生)点击菜单/Insert/New Class添加属性,并初始化。类名上右键选择Add Member Variable添加成员函数(应该使用virtual虚函数)类名上右键选择Add Member Function,画图基类CShape的实现,/画笔类型,画笔宽度int m_nPenStyle,m_nPenWi

3、dth;/画笔颜色,画刷颜色COLORREF m_crPenColor,m_crBrushColor;/画刷类型int m_nBrushIndex;/记录包含图元的最小矩形CRect m_rect;/记录图元的第一点和最后一点CPoint m_ptStart,m_ptEnd;/选中属性BOOL m_bSelected;/移动时原始参考点和移动后参考点CPoint m_ptOriginRef,m_ptEndRef;,画图基类CShape的实现,void SetStartPoint(CPoint ptStart);/设置起点void SetEndPoint(CPoint ptEnd);/设置终点,

4、即用于更新属性virtual void Update();/更新属性,在SetEndPoint之后调用virtual void SetPenColor(COLORREF crColor);/设置画笔颜色virtual void SetPenWidth(int nWidth);/设置画笔宽virtual void SetPenStyle(int nStyle);/设置画笔风格virtual void SetBrushIndex(int nIndex);/设置画刷填充风格virtual void SetBrushColor(COLORREF crColor);/设置画刷颜色virtual BOOL

5、 IsInArea(CPoint pt);/判断点pt是否在图元中virtual void SetOriginRef(CPoint pt);/设置参考点void KillSelected();/清楚被选中virtual void MoveUpdate(CPoint pt);/移动时更新坐标属性virtual void Draw(CDC*pDC);/画图操作,画图基类CShape的实现,为函数SetStartPoint、SetEndPoint、SetPenColor、SetPenWidth、SetPenStyle KillSelected()等添加代码。因为这些函数对于所有的图元类型来说都是一样

6、的,这些函数也可以不用声明为虚函数。void CShape:SetStartPoint(CPoint ptStart)m_ptStart=ptStart;,画图基类CShape的实现,画线类CLine,有CShape派生CLine类实现Draw函数void CLine:Draw(CDC*pDC)CPen NewPen;BOOL bSucPen=NewPen.CreatePen(m_nPenStyle,m_nPenWidth,m_crPenColor);CPen*pOldPen=pDC-SelectObject(,在单文档程序中使用自己的类,修改View类中左键按下和抬起以及鼠标移动的相应函数代

7、码,将其用类CShape和CLine来实现画图。a)在View中定义图形对象指针1)添加头文件#include shape.h#include Line.h2)添加指针变量CShape*m_pShapeObj;/当前正在画的图形对象指针,修改鼠标左键按下响应,switch(m_emDrawType)case DRAW_LINE:m_pShapeObj=new CLine;break;case DRAW_ELLIPSE:m_pShapeObj=new CEllipse;break;case DRAW_CIRCLE:m_pShapeObj=new CCircle;break;case DRAW_R

8、ECTANGLE:break;case DRAW_PEN:break;default:break;if(m_pShapeObj)/设置图元的属性m_pShapeObj-SetStartPoint(point);m_pShapeObj-SetEndPoint(point);m_pShapeObj-SetPenStyle(m_nPenStyle);m_pShapeObj-SetPenWidth(m_nPenWidth);m_pShapeObj-SetPenColor(m_crPenColor);m_pShapeObj-SetBrushIndex(m_nBrushIndex);m_pShapeObj

9、-SetBrushColor(m_crBrushColor);m_bDrawing=TRUE;/处于画图的过程中,CTestPaintView:OnLButtonUp(),if(m_bDrawing)/判断是否在画CDC*pDC=GetDC();/获取设备上下文m_pShapeObj-SetEndPoint(point);m_pShapeObj-Update();m_pShapeObj-Draw(pDC);m_bDrawing=FALSE;/画的动作结束m_pShapeObj=NULL;,CTestPaintView:OnMouseMove(),if(m_bDrawing,链表(或数组)记录每

10、个图元对象,a)在Doc类中添加链表 CObList m_listShape;/画图列表,用于存放所有矢量图对象b)在鼠标左键抬起代码中Draw()函数之后加入GetDocument()-m_listShape.AddTail(m_pShapeObj);,OnDraw重画,void CTestPaintView:OnDraw(CDC*pDC)CTestPaintDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereCObList*pListObj=,画圆类CEllipse,a)新建CE

11、llipse类,继承于CShapeb)添加圆的Update和Draw函数void CEllipse:Update()int nLower_Right_x=2*m_ptEnd.x-m_ptStart.x;int nLower_Right_y=2*m_ptEnd.y-m_ptStart.y;m_rect=CRect(m_ptStart,CPoint(nLower_Right_x,nLower_Right_y);void CEllipse:Draw(CDC*pDC)CPen NewPen;BOOL bSucPen=NewPen.CreatePen(m_nPenStyle,m_nPenWidth,m_crPenColor);CPen*pOldPen=pDC-SelectObject(,图元的选中、移动、删除的原理,如果鼠标左键按下时刻的点在图元的区域,则认为选中图元。类似画图时候的操作,左键按下并移动鼠标,表示移动图元。如果左键抬起则移动结束。图元移动,即是图元的参考点发生偏移,从而引起相应的其他关键点作相同的偏移。伪删除,即使其区域为0,起点=终点真删除,则从链表中将其删除。,图元的层次,图元的变形等原理,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号