第23讲矩形的绘制和画刷的使用课件

上传人:沈*** 文档编号:241641069 上传时间:2024-07-12 格式:PPT 页数:42 大小:912.50KB
返回 下载 相关 举报
第23讲矩形的绘制和画刷的使用课件_第1页
第1页 / 共42页
第23讲矩形的绘制和画刷的使用课件_第2页
第2页 / 共42页
第23讲矩形的绘制和画刷的使用课件_第3页
第3页 / 共42页
点击查看更多>>
资源描述
第第23讲讲 矩形的绘制和画刷的使用矩形的绘制和画刷的使用本讲主要内容矩形类的实现与矩形的绘制 画刷 2矩形类的实现下面开始实现以矩形图元为代表的封闭图形的绘制。本章的绘图系统所涉及的封闭图形有矩形(CRectangle)、椭圆(CEllipse)、圆(CCircle)、多边形(CPolygon)、圆角矩形(CRoundRect)。下面以矩形为例具体介绍其绘制功能的实现。3矩形类的实现根据10.1.3节所完成的绘图系统类层次关系,所有的封闭图形都是填充类CFill的子类。下面我们为绘图系统添加绘制矩形的功能。【例例10-9】在例10-8程序基础上,为MyDrawSystem绘图程序添加绘制矩形的功能。4矩形类的实现绘制矩形的步骤是这样的:当用户点击菜单“绘图|矩形”之后,就进入到“绘制矩形”命令状态,这时在客户区按下鼠标左键就输入了矩形的左上角或右下角坐标,拖动鼠标,这时出现“橡皮矩形”,当释放鼠标左键,一个矩形就被“画”了出来,即显示在客户区中。接着如果再次按下鼠标左键拖动释放鼠标左键,则画出第二个矩形。如果在按下鼠标左键的同时还按下了键盘上的Shift键,则画出一个正方形。5矩形类的实现【编程步骤编程步骤】(1)首先为菜单项“绘图|矩形”添加相应的消息响应函数OnCreateRectangle()。将该命令项映射到视图类。添加代码如下。void CMyDrawSystemView:OnCreateRectangle()/菜单命令“绘图|矩形”m_nFigureType=5;/5代表图元为矩形/点击菜单命令后获得十字光标句柄m_hCross=AfxGetApp()-LoadStandardCursor(IDC_CROSS);6矩形类的实现(2)选择Insert|New Class命令,打开New Class对话框,在ClassType中选择“Generic Class”,在Name编辑框中键入“CRectangle”,在Base Class(es)框中,用鼠标左键单击“Derived From”下面的高亮区,键入“CFill”。点击OK,将弹出一个消息框,直接点击“确定”,生成CRectangle类的两个支持文件。为CRectangle类定义成员变量和成员函数。包括表示矩形左上角坐标和右下角坐标、类型为CPoint的成员变量m_TopLeft和m_BottomRight。7矩形类的实现另外矩形类有“画矩形”的动作,要修改从其父类CFill(实际上是祖父类CLineType)那里继承下来的成员函数Draw(),其功能是使用m_TopLeft和m_BottomRight两点坐标将矩形画出来。考虑到运行时的类型识别,在矩形类的头文件中添加DECLARE_DYNAMIC宏,在矩形类的实现文件(.cpp)中添加IMPLEMENT_DYNAMIC宏。8矩形类的实现/Rectangle.h文件#include Fill.hclass CRectangle:public CFill DECLARE_DYNAMIC(CRectangle)protected:CPoint m_TopLeft,m_BottomRight;/矩形左上角坐标和右下角坐标9矩形类的实现public:CRectangle();CRectangle(CPoint pt1,CPoint pt2,int width=1,int linetype=PS_SOLID,COLORREF linecolor=RGB(0,0,0),int type=5,int pattern=0,COLORREF fillcolor=RGB(255,255,255);virtual CRectangle();void Draw(CDC*pDC);/绘制矩形的成员函数;10矩形类的实现/Rectangle.cpp文件IMPLEMENT_DYNAMIC(CRectangle,CFill)CRectangle:CRectangle()m_TopLeft.x=m_TopLeft.y=0;m_BottomRight.x=m_BottomRight.y=0;CRectangle:CRectangle(CPoint pt1,CPoint pt2,int width,int linetype,COLORREF linecolor,int type,int pattern,COLORREF fillcolor):CFill(width,linetype,linecolor,type,pattern,fillcolor)m_TopLeft=pt1;m_BottomRight=pt2;11矩形类的实现CRectangle:CRectangle()void CRectangle:Draw(CDC*pDC)/绘制矩形的成员函数CPen*pPenOld;SetCurrentPen(m_nLineWidth,m_nLineType,m_LineColor);pPenOld=pDC-SelectObject(&m_CurrentPen);pDC-Rectangle(m_TopLeft.x,m_TopLeft.y,m_BottomRight.x,m_BottomRight.y);pDC-SelectObject(pPenOld);绘制矩形的方法非常简单,主要是调用CDC类的成员函数Rectangle()。函数声明如下:BOOL Rectangle(int x1,int y1,int x2,int y2);BOOL Rectangle(LPCRECT lpRect);参数x1和y1,x2和y2分别代表所要绘制的矩形的左上角和右下角顶点坐标值。参数lpRect则指定了所要绘制的矩形区域。12矩形的绘制(3)点击“绘图|矩形”菜单命令后,进入矩形绘制状态。在客户区按下鼠标左键,首先得到矩形的一个顶点坐标,拖动鼠标出现橡皮线矩形,释放鼠标则得到矩形另一顶点。这时一个矩形画完,动态生成一个矩形类对象,并将该对象加入图元对象链表。如果在按下鼠标左键的同时还按下了键盘上的Shift键,则画出一个正方形。13矩形的绘制首先,在视图类的文件MyDrawSystemView.cpp中添加#include Rectangle.h。接着添加如下代码到三个鼠标响应函数中。void CMyDrawSystemView:OnLButtonDown(UINT nFlags,CPoint point)case 5:/绘制矩形 SetCapture();/捕获鼠标 :SetCursor(m_hCross);/设置十字光标 m_StartPos=m_EndPos=point;/按下鼠标左键即得直线段起点坐标 m_nMouseStep+;/记录鼠标左击次数 m_BLine=FALSE;/标志尚未生成了一个矩形 if(nFlags&MK_SHIFT)m_BShift=TRUE;/按下鼠标左键的同时按下了【Shift】键 break;CView:OnLButtonDown(nFlags,point);14矩形的绘制void CMyDrawSystemView:OnMouseMove(UINT nFlags,CPoint point)case 5:/绘制矩形 if(m_nMouseStep=1&!m_BLine)/鼠标左击一次且没有生成矩形 if(m_BShift=TRUE)/按下鼠标左键的同时按下了【Shift】键 double dx=point.x-m_StartPos.x;double dy=point.y-m_StartPos.y;double len=0.707*sqrt(fabs(dx)*fabs(dx)+fabs(dy)*fabs(dy);/对角线长度 m_EndPos.x=m_StartPos.x+len;m_EndPos.y=m_StartPos.y+len;15矩形的绘制 else /如果未按下【Shift】键 CPen *pPenOld;SetCurrentPen(m_nPenWidth,m_nPenType,m_PenColor);pPenOld=pDC-SelectObject(&m_CurrentPen);/先换支画笔 /以下设置DC COLORREF XorColor=pDC-GetBkColor()m_PenColor;CPen pen(m_nPenType,m_nPenWidth,XorColor),*oldpen;int oldmode=pDC-GetROP2();oldpen=pDC-SelectObject(&pen);/设置为“空”刷,即不填充 CBrush*oldbrush=(CBrush*)pDC-SelectStockObject(NULL_BRUSH);pDC-SetROP2(R2_XORPEN);/删除原图形 pDC-Rectangle(m_StartPos.x,m_StartPos.y,m_EndPos.x,m_EndPos.y);m_EndPos=point;/绘新图形 pDC-Rectangle(m_StartPos.x,m_StartPos.y,m_EndPos.x,m_EndPos.y);16矩形的绘制 /以下恢复DC pDC-SetROP2(oldmode);pDC-SelectObject(oldpen);pen.DeleteObject();pDC-SelectObject(pPenOld);/恢复原来的画笔 /(m_BShift=TRUE)/m_nMouseStep=1&!m_BLine break;/switch(m_nFigureType)CView:OnMouseMove(nFlags,point);17矩形的绘制void CMyDrawSystemView:OnLButtonUp(UINT nFlags,CPoint point)case 5:/绘制矩形 pDC-SetROP2(m_nDrawMode);/松开鼠标,绘图模式也恢复 if(!m_BShift)/按下鼠标左键的未按下【Shift】键 m_EndPos=point;/松开鼠标左键即取得直线段终点坐标 else m_BShift=FALSE;/按下【Shift】键的标志取消 m_nMouseStep=0;/一条直线已经画完。鼠标左击次数清零 m_BLine=TRUE;/标志生成了一个矩形 ReleaseCapture();/释放鼠标,还原鼠标形状 CRectangle*pRectangle;18矩形的绘制pRectangle=new CRectangle(m_StartPos,m_EndPos,m_nPenWidth,m_nPenType,m_PenColor);pDoc-m_FigureList.AddTail(pRectangle);/将新绘制的直线存入图元链表 break;/switch(m_nFigureType)Invalidate();UpdateWindow();CView:OnLButtonUp(nFlags,point);19矩形的绘制(4)考虑到运行时的类型识别,为CRectangle类的父类CFill添加DECLARE_DYNAMIC宏和IMPLEMENT_DYNAMIC宏。在CFill.h文件中加入:DECLARE_DYNAMIC(CFill)在CFill.cpp文件中加入:IMPLEMENT_DYNAMIC(CFill,CLineType)20矩形的绘制(5)编写OnDraw()函数。图形的绘制由OnDraw()函数来完成。绘制数据取自图元链表。程序代码如下。21矩形的绘制void CMyDrawSystemView:OnDraw(CDC*pDC)while(pos!=NULL)if(pFigure-IsKindOf(RUNTIME_CLASS(CFill)CFill*pFill=(CFill*)pFigure;if(pFill-IsKindOf(RUNTIME_CLASS(CRectangle)CRectangle*pRectangle=(CRectangle*)pFill;pRectangle-Draw(pDC);22矩形的绘制编译连接运行程序,可以绘制矩形。23画刷当绘制矩形、椭圆和多边形等封闭的几何图形时,除了使用画笔,还必须使用画刷。画刷是用指定的颜色和图案来填充几何图形的内部区域。当用户获取一个绘图用的设备环境时,该设备环境使用GDI提供的默认画刷,其填充色为白色(WHITE_BRUSH)。与画笔类似,可以使用MFC画刷类CBrush创建自己的画刷,用于填充图形的绘制。24画刷【例例10-10】以例10-9的程序为基础,为绘图程序MyDrawSystem增加”设置|填充参数”命令,点击该命令后调用“填充参数”对话框完成“填充图案”、“填充颜色”的设置。运行程序可以绘制不同填充颜色、填充图案的矩形。25画刷【编程步骤编程步骤】1.主菜单IDR_MAINFRAME中已经添加了“设置|填充参数”菜单资源。在CMyDrawSystemView类中添加“填充参数”菜单响应函数OnFillParameter()。2.创建“填充参数”对话框。添加新的对话框资源,ID为IDD_DLG_FILL_PARA,Caption为“设置填充参数”。添加静态控件、列表框控件IDC_LIST_ FILL(注意:不勾选列表框控件的Sort属性)和按钮控件IDC_BUTTON_FILLCOLOR。26画刷3.为“填充参数”对话框编程。(1)添加新类CFillParaDlg。在CFillParaDlg类中添加公有成员变量:COLORREF m_FillColor;/用于保存用户在对话框中选中的颜色 UINTm_nFillPattern;/用于保存用户在对话框中选中的填充图案(2)对“填充图案”列表框控件进行初始化。先添加对话框类的初始化成员函数OnInitDialog。27画刷添加各控件的成员变量,为列表框控件IDC_LIST_ FILL 增加成员变量m_ListFill,类型为控件类CListBox。在OnInitDialog函数中添加初始化代码如下。28画刷BOOL CFillParaDlg:OnInitDialog()CDialog:OnInitDialog();/TODO:Add extra initialization herem_ListFill.AddString(纯色纯色);m_ListFill.AddString(45度左上右下阴影线度左上右下阴影线);m_ListFill.AddString(45度叉线度叉线);m_ListFill.AddString(45度左下右上阴影线度左下右上阴影线);m_ListFill.AddString(垂直相交阴影线垂直相交阴影线);m_ListFill.AddString(水平阴影线水平阴影线);m_ListFill.AddString(垂直阴影线垂直阴影线);m_ListFill.SetCurSel(0);m_nFillPattern=0;m_FillColor=RGB(0,0,0);UpdateData(FALSE);return TRUE;29画刷(3)添加对话框中各个控件的消息响应函数。添加“填充图案”列表框的“LBN_SELCHANGE”消息的响应函数。响应函数OnSelchangeListFill()的代码如下。void CFillParaDlg:OnSelchangeListFill()/TODO:Add your control notification handler code herem_nFillPattern=m_ListFill.GetCurSel();30画刷添加“填充颜色对话框”按钮的消息响应函数。添加代码如下。void CFillParaDlg:OnButtonFillcolor()/TODO:Add your control notification handler code hereCColorDialog ColorDlg;if(ColorDlg.DoModal()=IDOK)m_FillColor=ColorDlg.GetColor();31画刷4.在视图类中添加填充参数变量如下。int m_nFillPattern;/图元填充图案 COLORREF m_FillColor;/图元填充颜色并在视图类中初始化上述线型参数变量。代码如下。CMyDrawSystemView:CMyDrawSystemView()int m_nFillPattern=0;/初始化图元填充图案 COLORREF m_FillColor=RGB(255,255,255);/初始化图元填充颜色32画刷5.在“设置|填充参数”菜单命令响应函数OnFillParameter()中添加对“设置填充参数”对话框的调用和对视图类填充参数变量的赋值。添加代码如下。#include FillParaDlg.h /包含对话框类的头文件void CMyDrawSystemView:OnFillParameter()/菜单命令“设置|填充参数”/TODO:Add your command handler code hereCFillParaDlg FillParaDlg;if(FillParaDlg.DoModal()=IDOK)m_nFillPattern=FillParaDlg.m_nFillPattern;m_FillColor=FillParaDlg.m_FillColor;33画刷6.视图类中保存的填充参数在建立新的CRectangle对象时要传递给其构造函数。矩形类对象的生成是在视图类的OnLButtonUp()函数中完成的。现在修改OnLButtonUp()函数中的代码。原来的代码是:CRectangle*pRectangle;pRectangle=new CRectangle(m_StartPos,m_EndPos,m_nPenWidth,m_nPenType,m_PenColor);pDoc-m_FigureList.AddTail(pRectangle);/将新绘制的矩形存入图元链表34画刷修改之后代码是:CRectangle*pRectangle;pRectangle=new CRectangle(m_StartPos,m_EndPos,m_nPenWidth,m_nPenType,m_PenColor,5,m_nFillPattern,m_FillColor);/补充三个参数 5代表矩形pDoc-m_FigureList.AddTail(pRectangle);/将新绘制的矩形存入图元链表35画刷7.在绘制封闭图形对象时,除了需要使用根据图形对象中保存的线型参数所创建的新画笔,还需要使用根据图形对象中保存的填充参数来创建的新画刷,为此我们在CRectangle类的基类CFill中添加一个新的成员变量和一个新的成员函数:protected:CBrush m_CurrentBrush;/保存新画刷参数public:void SetCurrentBrush(int brushPattern,COLORREF brushColor);36成员函数SetCurrentBrush()用于创建一个新画刷。其代码如下。void CFill:SetCurrentBrush(int brushPattern,COLORREF brushColor)/设置填充图案和填充颜色 m_CurrentBrush.DeleteObject();switch(brushPattern)case 0:m_CurrentBrush.CreateSolidBrush(brushColor);break;case 1:m_CurrentBrush.CreateHatchBrush(HS_BDIAGONAL,brushColor);break;case 2:m_CurrentBrush.CreateHatchBrush(HS_DIAGCROSS,brushColor);break;case 3:m_CurrentBrush.CreateHatchBrush(HS_FDIAGONAL,brushColor);break;case 4:m_CurrentBrush.CreateHatchBrush(HS_CROSS,brushColor);break;case 5:m_CurrentBrush.CreateHatchBrush(HS_HORIZONTAL,brushColor);break;case 6:m_CurrentBrush.CreateHatchBrush(HS_VERTICAL,brushColor);break;default:break;BOOL CreateSolidBrush(COLORREF crColor);/用指定颜色初始化一个单色画刷其中crColor参数用于指定画刷颜色。BOOL CreateHatchBrush(int nIndex,COLORREF crColor);/用指定的阴影线初始化画刷其中参数crColor用于画刷颜色,参数nIndex用于指定画刷阴影线采用的风格37表10-6 画刷阴影样式样式说明HS_BDIAGONAL45度的向下影线(从右到左)HS_CROSS水平和垂直方向以网格线作出阴影HS_DIAGCROSS45度的网格线阴影HS_FDIAGONAL45度的向上阴影线(从左到右)HS_HORIZONTAL水平的阴影线HS_VERTICAL垂直的阴影线38画刷在绘制图形之前,需要将新画刷选入设备环境,绘制图形之后。需要还原旧画刷。因此需要修改CRectangle类的成员函数Draw。39画刷修改之后的代码如下。void CRectangle:Draw(CDC*pDC)/绘制矩形的成员函数CPen*pPenOld;CBrush*pBrushOld;SetCurrentPen(m_nLineWidth,m_nLineType,m_LineColor);SetCurrentBrush(m_nFillPattern,m_FillColor);pPenOld=pDC-SelectObject(&m_CurrentPen);/将新画笔选入DCpBrushOld=pDC-SelectObject(&m_CurrentBrush);/将新画刷选入DC pDC-Rectangle(m_TopLeft.x,m_TopLeft.y,m_BottomRight.x,m_BottomRight.y);pDC-SelectObject(pPenOld);/还原旧画笔 pDC-SelectObject(pBrushOld);/还原旧画刷40画刷编译连接运行程序,可以设置填充参数后绘制矩形 41课堂练习完成例10-9,例10-10。课后作业1.完成未能在课上完成的课堂练习。2.完成习题10-07、10-10。42
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!