绘图系统设计及实现_第1页
绘图系统设计及实现_第2页
绘图系统设计及实现_第3页
绘图系统设计及实现_第4页
绘图系统设计及实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

/绘图系统设计及实现目录一、绘图系统概述 1二、硬件系统组成 2(一)主机 2(二)外存储器 2(三)图形输入设备 2(四)图形输出设备 3三、软件系统概述 4(一)系统软件 4(二)支撑软件 4(三)计算机绘图应用软件 4四、图形操作的基本学问介绍 5(一)CD和CDC类的介绍 5(二)CDI和CGdiobject类 5(三)图形操作中颜色的变更 7五、图形绘画程序的具体实现 11(一)画笔操作实现 11(二)填充的实现 11(三)直线绘制的实现 12(四)圆形绘制的实现 12(五)矩形绘制的实现 13(六)圆角矩形的绘制实现 13(七)多边形绘制实现 13(八)喷枪的实现 14(九)运行程序界面 15六、系统测试 16七、结束语 17参考文献 18绘图系统设计及实现摘要自从上世纪计算机系统向绘画界的延长以来,绘图技术已成为计算机系统不行分割的一部分。而图形编辑器又是图形编辑软件的基础,几乎全部的图形编辑软件,都是在拥有基本图形编辑功能的基础上实现更困难功能的。故在图形应用特殊广泛的今日,探讨开发绘图系统是特殊有意义的。本文主要经过对绘图系统软硬件配置的分析,就绘图系统的设计及实现进行了合理的阐述。在基于MFC的操作环境中,通过对CD、CDC类以及CDI、CGdiobject类的应用,在绘图方面实现绘制直线、矩形、圆形等基本功能,在界面设计方面实现了对图形的操作,从而从底层对绘图系统进行简洁的实现。 关键词:硬件系统组成软件系统构架图形操作及绘画技术基本绘图功能图形界面

