第15讲定义直线类和画笔的使用_第1页
第15讲定义直线类和画笔的使用_第2页
第15讲定义直线类和画笔的使用_第3页
第15讲定义直线类和画笔的使用_第4页
第15讲定义直线类和画笔的使用_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、2本讲主要内容定义直线类 画笔的使用 3定义直线类直线类CLine是非封闭图形,根据前面的设计,由线型类CLineType派生。和其他的图元类一样,除了具有其基类CLineType定义的属性和行为外,还具有自己的属性和行为,如线段起点、线段终点和“绘制直线”的行为等。4定义直线类【例【例10-3】 在例10-2程序的基础上,为绘图程序MyDrawSystem增加直线类的定义,将所绘直线保存到一个合适的动态数据结构中。在重绘窗口时能够显示已经绘制的直线图形。5定义直线类【编程步骤】【编程步骤】(1)选择Insert|New Class命令,打开New Class对话框,在ClassType中选择

2、“Generic Class”,在Name编辑框中键入“CLine”,在Base Class(es)框中,用鼠标左键单击“Derived From”下面的高亮区,键入“CLineType”。点击OK,将弹出一个消息框,直接点击“确定”,即生成CLine类的两个支持文件。 6定义直线类(2)为CLine类定义成员变量和成员函数。包括类型为CPoint的、表示直线段的起点和终点的成员变量m_Begin和m_End。另外直线类有“画线”的动作,要增加一个成员函数,功能就是将直线画出来。考虑到绘图系统的每种图形都有“绘制”的动作,因此把这个新的成员函数Draw(),定义在直线类的父类CLineType

3、中,定义为虚函数,函数体为空。直线类继承下来之后,Draw()函数的功能是根据m_Begin和m_End两点画一条直线。7定义直线类在LineType.h中添加代码如下。class CLineType : public CObject public: virtual void Draw(CDC* pDC) ; /画图函数;8定义直线类在Line.h中添加代码如下。#include LineType.hclass CLine : public CLineType protected:CPoint m_Begin,m_End; /直线的起点和终点 public:CLine();CLine(CPoi

4、nt begin, CPoint end, int linewidth=1, int linetype=PS_SOLID, COLORREF linecolor=RGB(0,0,0); virtual CLine(); void Draw (CDC *pDC);9定义直线类在Line.cpp中添加代码如下。CLine:CLine() m_Begin.x=m_Begin.y=0; m_End.x=m_End.y=0;CLine:CLine(CPoint begin, CPoint end, int linewidth, int linetype, COLORREF linecolor):CLin

5、eType(linewidth,linetype,linecolor) m_Begin = begin; m_End = end;10定义直线类CLine:CLine()void CLine:Draw (CDC *pDC) /绘制直线段的成员函数 pDC-MoveTo(m_Begin); pDC-LineTo(m_End);11定义直线类(3)重新整理一下菜单命令响应函数。因为“绘图”菜单下有许多绘制不同图形的命令,单击某个命令后就要根据所要绘制的图形来编写鼠标响应函数,这样在鼠标响应函数中需要判断哪个菜单命令被点击了。为此,在视图类中添加一个成员变量m_nFigureType,点击不同的菜单

6、项即在菜单响应函数中为其赋一个不同的整数值,用于代表所绘的图元类型。代码如下。12定义直线类class CMyDrawSystemView : public CViewprotected: / create from serialization onlyint m_nFigureType; /图元类型CMyDrawSystemView:CMyDrawSystemView() /视图类构造函数/ TODO: add construction code here m_nMouseStep = 0; /鼠标单击次数初始为0 m_nFigureType= 0; /初始化为无图元类型13定义直线类当点击

7、“绘图|直线”命令后,即为m_nFigureType赋值为1,代表直线。为菜单项消息响应函数添加代码如下:void CMyDrawSystemView:OnCreateLine() / TODO: Add your command handler code hereCMyDrawSystemDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);m_nFigureType=1; /1代表图元为直线/点击菜单命令后获得十字光标句柄m_hCross=AfxGetApp()-LoadStandardCursor(IDC_CROSS); 14定义直线类(4)一个CLi

8、ne对象代表一条绘制出来的直线,为了保存大量的且数目不确定的直线图形对象,需要在文档类CMyDrawSystemDoc中为图形对象选择一个合适的动态数据结构。考虑到程序能够绘制的图形除了直线,还有许多其他的图形,在此选用对象链表来保存绘制出来的各种图形对象。在文档类CMyDrawSystemDoc中定义以下成员变量:CObList m_FigureList; /图元对象链表15定义直线类(5)改写鼠标按下左键消息处理函数OnLButtonDown()。图形的绘制改由OnDraw()函数完成。OnLButtonDown()函数需要做的是首先判断当前要绘制是哪一种图形,根据绘制该图形时鼠标点击的含

