欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    1688.图形学课程设计报告-简易CAD画图软件.doc

    • 资源ID:2883851       资源大小:354KB        全文页数:17页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    1688.图形学课程设计报告-简易CAD画图软件.doc

    <<计算机图形学>>课程设计报告题目:简易CAD画图软件班级: 学号:姓名: 日期:老师: 一 课程设计要求及开发工具简要介绍1. 设计题目:简易CAD画图软件2. 设计目的: 用面向对象语言和面向对象程序设计方法完成一个画图应用系统的分析、设计和实施,实现对象的基本插入、删除、修改、查询 和对象的永久保存等功能。通过课程设计使学生掌握面向对象编程技术、语言的GUI编程、常用类库的使用、应用系统的开发过程和常用的画图算法,如画圆、画直线、画矩形、填充等。3. 设计要求: 通过这次设计应学会在VISUAL C+的环境上,如何使用类来编写画图应用程序,。系统开发环境为一台安装Windows 2000 Server的服务器,服务器上安装Visual C+。系统设计与设计系统的运行均可在客户机上进行。为了保证系统运行的效率和可靠性,系统服务器端应具有较高的软硬件配置,客户端的要求不是很高。其运行要求如下:(1)软件环境: Windows95/98/2000,Internet Explorer(IE),C/C+/SDK VC+ 6.0等。(2)硬件环境:CPU:PIII 500以上 ,内存:256M以上。二、概述及需求描述(1)背景: CAD 软件主要于绘制工程图形,广泛应用于,机械,建筑,电子等工业部分。它对图形的要求精确,标准。有二维和三维,当前市场上用于的产品主要国外的:AutoDest公司的 AutoCAD .3Dmax ,Invetor,PTC公司 Pro/E ,ParaSolid SolidEdge, 等等。国产的有:华工科技开目软件公司的开目二维,三维,北航公司的系列。技术,内容繁杂,涉及知识众多,主要有计算机图形,图形像,模式识别。(2)需求描述:本项目以二维核心设计思想为主线,提取其中的主要功能,简化大理其它技术细节,作为最基本的项目。主要实现的算法如下:1.图形绘制 1.1 二点画直线段 1.2 画连续折线, 1.3 圆心半径画整圆 1.4 两点画矩形 1.5 两点画椭圆 1.6 三点画三角形 1.7 画正多边形2.图形编辑 2.1 单个图形的属性: 线型,线宽,颜色, 指定与修改 2.2 单个图形的删除,移动,旋转,镜像,缩放,圆周排列,矩形排列 2.3 组选图形的删除,移动,旋转,镜像,缩放,圆周排列,矩形排列 2.4 相交图线的分段删除3.操作要求 3.1 可以精确定位到特殊点: 直线的两端,中心,圆的圆心,圆周上四个正交点 3.2 水平位置对齐,坚直位置对齐 3.3 画按指定角度画绘直线 3.4 观察视角缩放4.其它4.1 图形文件保存,读取4.2 显示图框,可由用户指定图幅4.3 图幅可以用滚动条移动三、相关图形算法这里,我们仅仅最基本常见的图形关系的处理,包括点与点的关系,点与一般图形的关系,图形旋转,缩放,镜像,求交点,移动等等.工程中最常见的可以分归结为直线段和圆弧。一个图形可以用一组数据来描述,直线段可以是两端点的位置,整圆可以圆心坐标和半径.在我们处理图形时,往往讨论单个点的变化,如点关于直线的镜像,点的移动,点位置的缩放,这里就可以方便的推广到其它图形上去了。 下面的我们简述算法思想和几何原理,对于复杂的处理在已经写了函数,可以直接调用。(1)点与图形位置关系判别1.1 直线是否在直线上 判断点在否在直线(ptBegin,ptEnd)上,求两个距离 nL1 = Dist(ptCur,ptBegin); nL2 = Dist(ptCur,ptEnd); 如果(nL = nL1 + nL2 ) 那么说明点在直线上 函数: bool IsOnLine(LINE aLine,POINT ptPos)1.2 直线是否在圆员上 nL = Dist(ptCetner,ptCur); 如果 (nL = nR ) 那说明点就圆周上   函数: bool IsOnLine(CIRCLE aCircle,POINT ptPos)1.3 点与矩形位置关系 判断一个点ptCur是否在指定的矩形(x1,y1,x2,y2)中 (x1 < xc && xc < x2 ) &&( y1 < yc && yc < y2 ) 函数: bool PtInRect(POINT ptPos,RECT rect)(2) 图形移动2.1点的移动 点P1(x1,y1)移动(dx,dy) 到点P2(x2,y2) x2 = x1 + dx; y2 = y1 + dy;2.2 图形的移动 如果需要移动直线,那么就把两端点作此移就可如果移动圆,那么把圆心作此变换即可.(3) 图形旋转点P1(x1,y1),绕点(xp,yp)反时针绕动P2(x2,y2)函数: POINT RotateOnCenter( POINT ptPos, 原来的点POINT ptCenter, 绕圆心double dbAngle) 转动角度(4) 图形缩放一个图形的缩放,需要把端点的位置缩放,P点以C为基点放至到P点L2/L1 = dbScale缩放倍数,对于圆,不但坐标位置需要缩放,半径也要放dbScale倍才能缩放的相似性.函数: POINT ZoomPosition(POINT ptPos,const double dbScale,const POINT ptCenter)(5) 图形框选5.1 判断一条直线是否在一矩形范围中 只需要判断直线的起始点和终止点在同时都在矩形中,就说明直线段 在一矩形范围中函数: bool LineInRect (LINE aLine,RECT rect)5.2 判断一个整圆是否在一个矩形范围中 只要图周上与正交的四个点的位置在矩形中,则说明这个圆在矩形内,对于圆心为(x,y)半径为nR的整圆,这个四个正交点的是(x nR,y)(x + nR,y)(x , y nR)(x , y + nR)函数: bool CircleInRect (CIRCLE aCir,RECT rect)(6) 求交运算6.1 直线段和直线段求交, 注意,有可能会交在直线段的延长线,这样的交点叫虚交点,否则叫实交点。 函数int sec_i_LL(LINE aLine1,LINE aLine2,double sx2, double sy2)6.2 整圆与直线段相交 函数int sec_i_LC(LINE aLine,CIRCLE aCir,double xs2, double ys2)6.3 整圆与整圆相交 函数:int sec_i_CC( CIRCLE aCir1, CIRCLE aCir2, double sx2, double sy2)(7) 图形镜像图形的镜像,就是图形关于一条直线的对称图形。如果有一个点(x1,y1)半于直线的对称点P(x2,y2),那么它的位置可以以使用如下公式计算其中角,为直线与X轴正向的夹角。POINT MirrorOnAxis(POINT ptOrg,double dbAngle,POINT ptPos)(8) 坐标变换屏幕客户区的坐标是原点在左上角,向右,轴向下,而在进行图形坐标运算一般习惯于把原点定在左下角,向右,轴向上。因此在进行图形运算之间,要作两个坐标系之间的转换。 设在客户区坐标系下,屏幕上一点(x1,y1),那么转换后的坐标位置为 x2 = x1; y2 = H y1; 其中H为客户区的高度。四、编程技术(1) 窗口滚动视在创建窗口前,指定带滚动条风格CreateWindow(.,.WS_VSCROLL | WS_HSCROLL,)在窗口创建后,设置滚动条创建范围SetScrollRange在程序运行过程中,接收滚动条消息WM_VSCROLLWM_HSCROLLint nSBCode = LOWORD(wParam)int nPos= HIWORD(lParam)nSBCode 可取的值为:SB_LINELEFT, 左移一格SB_LINERIGHT, 右移一格SB_PAGELEFT, 左移一页SB_PAGERIGHT 右移一页SB_LINEUP, 上移一格SB_LINEDOWN, 下移一格SB_PAGEDOWN, 上移一页SB_THUMBTRACK 下移一页SB_THUMBTRACK 拖动滑块的位置(2)右键菜单1. 在资源文件中创建一个下拉菜单2. 从资源文件中装入菜单,得到菜单句柄 HMENU g_hMenu = :LoadMenu(g_hInst,"Menu1"); g_hMenu = :GetSubMenu(g_hMenu,0);3. TrackPopupMenu(g_hMenu, TPM_RIGHTBUTTON,x,y0,hWnd,NULL) 在指位光标(x,y)位置弹 出菜单(g_hMenu),菜单的先项将作为WM_COMMAND的参数,发送hWnd 指定的窗口中TPM_RIGHTBUTTON 表示光标在菜单左边4. 在不需要使用弹菜时,要作清理:DestroyMenu(g_hMenu);(3) 对话框1 文件对话框 Windows/API中提供函数,来实现文件名的选取。OPENFILENAME g_ofn; 用参数填写g_ofn:GetOpenFileName(&g_ofn) 得到一个打开文件名:GetSaveFileName(&g_ofn)得到一个“另存为”的文件名 这两个函数的的参数,都是一个OPENFILENAME类型的变量的道地址。OPENFILENAME 结构体中,收集了有关文件对话框的参数。 由于这个结构很大,参数重载,所以只需要程序开始时集中初一个初值在使用时,调整g_ofn中的部分参数即可PopFileInitialize。2 颜色对话框 SDK标准API函数ChooseColor,用于显示颜色选择对话框CHOOSECOLOR g_cc;:ChooseColor(&g_cc);使用此函数需要填写一个结构CHOOSECOLOR类型的变量中的参数.在Eg16 中有默认的参数设置,只要其中一个参数需要了解,参数rgbResult中在调用完对话框后,可以记录用户所选择颜色的颜色值.3 自定义对话框3.1 在资源编辑器,创建一个对话框资源,创建的方法与VB类似3.2 使用标准API函数:DialogBox 来显示对话框. 其中需要指定资源对话框的ID号,同时,对话框也是窗口一种,需要有下 指定一个窗口过程处理对话框消息.3.3 对话框常处理的消息是WM_INITDIALOG, 在消息是在对话框创建时发出的.因此,可以在此初始化对话框中的数据.3.4 对话框中的每一个控件也是一窗口, 可以通过函数GetDlgItem使用ID号来得到控件的句柄号,得到控件的句柄,可以向普通窗口一样处理控件.(4) 状态态实时提示#include <commctrl.h>comctl32.libCreateStatusWindow1.光标设置 通过调用函数来设置光标形状.2.在资源文件中导入光标文件 *.cur3.在消息WM_SETCURSOR时,设置光标4.使用函数LoadCurSor把光标从资源文件中调用出,得到光标句柄.5.使用函数SetCursor为当前程序设置光标.五、功能实现分析(1)静态图形绘制  Windows API中提供了画制直线和椭圆的函数,经过如下的改制可以成为画线直线段和整圆的函数。动态绘制图形:1.1 删除功能的实现 Window API 没有提供删除的函数,图形上采用异或的方式重绘一次来实现删除原理如下:int nF = 0xff0000int nB = 0xffffff经过运算后:nF nB nF= (0xff0000) (0xffffff ) (0xff0000)=(0xffff) (0xff0000)= 0xffffff = nB nF nB nBè nF 所有我们有关于异或运算的一个结论,如果nF是前景颜色,nB表示背景颜色,那么以设置异和混合方式,同一图形绘制两次,图形就成背景颜色,就起到了擦除的功能。 设置前景色与背景色的混合方式:SetROP2(hdc,R2_XORPEN)而默认的混合模式为背景等于前景SetROP2(hdc,R2_COPYPEN) 1.2 鼠标移动时的拉伸线效果 如果把移动的过程放缓来看,那么如图形在某一次移动过程中,直线的起点 ptBegin没有动 而终点由ptPre移动了ptCur,这时需要作两件事: 一 删除掉直线(ptBegin,ptPre) 二 画直线(ptBegin,ptCur) 当紧接着第二次移动时,ptPre = ptCur,ptCur跟随鼠标位置,又有了新的值。如果这个移动足够书,那么用户感觉上就动态拉伸的效果了。其中,所谓的删除,就以是异或的模式重绘两次,所以,移动拉伸线的绘制都在异或混合模式下进行的。1.3 完整的一次直线绘制过程控制 要求是:鼠标第一点确定直线始点;移动过程中,有动态直线绘制,以寻找终点;再按第二点确定直线终点。在这一过程中,需要有两上消息配合工作: WM_LBUTTONDOWN,WM_MOUSEMOVE为了起消息间配合可以规则两个状态变量来控制。1.4 整圆的动态过程 绘制直线动态过程类似,第一点记录下图心在MouseMove的过程中,(ptCenter,ptPre)两点距离为上一次半径nR2, DrawCircle(hdc,ptCenter,nR1)再计算(ptCenter,ptCur) 两点距离为半径 nR1再绘制一次DrawCircle(hdc,ptCenter,nR2)。六、系统结构本程序选用以下体系结构 (1) 开发框架 一个Window程序,可以拥有创建一个多个窗口,因此用这个关系可以转化为,如果一个程序本身是一个对象,那么一个应用程序对象就拥有多个窗口对象,对于本例而就是一个主窗口对象. 可以创建下个全局CWinApp的对象:g_theApp。而CMainFrame的对象作成CWinApp的成员。CWinApp成员函数InitProcess封装了窗口的注册,创建,显示与消息循环的创建。CMainFrame中的静态成员函数WndProc作为窗口消息的处理函数。注意,由于窗口过程是一个(由操作系统)的回调函数,只在类中的静态函数才能作回调函数,因为静态函数中没有this指针。在CMainFrame:WndProc中调用CMainFrame中的成员函数,不能直接访问。因为静态成员函数不能直接访问类中非静态成员。因此要通过间接的传入方式。此类的结构可以作为以后开发的程序框架。(2)动态数据结构 在程序中,需要保存不断增减的不同类型的数据。可以使用模板类 CArray<T> 这个动态数据来保存数据。它具有三个优点 1. 使用方便,如同简单的数组一样 2. 可以动态的增加与删除点。 3. 可以存放,不同类型的数据。 如:CArray<CShape* > m_aryAllShape; CArray<CLine> aryAllLine; , 同时,还可以通过链表来动态数据,但链表的创建,删除,使用使用过程较之复杂。(3) 实体类和工具类当用户选择不同的功能时,会有不同的操作,来生成图形。例如使用两点来绘制一条直线段,使用圆心,半径来来绘制整圆。绘制完成以后,需要把绘制图形保存到动态数据结构中。可以这样一个过程,分解为两个部分,一个是图形的绘制过程,这里程序中主要是算是鼠标器的消息,LButtonDown,MouseMove,RButtonDown。另一个过程,是绘制完成以后将图形保存到数组中。即一个图形产生过程,一个图形保存过程。这里图形的产生的也可以封装成一工具类,如果直线的绘制直线工具类CLineTool,如果圆的绘制过程封装CcircleTool,保存图形数据,对于直线可以直线类CLine,对于圆可以用圆弧类CCircle。当用户选择不同的功能时,应该先用不同的绘制工具类,将WndProc中收到消息,全部转发到当前绘制工具中。因此,可以建立一个工具类的派生体系 CTool,系统中有一个当前活动工具的指针CTool* m_pActiveTool ,它指向哪个工具对象,就会消息发到哪一个工具中去。它就像一个多路开关一样。对于实体类,保存在数组中已经后,需要在窗口重绘时刷新,文件的保存,关系上线关系等等。因可以创建一个图形数据库类CDatabase来专门针对于图形数组CArray<Shape*>来操作。七、成品函数调用汇总表对于常用的算法,已经写成了专门的静态函数,使用时只需要包含头文件,并链接入库文件即可,可以使用函数的文件中,加入如下语句,注意,GraphMath.h,GraphMath.lib 需要在同一目录下,如 常量 圆周 PI 3.1415926 计算像素时的精度 PRECISION 5 自定义数据类型 结构体 直线段 LINE 整圆 CIRCLE 平面向量 VECTOR 以下函数与坐标的方向无关求两点距离 int Distance(POINT ptPos1,POINT ptPos2)  int Distance(int bx,int by,int ex,int ey)判断点是否在直线段上 bool IsOnLine(const LINE& aLine,POINT ptPos)判断点是否在整圆上 bool IsOnLine(const CIRCLE& aCircle,POINT ptPos)下以函数使用时,X轴向右,Y轴向下绘制直线 void DrawLine(HDC hdc,POINT ptBegin,POINT ptEnd)绘制整圆 void DrawCirlce(HDC hdc,POINT ptCenter,int nRadius)判断点是否在矩形中 bool PtInRect(POINT ptPos,RECT rect)判断线段是否在矩形中 bool LineInRect(LINE aLine,RECT rect)判断整圆是否在矩形中 bool CircleInRect(CIRCLE aCir,RECT rect)下以函数使用时,X轴向右,Y轴向上求直线方向角(与X轴正方向的转角) double GetDirAngle(LINE aLine)求两直线段的交点坐标 int InsectionLL(POINT ptBegin1,int nAngle1,POINTptBegin2,int nAngle2,POINT ptRes2)int sec_i_LL(LINE aLine1,LINE aLine2,double sx2, double sy2)求直线段与圆弧的交点坐标 int sec_i_LC(LINE aLine,CIRCLE aCir,double xs2, double ys2)求两整圆的交点 int sec_i_CC( CIRCLE aCir1,CIRCLE aCir2,double sx2,double sy2)求一个点以ptCenter为基点的缩放的位置 POINT ZoomPosition(POINT ptPos,const double dbScale,const POINT ptCenter)求关于对称轴的对称点(镜像) POINT MirrorOnAxis(POINT ptOrg,double dbAngle,POINT ptPos)求关于某一位置的旋转点位置 POINT RotateOnCenter(POINT ptPos,POINT ptCenter,double dbAngle)求两条直线的交角 int GetAngleBetweenLine(aLIne1,aLine2)求圆的等分点 bool CirclePartPos(POINT ptCenter,int nR,int nNum,POINT*& pPos,double dbA = 0.0)常用SDK 中API函数  GetDlgItem   SetWindowText   LoadCursor 从资源文件装入光标  SetCursor 设置光标  WM_SETCURSOR 用于设置光标消息八. 界面的设计1.主应用程序的位置,如下:2.主界面,如下:3.运行结果,如下:九、部分源代码1. Shape.cpp#include "stdafx.h"#include "Shape.h"#include "math.h"/图形基类CShape:CShape(void) m_bIsActive = FALSE;/这个可以设置图形的位置,在更新时只用更新那个区域就行了void CShape:SetPosition(CPoint pt1,CPoint pt2) m_pointArray0 = pt1; m_pointArraym_pointArray.GetSize()-1 = pt2;/ CSahpe类虚函数: / 函数名 : MoveSize/ 函数参数: size (表示要移动的范围)/ 函数功能: 将图形的坐标都按一定尺寸移动/ 返回值 : void void CShape:MoveSize(const CSize & size) int nI; for(nI=0; nI<m_pointArray.GetSize(); nI+) m_pointArraynI.x += size.cx; m_pointArraynI.y += size.cy; POINT CShape:GetCenterPoint(void) CRect rt=this->GetRectangle(); POINT ptCenter=(rt.left + rt.right) / 2, (rt.top + rt.bottom) / 2; return ptCenter;void CShape:RotateSelf(CDC *pDC, CPoint ptCenter, double dbAngle) for(int nI=0; nI<m_pointArray.GetSize(); nI+) m_pointArraynI =RotateOnCenter(m_pointArraynI, ptCenter, dbAngle); /得到图形两点间的矩形区域RECT CShape:GetRectangle(void) int nX1,nX2,nY1,nY2; RECT rt; nX1 = m_pointArray0.x; nX2 = m_pointArraym_pointArray.GetSize()-1.x; nY1 = m_pointArray0.y; nY2 = m_pointArraym_pointArray.GetSize()-1.y; rt.left = nX1 < nX2 ? nX1 : nX2; rt.top = nY1 < nY2 ? nY1 : nY2; rt.right = nX1 > nX2 ? nX1 : nX2; rt.bottom = nY1 > nY2 ? nY1 : nY2; return rt;/设置活动图形void CShape:SetActive(BOOL bActive) m_bIsActive = bActive;/求两点之间的距离int CShape:Distance(POINT ptPos1, POINT ptPos2) double dbD = sqrt( (ptPos1.x - ptPos2.x) * (ptPos1.x - ptPos2.x) + (ptPos1.y - ptPos2.y) *(ptPos1.y - ptPos2.y) );return (int)dbD;/直线类/串型画声明 加到CRunTimeClass类中去IMPLEMENT_SERIAL(CLine, CObject, 1)/必须要有一个空的构造函数(为的是在从文件中读的时候要去根据类名动态创建)CLine:CLine() /m_pt0 = m_pt2 = m_pointArray0; /m_pt1 = m_pt3 = m_pointArraym_pointArray.GetSize()-1; /m_ptStart = m_pointArray0; /m_ptEnd = m_pointArraym_pointArray.GetSize()-1;/带参的构造函数CLine:CLine(UINT penStyle,UINT penWidth,COLORREF color) m_nPenWidth = penWidth; m_nPenStyle = penStyle; m_nPenColor = color;/析构CLine:CLine()/画出自己来(每个图形都应该具备把自己画出来的能里)BOOL CLine:DrawSelf(CDC * pDC) int nX1,nX2,nY1,nY2; nX1 = m_pointArray0.x; nX2 = m_pointArraym_pointArray.GetSize()-1.x; nY1 = m_pointArray0.y; nY2 = m_pointArraym_pointArray.GetSize()-1.y;CPen pen;if (!pen.CreatePen(m_nPenStyle, m_nPenWidth, m_nPenColor)return FALSE;CPen* pOldPen = pDC->SelectObject(&pen);/如果当前图形是被选中的,就在它的两头画小圆 if(m_bIsActive) pDC->Ellipse(nX1-Rect, nY1-Rect, nX1+Rect, nY1+Rect); pDC->Ellipse(nX2-Rect, nY2-Rect, nX2+Rect, nY2+Rect); pDC->MoveTo(m_pointArray0);pDC->LineTo(m_pointArraym_pointArray.GetSize()-1);pDC->SelectObject(pOldPen); return TRUE;pen.CreatePen(m_nPenStyle, m_nPenWidth, m_nPenColor); CPoint pt1,pt2; /把原来的两个点取出来 pt1 = m_pointArray0; pt2 = m_pointArraym_pointArray.GetSize()-1; pDC->SelectObject(&pen);/异或 nRop = pDC->SetROP2(R2_NOTXORPEN);/先画一条线 pDC->MoveTo(m_pt1); pDC->LineTo(m_pt2); /pDC->Rectangle(m_pt1.x,m_pt1.y,m_pt2.x,m_pt2.y);/移动 m_pt1.x = pt1.x + x; m_pt1.y = pt1.y + y; m_pt2.x = pt2.x + x; m_pt2.y = pt2.y + y;/再画一条直线 pDC->MoveTo(m_pt1); pDC->LineTo(m_pt2);/pDC->Rectangle(m_pt1.x,m_pt1.y,m_pt2.x,m_pt2.y); pDC->SetROP2(nRop);void CLine:MoveFinish(CDC* pDC,CWnd* lpWnd) CPen pen; RECT rtOld,rtNew; CPoint pt1,pt2; rtOld = GetRectangle(); pen.CreatePen(m_nPenStyle, m_nPenWidth, m_nPenColor); pt1 = m_pointArray0 = m_pt1; pt2 = m_pointArraym_pointArray.GetSize()-1 = m_pt2; rtNew = GetRectangle(); pDC->SelectObject(&pen); pDC->MoveTo(pt1); pDC->LineTo(pt2); rtOld.left -= 3; rtOld.top -= 3; rtOld.right += 3; rtOld.bottom += 3; rtNew.left -=2; rtNew.top -=2; rtNew.right +=2; rtNew.bottom +=2; lpWnd->InvalidateRect(&rtOld); lpWnd->InvalidateRect(&rtNew);/椭圆类/串型画声明 加到CRunTimeClass类中去IMPLEMENT_SERIAL(CEllipse, CObject, 1)/必须要有一个空的构造函数(为的是在从文件中读的时候要去根据类名动态创建)CEllipse:CEllipse()/带参的构造函数CEllipse:CEllipse(UINT penStyle,UINT penWidth,COLORREF color, UINT brushStyle,UINT brushColor) m_nPenWidth = penWidth; m_nPenStyle = penStyle; m_nPenColor = color; m_nBrushColor = brushColor; m_nBrushStyle = brushStyle;/析构CEllipse:CEllipse()/串型化实现 所谓的串形化就是把文件长期保存下来 这里是指放到文件中保存起来void CEllipse:Serialize(CArchive& ar)if (ar.IsStoring()ar << (WORD)m_nPenWidth; /把线宽写到文件中 ar << (WORD)m_nPenStyle; /把线风格写到文件中ar << (UINT)m_nPenColor; /把线颜色写到文件中m_pointArray.Serialize(ar); /还是 虚函数 写每个点 由于数组是系统内定的 所以我们不必再下放了elseWORD w ,s;UINT c;ar >> w; ar >> s; ar >> c;m_nPenWidth = w; /把线宽从文件中读出来 m_nPenStyle = s; /把线风格从文件中读出来 m_nPenColor = c; /把线颜色从文件中读出来m_pointArray.Serialize(ar); /还是 虚函数 读每个点 CPoint pt; pt = point; int nX1,nX2,nY1,nY2; nX1 = m_pointArray0.x; nX2 = m_pointArraym_pointArray.GetSize()-1.x; nY1 = m_pointArray0.y; nY2 = m_pointArraym_pointArray.GetSize()-1.y;/拾取的有效范围正负5个象素if (pt.x < nX1 + 5 && pt.x > nX1 - 5)return TRUE;if (pt.x < nX2 + 5 && pt.x > nX2 - 5) return TRUE;if (pt.y < nY1 + 5 && pt.y > nY1 - 5)return TRUE;if (pt.y < nY2 + 5 && pt.y > nY2 - 5) return TRUE;return FALSE;十、小结通过此次对简易CA

    注意事项

    本文(1688.图形学课程设计报告-简易CAD画图软件.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开