DesignandimplementationofdrawingsystemAbstractSincethelastcentury,thecomputersystemhasbeenextendedtothepaintingindustry,computergraphicstechnologyhasbecomeanintegralpartofthesystem.Thegraphicseditorgraphicseditingsoftwareisthefoundationofalmostallofthegraphicseditingsoftware,areinpossessionofbasicgraphicseditingcapabilitiesbasedonthemorecomplexfunctions.Itiswidelyusedingraphicstoday,researchanddevelopmentofgraphicssystemsisverymeaningful.Thisarticlefocusesonthemappingsystemthroughtheanalysisofhardwareandsoftwareconfigurations,themappingsystemdesignandimplementationofareasonableset.MFC-basedoperatingenvironment,throughtheCD,CDCclass,andCDI,CGdiobjectclassapplications,toachieveinthedrawingtodrawlines,rectangles,circlesandotherbasicfunctions,implementedintheinterfacedesignofgraphicsoperations,andthusfromtheunderlyinggraphicssystemforsimpleimplementation.Keywords:HardwaresystemThesoftwaresystemstructureGraphicoperationanddrawingtechnologydrawtoolsGUI一、绘图系统概述计算机绘图系统是基于计算机的系统,由软件系统和硬件系统组成。其中,软件是计算机绘图系统的核心,而相应的系统硬件设备则为软件的正常运行供应了基础保障和运行环境。另外,任何功能强大的计算机绘图系统都只是一个帮助工具,系统的运行离不开系统运用人员的创建性思维活动。因此,运用计算机绘图系统的技术人员也属于系统组成的一部分,将软件、硬件及人这三者有效地融合在一起,是发挥计算机系统强大功能的前提。从上世纪计算机系统向绘画界得引入到现在,计算机绘图已然成为计算机图形学的一个重要分支,其主要特点是向计算机输入非图形信息,由计算机处理后生成图形输出。二、硬件系统组成通常,将用户进行计算机绘图作业的独立硬件环境称作计算机绘图的硬件系统。计算机绘图的硬件主要由主机、输入设备(键盘、鼠标、扫描仪等)、输出设备(显示器、绘图仪、打印机等)、信息存储设备(主要指外存,如硬盘、软盘、光盘等)、以及网络设备、多媒体设备等组成[1]。如图1-1所示图2.1计算机绘图系统的基本硬件组成(一)主机主机由中心处理器(CPU)和内存储器(简称内存)组成,是整个计算机绘图系统的核心。衡量一个主机性能的指标中相互要有两项:CPU性能和内存容量。1.CPU性能CPU的性能确定着计算机的数据处理实力、运算精度和速度。CPU的性能通常用每秒可执行的指令数目或进行浮点运算的速度指标来衡量,其单位符号为MI/S(每秒处理1百万条指令)和GI/S(每秒处理10亿条指令)。目前,CPU的速度已达到160GI/S以上。一般状况下,用芯片的时钟频率来表示运算速度更为普遍,时钟频率越高,运算速度越快。2.内存容量内存是存放运算程序、原始数据、计算结果等内容的记忆装置。假如内存容量过小,将干脆影响计算机绘图软件系统的运行效果。因为,内存容量越大,主机能容纳和处理的信息量也就越大。(二)外存储器外存储器简称为外存,虽然内存储器可以干脆和运算器、限制器交换信息,存取速度很快,但内存储器成本较高,且其容量受到CPU干脆寻址实力的限制。外存作为内存的后援,是计算机绘图系统将大量程序、数据库、图形库存放在外存器中,待须要时再调入内存进行处理。外存储器通常包括硬盘、软盘、光盘等。(三)图形输入设备在计算机绘图作业过程中,不仅要求用户能够快速输入图形,而且还要求能够将输入的图形以人机交互方式进行修改,以及对输入的图形进行图形变换(如缩放、平移、旋转)等操作。因此,图形输入设备在计算机绘图硬件系统中占有重要的地位。目前,计算机绘图系统常用的输入设备有键盘、鼠标、扫描仪等。(四)图形输出设备图形输出设备包括图形显示器、绘图仪、打印机等。图形显示器是计算机绘图系统中最为重要的硬件设备之一,主要用于图形图像的显示和人机交互操作,是一种交互式的图形显示设备,其主要部件是阴极射线管(CRT)。它有3种类型:干脆存储管式显示器、射线刷新式显示器、光栅扫描式显示器。目前,交互式图形系统接受的主流显示器是基于CRT的光栅扫描式显示器。其工作原理和电视机相像,不同之处在于电视机利用摄像机产生的模拟信号构成屏幕上的图像,而光栅扫描式显示器则利用计算机产生的数字信号构成屏幕上的图像。衡量显示器性能的主要指标是辨别率和显示速度。对于光栅扫描式显示器而言,沿水平和垂直方向单位长度上所能识别的最大光点数称为辨别率(光点也称为像素)。对于相同尺寸的屏幕,点数越多,距离越小,辨别率就越高,显示的图形也越精细。显示速度同显示器在输出图形时接受的辨别率以及计算机本身处理图形的速度有关。从人机工程学的角度来看,通常应满足人眼视察图形时不出现闪烁这一基本要求,图形屏幕的刷新速度应不低于30帧/秒。随着人们对显示器轻型化、薄型化以及大尺寸的要求,目前,液晶显示器和等离子显示器的应用越来越多。由于这些显示器的制造成本慢慢降低,已呈现出取代基于CRT的光栅扫描式显示器的趋势。绘图仪、打印机等也是目前常用的图形输出设备。目前,常用的绘图仪为滚筒式绘图仪,这种绘图仪具有结构简洁紧凑、图纸长度不受限制、价格便宜、占用工作面积小等优点。常用的打印机主要有针式、喷墨、激光打印机等。三、软件系统概述计算机软件是指限制计算机运行,并使计算机发挥最大功效的各种程序、数据及文档的集合。在计算机绘图系统中,软件配置水平确定着整个计算机绘图系统的性能优劣。因此可以说硬件是计算机绘图系统的物质基础,而软件则是计算机绘图系统的核心。从计算机绘图系统的发展趋势来看,软件占据着愈来愈重要的地位,目前,系统配置中的软件成本已经超过了硬件。目前而言,计算机绘图系统的软件可以分为3个层次,即系统软件、支撑软件和应用软件。系统软件是和计算机硬件干脆关联的软件,一般由专业的软件开发人员研制,它起着扩充计算机的功能以及合理调度和运用计算机的作用。系统软件有2个特点:一是公用性,无论哪个应用领域都要用到它;二是基础性,各种支撑软件及应用软件都须要在系统软件的支撑下运行。支撑软件是在系统软件的基础上研制的,它包括进行计算机绘图作业时所需的各种通用软件。应用软件则是在系统软件及支撑软件支持下,为实现某个应用领域内的特定任务而开发的软件。下面分别对这3类软件进行具体介绍。(一)系统软件系统软件主要用于计算机的管理、维护、限制、运行,以及计算机程序的编译、装载和运行。系统软件包括操作系统和编译系统。操作系统主要担当对计算机的管理工作,其主要功能包括文件管理(建立、存储、删除、检索文件)、外部设备管理(管理计算机的输入、输出等外部硬件设备)、内存支配管理、作业管理和中断管理。操作系统的种类很多,在工作站上主要接受UNIX、Windows2000/NT/XP等;在微机上主要接受UNIX的变种XENIX、ONIX、VENIX,以及Windows系列操作系统。编译系统的作用是将用高级语言编写的程序翻译成计算机能够干脆执行的机器指令。有了编译系统,用户就可以用接近于人类自然语言和数学语言的方式编写程序,而翻译成机器指令的工作则由编译系统完成。这样就可以使非计算机专业的各类工程技术人员很简洁地用计算机来实现其绘图目的。目前,国内外广泛应用的高级语言FORTRAN、PASCAL、C/C++、VisualBasic、LISP等均有相应的编译系统[2]。(二)支撑软件支撑软件是计算机绘图软件系统中的核心,是为满足计算机绘图工作中一些用户的共同须要而开发的通用软件。近30多年来,由于计算机应用领域快速扩大,支撑软件的开发研制有了很大的进展,推出了种类繁多的商品化支撑软件。(三)\o"返回页首"计算机绘图应用软件应用软件是在系统软件、支撑软件的基础上,针对某一特地应用领域而开发的软件。这类软件通常由用户结合当前绘图工作的须要自行探讨开发或托付开发商进行开发,此项工作又称为“二次开发”。能否充分发挥已有计算机绘图系统的功能,应用软件的技术开发工作是很重要的,也是计算机绘图从业人员的主要任务之一四、图形操作的基本学问介绍(一)CD和CDC类的介绍CDC是设备环境类的基类干脆由CObject派生。是GDI的关键元素,它代表了物理设备。每一个C++设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC句柄来标识。CDC类的虚拟性使我们可以很简洁的做到编写同时适用于多种设备的代码。例如OnDraw函数的pDC->TextOut(0,0,"Hello");既可以适用于显示器、还可以适用于打印预览和打印,只须要在CView::OnDraw函数的pDC参数指向不同的对象类[3]。CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区分在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的随意地方绘图,包括窗口边框、标题栏和菜单栏等等。CWindowDC一般应用在框架窗口,而不是视图窗口。CDC对象被创建后确定要在合适的时候将它删除掉,假如遗忘了删除设备环境对象则会造成内存丢失。如何做才能避开出现这个问题呢,我们应当在堆栈中构造对象。看例子//例子voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CRectrect;CClientDCdc(this);//在堆栈中构造设备环境对象,用一个窗口指针this作参数。dc.GetClipBox(rect);//GetClipBox函数是一个虚函数,作用是可以获得选定区域的尺寸}//析构函数在函数返回时自动调用,也就完成对设备环境对象的删除。书上还给出了另一种写法:voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CRectrect;CDC*pDC=GetDC();//通过调用CWnd的GetDC()函数获得设备环境指针pDC->GetClipBox(rect);//可以获得选定区域的尺寸ReleaseDC(pDC);//确定不能遗忘,释放设备环境。(书上写错了)}创建的设备环境对象具有一些默认的特性,通过CDC类的成员函数可以设定这些特性。例如前一篇笔记用到的刷子、映射模式等等。我们还可以通过重载SelectObject函数将GDI对象选进设备环境中。(二)CDI和CGdiobject类GDI对象是通过CGdiObject派生类的C++对象来表示的[4]。CBrush是一个GDI的派生类,它在MFC中的层次结构是这样的:CObject派生CGdiObject派生CBrush,明白了吧。CGdiObject是全部GDI对象的抽象基类。下面列出的是GDI派生类的列表:CBitmap:位图是一种位矩阵,每一个显示象素都对应于其中的一个或多个位,可以用来表示图象,也可以用来创建刷子CBrush:刷子定义了一种位图形式的象素,可以用来对区域内部填充颜色。CFont:字体是一种具有某种风格和尺寸的全部字符的完整集合,常常被作为资源,其中一些依靠某种设备。CPalette:调色板是一种颜色映射接口,它允许应用程序在不影响其他应用程序的前提下,可以充分利用输出设备的颜色描绘实力。CPen:笔是一种用来画线及绘制有形边框的工具,可以指定它的颜色及宽度,并可以指定画虚线、点线还是实线。CRgn:区域是由多边形、椭圆二者组合形成的一种范围,可以用来进行填充、裁剪、鼠标点中测试等等。以上很简洁理解,可以用WINDOWS的画图帮助我们理解。CGdiObject类很眼生,看过很多代码就没有看到过它,缘由是由于CGdiObject类是全部GDI对象类的虚拟基类,所以我们不必创建CGdiObject类的对象,可以干脆构造它的派生类的对象,例如这样CPennewPen(PS_DASHDOTDOT,2,(COLORREF)0);//黑色的笔宽度为2但须要留意的是CFont和CRgn的对象建立须要先调用默认的构造函数来构造C++对象,然后再调用相应的创建函数如:CreateFont或CreatePolygonRgn等。CGdiObject类有一个虚拟的析构函数,它派生类的析构函数须要将和C++对象相关联的GDI对象删除掉,确定要在退出程序之前把构造的CGdiObject派生类对象干掉。因为一个没有释放的GDI对象会占用很多的内存。让我们用一个例子跟踪一下GDI对象voidCMy10View::OnDraw(CDC*pDC){pDC->MoveTo(10,10);pDC->LineTo(110,10);CPennewPen(PS_DASHDOTDOT,10,(COLORREF)192);//红色的笔宽度为10CPen*pOldPen=pDC->SelectObject(&newPen);//在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时复原它。pDC->MoveTo(10,20);pDC->LineTo(110,20);pDC->SelectObject(pOldPen);//把原来的对象复原pDC->MoveTo(10,30);pDC->LineTo(110,30);}屏幕上应当显示三条线,第一条和第三条一样颜色和粗细因为他们都是用的设备环境默认的CPen对象,其次条是一条用我们自己设定的CPen对象。我们可以看出在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时复原它。Windows还包含有一些可以利用的库存对象,它们不会被删除,因为Windows对企图删除它们的动作不予理睬。我们可以用SelectStockObject函数将它们选进设备环境。下面列出的是全部的有关刷子、笔、字体和调色板的库存对象。由于SelectObject函数返回的GDIC++对象指针具有临时性,当程序的空闲处理阶段或者限制函数返回时应用程序框架会将临时的C++对象删除,我们不能简洁的把这一指针保存在类的数据成员中,而应当借助GetSafeHdc函数将它转化为Windows的句柄,以便许久的保存GDI的标识。voidCMy10View::OnDraw(CDC*pDC){HPENm_hPen;//一个指向CPen对象的指针pDC->MoveTo(10,10);pDC->LineTo(110,10);COLORREF)192);//红色的笔宽度为10CPen*pOldPen=pDC->SelectObject(&newPen);//在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时复原它。m_hPen=(HPEN)pOldPen->GetSafeHandle();//获得并保存原来对象的句柄pDC->MoveTo(10,20);pDC->LineTo(110,20);pDC->SelectObject(CPen::FromHandle(m_hPen));//把原来的对象复原,和例子7-2不同的是通过句柄pDC->MoveTo(10,30);pDC->LineTo(110,30);}补充一下IGDI派生类的Windowshandletype列表CPenHPENCBrushHBRUSHCFontHFONTCBitmapHBITMACRgnHRGN(三)图形操作中颜色的变更标准的VGA显示卡运用的是8位颜色寄存器,所以它可以表示出262144种颜色,然而由于视频内存的限制、标准的VGA只能接受4位颜色代码,一次只能同时显示16种标准纯色。太少了不是吗?如何获得更加丰富的色调呢,面对颜色的GDI函数可以使我们获得更多的颜色。每一种WINDOWS的颜色都是通过8位RGB值的组合来表示,面对颜色的GDI函数可以接收32位的COLORREF参数,这种类型的参数包含了8位的红、绿、蓝颜色值。WINDOWS的RGB宏可以将8位的红绿蓝值转化成COLORREF参数,经过模糊处理可以得到更多的颜色。我们可以这样创建刷子[5]:CBrushbrush(RGB(128,128,192));例子voidCMy81View::OnDraw(CDC*pDC){pDC->SetBkColor(RGB(255,0,0));pDC->SetTextColor(RGB(198,198,198));pDC->TextOut(10,10,);}在OnDraw(CDC*pDC)函数中设定文本的背景色和前景色,我们试着变更RGB宏的数值,会发觉SetBkColor和SetTextColor函数并不总是显示模糊色,假如模糊色过于困难,它们会选择和之相近的纯色来显示。书上是这样说的。以目前的硬件设备来说我们可以在1024X768的方式下获得24位真彩色,这意味着我们可以通过RGB宏获得任何我们想要的颜色,其实我们的肉眼已经不能辨别它们的区分了。其实256色已经足够作出很精致的画面了。下面我们来看看字体。字体是GDI对象,和其他GDI对象一样它可以按比例缩放,被裁剪,可以被选进设备环境,并可以被释放和删除。书上对于字体部分描述实在令我不情愿读,我想大家可能也是这样的心情。那好我们便不去读它,干脆用一个例子来理解字体。例子1)建立一个新MFCAppWizard(exe)项目“82”,除选择单文档外其余全用默认项。2)重载My82View类的OnPrepareDC函数voidCMy82View::OnPrepareDC(CDC*pDC,CPrintInfo*pInfo){pDC->SetMapMode(MM_ANISOTROPIC);//应当还记得此种映射模式是X,Y的比例因子可以独立变更pDC->SetWindowExt(1440,1440);//将映射模式设置成逻辑twips即一个逻辑单位等于1/1440逻辑英寸。pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),-pDC->GetDeviceCaps(LOGPIXELSY));用SetWindowExt和SetViewportExt定义比例GetDeviceCaps函数可以获得各种显示参数,典型的参数如下:在640X480辨别率下:HORZSIZE物理宽度(毫米)320VERTSIZE物理高度(毫米)240HORZRES象素宽度640VERTRES象素高度480LOGPIXEXSX每逻辑英寸的水平点数96LOGPIXEXSY每逻辑英寸的垂直点数96}3)加入一个Private类型的帮助函数ShowFont用来显示文本。可以用AddMemberFunction的方法加入,也可以干脆修改代码在82View.h中加入{private:voidShowFont(CDC*pDC,int&nPos,intnPoints);//以下为原生成代码,不需变更}在82View.cpp中加入voidCMy82View::ShowFont(CDC*pDC,int&nPos,intnPoints){TEXTMETRICtm;TEXTMETRIC结构包含字体的全部逻辑单位信息原型如下:typedefstructtagTEXTMETRIC{/*tm*/inttmHeight;inttmAscent;inttmDescent;inttmInternalLeading;inttmExternalLeading;inttmAveCharWidth;inttmMaxCharWidth;inttmWeight;BYTEtmItalic;BYTEtmUnderlined;BYTEtmStruckOut;BYTEtmFirstChar;BYTEtmLastChar;BYTEtmDefaultChar;BYTEtmBreakChar;BYTEtmPitchAndFamily;inttmOverhang;inttmDigitizedAspectX;inttmDigitizedAspectY;}TEXTMETRIC;CFontfontText;CStringstrText;CSizesizeText;ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,"Tahoma");//调用CFont::CreateFont函数,建立GDI的字体对象,参数1和2是字体的高度和宽度,最终一个参数是字体的名称CFont*pOldFont=(CFont*)pDC->SelectObject(&fontText);//将新字体选进设备,并返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时复原它pDC->GetTextMetrics(&tm);//参数是指向TEXTMETRIC结构的指针,得到当前字体的属性,strText.FormanPointt("%d磅WINDOWS中文字体范例1234567890",s);sizeText=pDC->GetTextExtent(strText);pDC->TextOut(0,nPos,strText);pDC->SelectObject(pOldFont);//复原原来的对象nPos-=tm.tmHeight+tm.tmExternalLeading;}4)编辑CMy82View::OnDraw函数voidCMy82View::OnDraw(CDC*pDC){intnPosition=0;for(inti=12;i<=24;i+=2){ShowFont(pDC,nPosition,i);}五、图形绘画程序的具体实现(一)画笔操作实现在程序运行时,软件按鼠标拖动的轨迹绘制随意的线条[6]。在画布上单击鼠标左键或者右键时,令画笔的绘图标记为真,并将当前坐标作为下一次绘图的起始坐标。在Picture1的MouseDown事务中添加以下代码:canpen=Truepicture1.CurrentX=x:picture1.CurrentY=y在鼠标拖动的过程中,若绘图标记为真并且鼠标按键按下,则不断地由当前坐标向新坐标的坐标画极短的直线。在Picture1的MouseMove事务中添加以下代码:IfcanpenAndButton<>0Thenpicture1.Line-(x,y),picture1.ForeColorEndIf当释放鼠标左键时,令绘图标记位为False,并保存当前绘图所用颜色,结束绘图,在Picture1的MouseUp事务中添加以下代码:fill_fixed_color=picture1.ForeColor'给油漆桶供应边框颜色canpen=False橡皮擦操作和画笔操作的编程思路相同。在运用橡皮工具时鼠标指针的变更为十字形,Shape1作为擦除区域设置为可见。擦除区域的大小可依据线宽设置。在Picture1的MouseDown事务中添加以下代码:canrubber=Truepicture1.CurrentX=x:picture1.CurrentY=yShape1.Visible=Truepicture1.MousePointer=2Shape1.Width=(Combo1.ListIndex+1)*10Shape1.Height=(Combo1.ListIndex+1)*10(二)填充的实现以指定颜色填充随意闭合区域,该功能必需通过调用windows的API函数来实现。声明API函数:PublicDeclareFunctionFloodFillLib"gdi32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong,ByValcrColorAsLong)AsLong以Pictures1当前的前景色创建一个笔刷,用该笔刷代替原来的笔刷,在调用FloodFill函数完成填充后,还原原来的笔刷。编写代码如下:hBrush=CreateSolidBrush(picture1.ForeColor)hOldBrush=SelectObject(picture1.hdc,hBrush)FloodFillpicture1.hdc,x,y,fill_fixed_colorSelectObjectpicture1.hdc,hOldBrushDeleteObjecthBrush(三)直线绘制的实现在程序运行时,软件按鼠标拖动的轨迹绘制随意方向的直线[7]。在画布上单击鼠标左键或者右键时,令画直线的绘图标记为真,保存当前的绘图坐标,设置DrawMode为异或方式。在Picture1的MouseDown事务中添加以下代码:canline=Truex0=x:y0=yxnow=x:ynow=ypicture1.DrawMode=7在鼠标拖动的过程中,若绘图标记为真并且鼠标按键按下,则不断循环两条语句,第一条语句用于画一条直线和前一个循环所画的直线重合,由于绘图方式是异或方式,所以已画直线直线被清除,后一条语句用于画一条新的直线,这两条不断循环的语句是:picture1.Line(x0,y0)-(xnow,ynow),Not(picture1.ForeColor)picture1.Line(x0,y0)-(x,y),Not(picture1.ForeColor)再在循环中令当前鼠标坐标作为下一个循环的终点坐标xnow=x:ynow=y当释放鼠标左键时,令绘图标记位为False,用一般的绘图方式将画好的直线重新绘制一次,以免和之前绘制的直线重叠而导致直线被清除。保存当前绘图所用颜色,结束绘图,在Picture1的MouseUp事务中添加以下代码:canline=Falsepicture1.Line(x0,y0)-(xnow,ynow)picture1.DrawMode=13picture1.Line(x0,y0)-(xnow,ynow),picture1.ForeColorfill_fixed_color=picture1.ForeColor(四)圆形绘制的实现在程序运行时,软件按鼠标拖动的轨迹绘制随意大小的圆形。首先将画布上的图像临时复制到另一个Picture控件中。在Picture1的MouseDown事务中添加以下代码:'新添加一个Picture控件Picture1_copy作为临时的画布Picture1_copy.Height=Picture1.HeightPicture1_copy.Width=Picture1.WidthPicture1_copy.Picture=Picture1.image在拖动鼠标时,用circle方法绘制圆形,每次拖动鼠标都把上一次用circle方法绘制的图像清除并载入未绘制圆形的图像,按新的鼠标坐标重新绘制半径不同的圆形,从而达到预览的效果。在Picture1的MouseMove事务中添加以下代码:Picture1.ClsPicture1.Picture=Picture1_copy.imagePicture1.Circle(x0,y0),Sqr((x-x0)*(x-x0)+(y-y0)*(y-y0)),Picture1.ForeColor最终在鼠标弹起时再次载入原来的图像,重新绘制已经确定半径的圆形。在Picture1的MouseUp事务中添加以下代码:Picture1.Picture=Picture1_copy.imagePicture1.Circle(x0,y0),Sqr((x-x0)*(x-x0)+(y-y0)*(y-y0)),Picture1.ForeColor(五)矩形绘制的实现通过拖动鼠标可以绘制不同长宽比例的矩形。绘制矩形的编程思路和绘制直线相同,但在用Line方法绘制图形时,应设置第三个参数为B,这样就可以利用对角坐标画出矩形。用橡皮筋画法实现矩形和直线工具[8]。绘制矩形工具的流程图,如图3-9所示:

Picture1.Line(x0,y0)-(xnow,ynow),not(picture1.forecolor),B

Picture1.Line(x0,y0)-(x,y),not(picture1.forecolor),B(六)圆角矩形的绘制实现通过拖动鼠标可以绘制不同长宽比例的矩形,该功能的实现和绘制圆形的思路一样,但必需通过调用Windows的API函数来实现。声明API函数:PublicDeclareFunctionRoundRectLib"gdi32"(ByValhdcAsLong,ByValX1AsLong,ByValY1AsLong,ByValX2AsLong,ByValY2AsLong,ByValX3AsLong,ByValY3AsLong)AsLong在绘制圆角矩形时调用API函数,x0,y0是鼠标的起始坐标,在MouseDown事务获得,最终的两个参数是圆弧的角度:RoundRectPicture1.hdc,x0,y0,x,y,20,20(七)多边形绘制实现在程序运行时,依次按下鼠标按键,软件将以按下按键的坐标连接直线,最终双击鼠标按键,终点坐标和起始坐标首尾相连形成封闭的多边形。用Line控件随意绘制一条线段。当鼠标在画布上点击时,该线段获得其中一个端点坐标,拖动鼠标时获得该线段的另一端点坐标,并达到预览的效果,再次单击鼠标按键时,用Line方法绘制该线段,此时该多边形的第一条线段绘制完毕,存储起点坐标为和终点坐标。再次拖动鼠标时,又可由Line控件预览,用Line方法绘制线段[9]。在Picture1的MouseDown中编写代码如下:IfButton<>0Thenlpoly.X1=xlpoly.Y1=yIfFstkey=FalseThenPicture1.Line(oldPoint.x,oldPoint.y)-(x,y),Picture1.ForeColorElseFstkey=Falselpoly.Visible=TrueFstPoint.x=xFstPoint.y=yEndIfoldPoint.x=xoldPoint.y=yEndIf在Picture1的MouseMove和MouseUp中编写代码如下:lpoly.X2=xlpoly.Y2=y双击鼠标时,将最初绘制线段的起点坐标和最终绘制的线段的终点坐标相连,在Picture1的DblClick事务中编写代码如下:Picture1.Line(oldPoint.x,oldPoint.y)-(FstPoint.x,FstPoint

温馨提示

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

评论

0/150

提交评论