9、义获取该图形的相关数据。对于直线而言,在鼠标点击的过程中要将当前线段的起点和终点坐标保存下来。之后动态建立当前线段的CLine对象,并将该对象加入图元对象链表。在OnLButtonDown()中修改添加代码如下。16定义直线类void CMyDrawSystemView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCMyDrawSystemDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);swi

10、tch(m_nFigureType) /根据图元类型进行分支处理 case 1: /绘制直线绘制直线SetCapture(); /捕获鼠标 :SetCursor(m_hCross); /设置十字光标switch(m_nMouseStep) /鼠标点击次数17定义直线类case 0: /第一次单击鼠标左键 m_StartPos = m_EndPos = point; /获取线段起点 m_nMouseStep+; break; case 1: /第二次单击鼠标左键 m_EndPos = point; /获得线段终点 m_nMouseStep = 0; /直线两点已有,点击次数清零 ReleaseC

11、apture(); /释放鼠标,还原鼠标形状 /生成当前线段CLine对象 CLine * pLine = new CLine(m_StartPos, m_EndPos); pDoc-m_FigureList.AddTail(pLine); /将新绘制的直线存入图元链表/ switch(m_nMouseStep) 18定义直线类 Invalidate(); /使整个客户区无效,请求重绘客户区 UpdateWindow(); /请求视图刷新,调用OnDraw函数 break; case 2: /绘制多段线 break; case 3: /绘制自由曲线 break; / default: brea

12、k;/ switch(m_nFigureType) CView:OnLButtonDown(nFlags, point);19定义直线类(6)编写OnDraw()函数。图形的绘制由OnDraw()函数来完成。绘制数据取自图元链表。程序代码如下。void CMyDrawSystemView:OnDraw(CDC* pDC)CMyDrawSystemDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/从图元链表中取出各个图元进行绘制/图元链表数据结构:图元1、图元2、.图元n

13、POSITION pos = pDoc-m_FigureList.GetHeadPosition();利用CObList类的成员函数GetHeadPosition()获得图元列表m_FigureList首元素的位置 20定义直线类while(pos != NULL)CLineType* pFigure = (CLineType*) pDoc-m_FigureList.GetNext(pos); pFigure-Draw(pDC); 如果图元列表m_FigureList不是空表,则以GetHeadPosition()函数返回的首元素位置为初始位置,使用CObList类的成员函数GetNext()

14、在图元链表中前向遍历,依次调用链表结点元素即图元对象的成员函数Draw()将该图元绘制在客户区 21定义直线类完成以上各步骤后,编译连接运行程序,绘制直线段后,调整窗口大小,原来绘制的图形仍然保留在窗口中。22定义直线类(8)删除new出来的图元。在MyDrawSystemDoc.h头文件中添加删除图元对象链表的函数声明,放在public域中。如下。void RemoveList();在MyDrawSystemDoc.cpp文件中实现该函数。void CMyDrawSystemDoc:RemoveList()POSITION pos = m_FigureList.GetHeadPosition

15、();while(pos != NULL) CLineType* pLineType= (CLineType *) m_FigureList.GetNext(pos); delete pLineType; m_FigureList.RemoveAll();同时添加#include “LineType.h”。23定义直线类接着,为CMainFrame类添加窗口关闭响应函数OnClose()。添加代码如下。void CMainFrame:OnClose() / TODO: Add your message handler code here and/or call defaultCMyDrawSy

16、stemDoc* pDoc= (CMyDrawSystemDoc*)this-GetActiveDocument();pDoc-RemoveList();CFrameWnd:OnClose();同时添加#include MyDrawSystemDoc.h。24定义直线类(9)当执行File|New命令时,应该将客户区窗口中所绘制的线段清除。为此函数。在文档派生类CMyDrawSystemDoc中重载DeleteContents()函数,完成清除客户区已有显示内容的功能。打开Workspace工作区的ClassView标签,右击CMyDrawSystemDoc类,在弹出的下拉菜单中选择Add V

17、irtual Function命令,在打开的对话框中选择DeleteContents(),单击Add add Edit按钮。添加代码如下。 25定义直线类void CMyDrawSystemDoc:DeleteContents() / TODO: Add your specialized code here and/or call the base class RemoveList();CDocument:DeleteContents();编译连接运行程序,点击File|New命令,可以看到客户区内容被清除。26画笔的使用【例【例10-4】 在例10-3程序的基础上,为绘图程序MyDrawSy

