




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
绘图系统设计及实现目 录一、绘图系统概述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类的应用,在绘图方面实现绘制直线、矩形、圆形等基本功能,在界面设计方面实现了对图形的操作,从而从底层对绘图系统进行简单的实现。关键词:硬件系统组成 软件系统构架 图形操作及绘画技术 基本绘图功能 图形界面Design and implementation of drawing systemAbstractSince the last century, the computer system has been extended to the painting industry, computer graphics technology has become an integral part of the system. The graphics editor graphics editing software is the foundation of almost all of the graphics editing software, are in possession of basic graphics editing capabilities based on the more complex functions. It is widely used in graphics today, research and development of graphics systems is very meaningful. This article focuses on the mapping system through the analysis of hardware and software configurations, the mapping system design and implementation of a reasonable set. MFC-based operating environment, through the CD, CDC class, and CDI, CGdiobject class applications, to achieve in the drawing to draw lines, rectangles, circles and other basic functions, implemented in the interface design of graphics operations, and thus from the underlying graphics system for simple implementation.Key words:Hardware system The software system structure Graphic operation and drawing technology draw tools GUI一、绘图系统概述计算机绘图系统是基于计算机的系统,由软件系统和硬件系统组成。其中,软件是计算机绘图系统的核心,而相应的系统硬件设备则为软件的正常运行提供了基础保障和运行环境。另外,任何功能强大的计算机绘图系统都只是一个辅助工具,系统的运行离不开系统使用人员的创造性思维活动。因此,使用计算机绘图系统的技术人员也属于系统组成的一部分,将软件、硬件及人这三者有效地融合在一起,是发挥计算机系统强大功能的前提。从上世纪计算机系统向绘画界得引入到现在,计算机绘图已然成为计算机图形学的一个重要分支,其主要特点是向计算机输入非图形信息,由计算机处理后生成图形输出。二、硬件系统组成通常,将用户进行计算机绘图作业的独立硬件环境称作计算机绘图的硬件系统。计算机绘图的硬件主要由主机、输入设备(键盘、鼠标、扫描仪等)、输出设备(显示器、绘图仪、打印机等)、信息存储设备(主要指外存,如硬盘、软盘、光盘等)、以及网络设备、多媒体设备等组成1。如图1-1所示图2.1 计算机绘图系统的基本硬件组成(一)主机主机由中央处理器(CPU)和内存储器(简称内存)组成,是整个计算机绘图系统的核心。衡量一个主机性能的指标中相互要有两项:CPU性能和内存容量。1CPU性能CPU的性能决定着计算机的数据处理能力、运算精度和速度。CPU的性能通常用每秒可执行的指令数目或进行浮点运算的速度指标来衡量,其单位符号为MI/S(每秒处理1百万条指令)和GI/S(每秒处理10亿条指令)。目前,CPU的速度已达到160GI/S以上。一般情况下,用芯片的时钟频率来表示运算速度更为普遍,时钟频率越高,运算速度越快。2.内存容量内存是存放运算程序、原始数据、计算结果等内容的记忆装置。如果内存容量过小,将直接影响计算机绘图软件系统的运行效果。因为,内存容量越大,主机能容纳和处理的信息量也就越大。(二)外存储器外存储器简称为外存,虽然内存储器可以直接和运算器、控制器交换信息,存取速度很快,但内存储器成本较高,且其容量受到CPU直接寻址能力的限制。外存作为内存的后援,是计算机绘图系统将大量程序、数据库、图形库存放在外存器中,待需要时再调入内存进行处理。外存储器通常包括硬盘、软盘、光盘等。(三)图形输入设备在计算机绘图作业过程中,不仅要求用户能够快速输入图形,而且还要求能够将输入的图形以人机交互方式进行修改,以及对输入的图形进行图形变换(如缩放、平移、旋转)等操作。因此,图形输入设备在计算机绘图硬件系统中占有重要的地位。目前,计算机绘图系统常用的输入设备有键盘、鼠标、扫描仪等。(四)图形输出设备图形输出设备包括图形显示器、绘图仪、打印机等。图形显示器是计算机绘图系统中最为重要的硬件设备之一,主要用于图形图像的显示和人机交互操作,是一种交互式的图形显示设备,其主要部件是阴极射线管(CRT)。它有3种类型:直接存储管式显示器、射线刷新式显示器、光栅扫描式显示器。目前,交互式图形系统采用的主流显示器是基于CRT的光栅扫描式显示器。其工作原理与电视机相似,不同之处在于电视机利用摄像机产生的模拟信号构成屏幕上的图像,而光栅扫描式显示器则利用计算机产生的数字信号构成屏幕上的图像。衡量显示器性能的主要指标是分辨率和显示速度。对于光栅扫描式显示器而言,沿水平和垂直方向单位长度上所能识别的最大光点数称为分辨率(光点也称为像素)。对于相同尺寸的屏幕,点数越多,距离越小,分辨率就越高,显示的图形也越精细。显示速度同显示器在输出图形时采用的分辨率以及计算机本身处理图形的速度有关。从人机工程学的角度来看,通常应满足人眼观察图形时不出现闪烁这一基本要求,图形屏幕的刷新速度应不低于30帧/秒。随着人们对显示器轻型化、薄型化以及大尺寸的要求,目前,液晶显示器和等离子显示器的应用越来越多。由于这些显示器的制造成本逐渐降低,已呈现出取代基于CRT的光栅扫描式显示器的趋势。绘图仪、打印机等也是目前常用的图形输出设备。目前,常用的绘图仪为滚筒式绘图仪,这种绘图仪具有结构简单紧凑、图纸长度不受限制、价格便宜、占用工作面积小等优点。常用的打印机主要有针式、喷墨、激光打印机等。三、软件系统概述计算机软件是指控制计算机运行,并使计算机发挥最大功效的各种程序、数据及文档的集合。在计算机绘图系统中,软件配置水平决定着整个计算机绘图系统的性能优劣。因此可以说硬件是计算机绘图系统的物质基础,而软件则是计算机绘图系统的核心。从计算机绘图系统的发展趋势来看,软件占据着愈来愈重要的地位,目前,系统配置中的软件成本已经超过了硬件。目前而言,计算机绘图系统的软件可以分为3个层次,即系统软件、支撑软件和应用软件。系统软件是与计算机硬件直接关联的软件,一般由专业的软件开发人员研制,它起着扩充计算机的功能以及合理调度与使用计算机的作用。系统软件有2个特点:一是公用性,无论哪个应用领域都要用到它;二是基础性,各种支撑软件及应用软件都需要在系统软件的支撑下运行。支撑软件是在系统软件的基础上研制的,它包括进行计算机绘图作业时所需的各种通用软件。应用软件则是在系统软件及支撑软件支持下,为实现某个应用领域内的特定任务而开发的软件。下面分别对这3类软件进行具体介绍。 (一)系统软件系统软件主要用于计算机的管理、维护、控制、运行,以及计算机程序的编译、装载和运行。系统软件包括操作系统和编译系统。操作系统主要承担对计算机的管理工作,其主要功能包括文件管理(建立、存储、删除、检索文件)、外部设备管理(管理计算机的输入、输出等外部硬件设备)、内存分配管理、作业管理和中断管理。操作系统的种类很多,在工作站上主要采用UNIX、Windows 2000/NT/XP等;在微机上主要采用UNIX的变种XENIX、ONIX、VENIX,以及Windows系列操作系统。编译系统的作用是将用高级语言编写的程序翻译成计算机能够直接执行的机器指令。有了编译系统,用户就可以用接近于人类自然语言和数学语言的方式编写程序,而翻译成机器指令的工作则由编译系统完成。这样就可以使非计算机专业的各类工程技术人员很容易地用计算机来实现其绘图目的。目前,国内外广泛应用的高级语言FORTRAN、PASCAL、C/C+、Visual Basic、LISP等均有相应的编译系统2。(二)支撑软件支撑软件是计算机绘图软件系统中的核心,是为满足计算机绘图工作中一些用户的共同需要而开发的通用软件。近30多年来,由于计算机应用领域迅速扩大,支撑软件的开发研制有了很大的进展,推出了种类繁多的商品化支撑软件。(三)计算机绘图应用软件应用软件是在系统软件、支撑软件的基础上,针对某一专门应用领域而开发的软件。这类软件通常由用户结合当前绘图工作的需要自行研究开发或委托开发商进行开发,此项工作又称为“二次开发”。能否充分发挥已有计算机绘图系统的功能,应用软件的技术开发工作是很重要的,也是计算机绘图从业人员的主要任务之一四、图形操作的基本知识介绍(一)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对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。如何做才能避免出现这个问题呢,我们应该在堆栈中构造对象。看例子/ 例子void CMyView:OnLButtonDown(UINT nFlags,CPoint point) CRect rect; CClientDC dc(this); /在堆栈中构造设备环境对象,用一个窗口指针this作参数。 dc.GetClipBox(rect); /GetClipBox函数是一个虚函数,作用是可以获得选定区域的尺寸 /析构函数在函数返回时自动调用,也就完成对设备环境对象的删除。书上还给出了另一种写法:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)CRect rect; 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类的对象,可以直接构造它的派生类的对象,例如这样 CPen newPen(PS_DASHDOTDOT,2,(COLORREF) 0); /黑色的笔宽度为2 但需要注意的是CFont和CRgn的对象建立需要先调用默认的构造函数来构造C+对象,然后再调用相应的创建函数如:CreateFont或CreatePolygonRgn等。CGdiObject类有一个虚拟的析构函数,它派生类的析构函数需要将与C+对象相关联的GDI对象删除掉,一定要在退出程序之前把构造的CGdiObject派生类对象干掉。因为一个没有释放的GDI对象会占用很多的内存。让我们用一个例子跟踪一下GDI对象 void CMy10View:OnDraw(CDC* pDC) pDC-MoveTo (10,10);pDC-LineTo (110,10); CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); /红色的笔宽度为10 CPen * 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函数返回的GDI C+对象指针具有临时性,当程序的空闲处理阶段或者控制函数返回时应用程序框架会将临时的C+对象删除,我们不能简单的把这一指针保存在类的数据成员中,而应该借助GetSafeHdc函数将它转化为Windows的句柄,以便持久的保存GDI的标识。void CMy10View:OnDraw(CDC* pDC) HPEN m_hPen; /一个指向CPen对象的指针pDC-MoveTo (10,10); pDC-LineTo (110,10); COLORREF) 192); /红色的笔宽度为10 CPen * 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派生类的Windows handle type列表 CPen HPENCBrush HBRUSH CFont HFONT CBitmap HBITMACRgn HRGN (三)图形操作中颜色的变化标准的VGA显示卡使用的是8位颜色寄存器,所以它可以表示出262144种颜色,然而由于视频内存的限制、标准的VGA只能采用4位颜色代码,一次只能同时显示16种标准纯色。太少了不是吗?如何获得更加丰富的色彩呢,面向颜色的GDI函数可以使我们获得更多的颜色。每一种WINDOWS的颜色都是通过8位RGB值的组合来表示,面向颜色的GDI函数可以接收32位的COLORREF参数,这种类型的参数包含了8位的红、绿、蓝颜色值。WINDOWS的RGB宏可以将8位的红绿蓝值转化成COLORREF参数,经过模糊处理可以得到更多的颜色。我们可以这样创建刷子5:CBrush brush(RGB(128,128,192);例子 void CMy81View: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)建立一个新MFC AppWizard(exe)项目“82”,除选择单文档外其余全用默认项。 2)重载My82View类的OnPrepareDC函数 void CMy82View: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 物理宽度(毫米) 320 VERTSIZE 物理高度(毫米) 240 HORZRES 象素宽度 640 VERTRES 象素高度 480 LOGPIXEXSX 每逻辑英寸的水平点数 96 LOGPIXEXSY 每逻辑英寸的垂直点数 96 3)加入一个Private类型的辅助函数ShowFont用来显示文本。可以用Add Member Function的方法加入,也可以直接修改代码 在82View.h中加入 private: void ShowFont(CDC* pDC, int& nPos, int nPoints); /以下为原生成代码,不需改变. 在82View.cpp中加入 void CMy82View:ShowFont(CDC* pDC, int& nPos, int nPoints) TEXTMETRIC tm; TEXTMETRIC结构包含字体的所有逻辑单位信息原型如下:typedef struct tagTEXTMETRIC /* tm */int tmHeight; int tmAscent; int tmDescent; int tmInternalLeading; int tmExternalLeading; int tmAveCharWidth; int tmMaxCharWidth; int tmWeight; BYTE tmItalic;BYTE tmUnderlined; BYTE tmStruckOut;BYTE tmFirstChar; BYTE tmLastChar;BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmPitchAndFamily; int tmOverhang;int tmDigitizedAspectX; int tmDigitizedAspectY; TEXTMETRIC; CFont fontText; CString strText; CSize sizeText; 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.FormanPoint t(%d磅 WINDOWS 中文字体范例 1234567890, s); sizeText = pDC-GetTextExtent(strText); pDC-TextOut(0, nPos, strText); pDC-SelectObject(pOldFont);/恢复原来的对象 nPos -= tm.tmHeight + tm.tmExternalLeading; 4)编辑CMy82View:OnDraw函数 void CMy82View:OnDraw(CDC* pDC)int nPosition = 0; for (int i = 12; i = 24; i += 2) ShowFont(pDC, nPosition, i); 五、图形绘画程序的具体实现(一)画笔操作实现在程序运行时,软件按鼠标拖动的轨迹绘制任意的线条6。在画布上单击鼠标左键或者右键时,令画笔的绘图标志为真,并将当前坐标作为下一次绘图的起始坐标。在Picture1的MouseDown事件中添加以下代码:canpen = Truepicture1.CurrentX = x: picture1.CurrentY = y在鼠标拖动的过程中,若绘图标志为真并且鼠标按键按下,则不断地由当前坐标向新坐标的坐标画极短的直线。在Picture1的MouseMove事件中添加以下代码:If canpen And Button 0 Thenpicture1.Line -(x, y), picture1.ForeColorEnd If当释放鼠标左键时,令绘图标志位为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函数:Public Declare Function FloodFill Lib gdi32 (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long以Pictures1当前的前景色创建一个笔刷,用该笔刷代替原来的笔刷,在调用FloodFill函数完成填充后,还原原来的笔刷。编写代码如下:hBrush = CreateSolidBrush(picture1.ForeColor)hOldBrush = SelectObject(picture1.hdc, hBrush)FloodFill picture1.hdc, x, y, fill_fixed_colorSelectObject picture1.hdc, hOldBrushDeleteObject hBrush(三)直线绘制的实现在程序运行时,软件按鼠标拖动的轨迹绘制任意方向的直线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函数:Public Declare Function RoundRect Lib gdi32 (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long在绘制圆角矩形时调用API函数,x0,y0是鼠标的起始坐标,在MouseDown事件获得,最后的两个参数是圆弧的角度:RoundRect Picture1.hdc, x0, y0, x, y, 20, 20(七)多边形绘制实现在程序运行时,依次按下鼠标按键,软件将以按下按键的坐标连接直线,最后双击鼠标按键,终点坐标和起始坐标首尾相连形成封闭的多边形。用Line控件任意绘制一条线段。当鼠标在画布上点击时,该线段获得其中一个端点坐标,拖动鼠标时获得该线段的另一端点坐标,并达到预览的效果,再次单击鼠标按键时,用Line方法绘制该线段,此时该多边形的第一条线段绘制完毕,存储起点坐标为和终点坐标。再次拖动鼠标时,又可由Line控件预览,用Line方法绘制线段9。在Picture1的MouseDown中编写代码如下:If Button 0 Thenlpoly.X1 = xlpoly.Y1 = yIf Fstkey = False Then Picture1.Line (oldPoint.x, oldPoint.y)-(x, y), Picture1.ForeColorElseFstkey = Falselpoly.Visible = TrueFstPoint.x = x FstPoint.y = yEnd IfoldPoint.x = x oldPoint.y = yEnd If在Picture1的MouseMove和MouseUp中编写代码如下:lpoly.X2 = xlpoly.Y2 = y双击鼠标时,将最初绘制线段的起点坐标和最后绘制的线段的终点坐标相连,在Picture1的DblClick事件中编写代码如下:Picture1.Line (oldPoint.x, oldPoint.y)-(FstPoint.x, FstPoint.y), Picture1.ForeColor (八)喷枪的实现该功能可以产生
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《整式加减(1)》教案1
- 北京行测题库2024
- 创造力在杂技表演中的作用研究
- 2024年梧州市“三支一扶”招募笔试真题
- 激素与增生相关性-洞察及研究
- 微生物发酵强化-洞察及研究
- 查询优化与数据压缩-洞察及研究
- 电动车主充电行为分析-洞察及研究
- 成长与成功讲课件
- 2025届广东省江门蓬江区五校联考八下英语期中质量检测模拟试题含答案
- 园林行业职业道德
- 副校长笔试题库及答案
- 2025年湖北恩施州检察机关招聘雇员制检察辅助人员40人历年高频重点模拟试卷提升(共500题附带答案详解)
- 陕西省滨河2025届中考生物模拟预测题含解析
- 招标代理招标服务实施方案
- 《煤矿事故分析与预防》课件
- 幼儿园园长,教师轮训工作制度及流程
- 2025下半年江苏南京市浦口区卫健委所属部分事业单位招聘人员24人高频重点提升(共500题)附带答案详解
- 省级温室气体清单编制指南
- 医院医用耗材SPD服务项目投标方案
- 厦门大学海洋科学导论课件(水文部分)l
评论
0/150
提交评论