18、stem增加”设置|线型参数”命令,点击该命令后调用“线型参数”对话框完成“线型”、“线宽”、“线颜色”的设置。运行程序可以完成不同颜色、线型和粗细的直线的绘制。27画笔的使用【编程步骤】【编程步骤】1. 为主菜单IDR_MAINFRAME添加“设置”菜单资源。菜单项相应的ID及Caption见表。命令IDCaption线型参数ID_LINE_TYPE线型参数填充参数ID_FILL_PARAMETER填充参数28画笔的使用2. 创建“线型参数”对话框。(1)添加新的对话框资源,ID为IDD_DLG_LINE_TYPE,Caption为 “设置线型参数”。添加静态控件、列表框控件IDC_LIST

19、_LINETYPE(注意:不勾选列表框控件的Sort属性)、编辑框控件IDC_EDIT_LINEWIDTH和按钮控件IDC_BUTTON_LINECOLOR。 29画笔的使用(2)为该对话框添加新类CLineTypeDlg。在CLineTypeDlg类中添加公有成员变量如下。 COLORREF m_LineColor; /用于保存用户在颜色对话框中选中的颜色 int m_nLineType; /用于保存用户在线型列表框中选中的线型(3)下面对“线型”列表框控件进行初始化。先添加对话框类的初始化成员函数OnInitDialog。 30画笔的使用接着添加各控件的成员变量如图所示。31画笔的使用在O

20、nInitDialog函数中添加初始化代码如下。BOOL CLineTypeDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here m_List_LineType.AddString(实线实线); /PS_SOLID m_List_LineType.AddString(点线点线); /PS_DOT m_List_LineType.AddString(虚线虚线); /PS_DASH m_List_LineType.AddString(点划线点划线); /PS_DASHDOT m_List_Li

21、neType.AddString(双点划线双点划线); /PS_DASHDOTDOT m_List_LineType.SetCurSel(0); m_nLineType = 0; m_nLineWidth = 1; m_LineColor = RGB(0, 0, 0); return TRUE; 32画笔的使用(4)添加对话框中各个控件的消息响应函数。添加列表框的“LBN_SELCHANGE”消息的响应函数。 33画笔的使用该响应函数的代码如下。void CLineStyleDlg:OnSelchangeListLineStyle() m_nLineType = m_ListLineStyle

22、.GetCurSel(); 函数GetCurSel()用来返回当前被选择项的索引。34画笔的使用添加“颜色对话框”按钮的消息响应函数。 35画笔的使用添加代码如下。void CLineTypeDlg:OnButtonLinecolor() / TODO: Add your control notification handler code hereCColorDialog ColorDlg;if(ColorDlg.DoModal() = IDOK)m_LineColor = ColorDlg.GetColor(); 36画笔的使用3. 在视图类中添加线型参数变量如下。int m_nPenTyp

23、e; /线型int m_nPenWidth; /线宽COLORREF m_PenColor; /线颜色并在视图类中初始化上述线型参数变量。代码如下。CMyDrawSystemView:CMyDrawSystemView() / TODO: add construction code here m_nMouseStep = 0; /鼠标单击次数初始为0 m_nFigureType= 0; /无图元类型 m_nPenType = 0; /线型 m_nPenWidth = 1; /线宽 m_PenColor = RGB(0,0,0); /线颜色37画笔的使用4. 将“线型参数”菜单项的菜单响应函数映

24、射到视图类。在OnLineType()函数中添加对线型对话框的调用和对视图类线参数变量的赋值。添加代码如下。#include LineTypeDlg.hvoid CMyDrawSystemView:OnLineType() / TODO: Add your command handler code hereCLineTypeDlg LineTypeDlg; if(LineTypeDlg.DoModal() = IDOK) m_nPenType = LineTypeDlg.m_nLineType;m_nPenWidth = LineTypeDlg.m_nLineWidth;m_PenColor

25、= LineTypeDlg.m_LineColor;点击OK按钮之后,将对话框控件成员变量的值保存到视图类线型参数变量中38画笔的使用5. 视图类中保存的线型参数在建立新的CLine对象时要传递给其构造函数。直线类对象的生成是在视图类的OnLButtonDown()函数中进行的。现在修改OnLButtonDown()函数中的代码。原来的代码是:CLine *pLine = new CLine(m_StartPos, m_EndPos);pDoc-m_FigureList.AddTail(pLine); /将新绘制的直线存入图元链表修改之后代码是:CLine *pLine = new CLine(m_StartPos, m_EndPos, m_nPenWidth,m_nPenType,m_PenColor);pDoc-m_FigureList.AddTail(pLine); /将新绘制的直线存入图元链表39画笔的使用6. 在绘制每个图形对象时,都需要先根据图形对象中保存的线型参数相关的数据成员创建新画笔,这样我们在CLineType类中添加一个新的成员变量:protected:CPen m_CurrentPen ; /保存新画笔参数再添加一个新的成员函数SetCurrentPen(),用于创建一个新画

温馨提示

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

评论

0/150

提交评论