VB中建立用户自定义图形坐标系统的方法.doc_第1页
VB中建立用户自定义图形坐标系统的方法.doc_第2页
VB中建立用户自定义图形坐标系统的方法.doc_第3页
VB中建立用户自定义图形坐标系统的方法.doc_第4页
VB中建立用户自定义图形坐标系统的方法.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

VB中建立用户自定义图形坐标系统的方法VB中,窗体和图片框内可以用图形方法画图。在画图时,出于各种需要,会用到各种坐标系统。VB提供了用户定义的坐标系统以满足各种需要。由于VB使用手册等各种参考资料对这方面的叙述很简单,因此部分设计人员在定义此类坐标系统时遇到了困难。本文介绍了建立用户自定义图形坐标系统的方法。1.容器的工作区VB中,窗体、图片框和框架是常用的容器。屏幕也是一种容器,它是窗体的容器。这些容器都有各自的坐标系统。屏幕和框架的坐标系统只有一种,就是坐标原点在屏幕左上角,X轴向右,Y轴向下,刻度单位是缇(Twip,1缇=1/1440英寸)。窗体及图片框与其它容器相比,特点是在它们的工作区内可以用图形方法画图。窗体工作区就是从窗体中去掉边框及标题区后的其余部分。图片框工作区就是从图片框中去掉边框后的其余部分。通常,边框的厚度和标题区的高度与它们的BorderStyle属性(边框风格属性)及Appearance(外观属性)有关。现以一种35.56厘米(14英寸)显示器分辨率640象素480象素为例,列出几种BorderStyle属性值时非工作区部分的尺寸(Appearance属性为缺省值1):图片框BorderStyle属性为0时无边框;BorderStyle属性为1(缺省值)时左边框加右边框及上边框加下边框都是4象素(Pixel)。窗体BorderStyle属性为0时无边框无标题区;BorderStyle属性为1或为3时左边框加右边框是6象素,上边框加下边框加标题区是25象素;BorderStyle属性为2(缺省值)时左边框加右边框是8象素,上边框加下边框加标题区是27象素。象素与缇的换算关系是与显示设备有关的。在VB中求屏幕对象的TwipsPerPixelX和TwipsPerPixelY属性返回值就可得到象素与缇的换算关系。在上述显示设备的情况下,1象素等于15缇。由于象素是屏幕显示各种坐标系统的基本单位,所以与坐标有关的属性,其返回值是VB通过象素来换算的。2.与坐标系统有关的属性1. Top属性和Left属性:对象左上角在其容器坐标系中的纵和横坐标,单位取决于其容器坐标系纵横坐标轴的刻度单位。2. Height属性(高度)和Width(宽度)属性:对象的高度和宽度,单位取决于其容器坐标系纵横坐标轴的刻度单位。3. ScaleWidth属性(定标宽度)和ScaleHeight属性(定标高度)用来表示对象坐标系横纵坐标轴的刻度单位是对象工作区宽高度的多少分之一及方向,正负号表示横纵坐标轴方向,正值表示正方向向右(下),负值表示正方向向左(上)。4.ScaleTop属性和Scaleleft属性:对象工作区的左上角在本身坐标系中的纵横坐标。5.ScaleMode属性(定标方式属性):窗体和图片框的ScaleMode属性值决定了窗体和图片框所用的坐标系统。有8种值:0. 用户定义的坐标系统;1. 缺省的坐标系统,即坐标原点在工作区左上角,X轴向右,Y轴向下,刻度单位是缇;27. 坐标系统也都是坐标原点在工作区左上角,X轴向右,Y轴向下,但刻度单位分别是磅(Point)、象素(Pixel)、字符、英寸、毫米和厘米。ScaleMode属性值为17时,坐标系统是标准坐标系统。用户设置Width和Height这二个属性值之后,如把ScaleMode属性设置为17中的一个值后,VB会自动设置ScaleLeft为0、ScaleTop为0;对ScaleWidth和ScaleHeight这2个属性值,VB会将它们自动圆整为象素数的相应值(用户不能再设置这四个属性值)。例如,图片框的ScaleMode属性设置为1,Width为2887.52902.5缇及Height为2167.52182.5缇,图片框的Scalewidth返回值是2835缇(折合为189象素),图片框的ScaleHeight返回值是2155缇(折合为141象素)。3.建立用户自定义坐标系统只要用户设置了ScaleWidth、ScaleHeight、Scaletop或ScaleLeft中的任一个,则ScaleMode属性自动设置为0,而这时的坐标系统原点和坐标轴刻度单位都发生了改变,但这种改变往往需要通过计算才能看出。所以在一般情况下,不要去随便更改ScaleWidth、ScaleHeight、ScaleTop或ScaleLeft中的任一个。只有在需要建立用户自定义坐标系统时才去改变它们。现通过举例来说明如何计算有关的属性值。例:设窗体的ScaleMode为1,图片框的Width2894,Heigth2179,图片框的左右边框之和及上下边框之和都为60缇(4象素),在图片框上建立用户自定义坐标系统,坐标原点在图片框工作区左上角,其横坐标轴向右,纵坐标轴向下,刻度单位为3缇,计算如下:图片框工作区宽度为2894-60=2834缇,应取2835缇,折合为2835/3=945个新刻度单位(1象素等于5个新刻度单位);图片框工作区高度为2179-60=2119缇,应取2115缇,折合为2115/3=705个新刻度单位。所以ScaleWidth=945, ScaleHeight=705ScaleLeft=0, ScaleTop=0在这样的坐标系中,图片框的左上角坐标为(0,0),左下角(0,700),右下角(940,700),右上角(940,0)。建立用户定义坐标系统,使用Scale方法:Picturel.Width=2894: Picture1.Height=2179Picture1.Scale(0,0)-(945,705)这里,(945,705)是工作区右下角(940,740)右下方邻近象素的相应坐标。4.结束语本文对VB图形坐标系的几个见解是:1. 像素是屏幕显示各种坐标系统的基本单位,与坐标有关的属性,其返回值是VB通过象素来换算的;2. 窗体和图片框工作区尺寸的确定方法;3. Scale方法中的第2个坐标(X2,Y2)是工作区右下角右下方邻近象素在本身坐标系中的相应坐标。从而得出了定义用户坐标系的正确方法。5.参考实例试着画出函数 y=x2 的图像。界面设计:新建一个工程,添加一个命令按钮Command1,一个图片框Picture1。代码设计如下:Private Sub Command1_Click() Dim x, y As Single 定义变量 Picture1.Scale (-25, 25)-(25, -25) 定义坐标系 Picture1.Line (-20, 0)-(20, 0), RGB(0, 0, 255) 画横坐标轴 Picture1.Line (0, -20)-(0, 20), RGB(0, 0, 255) 画纵坐标轴 描点画函数图像 For x = -5 To 5 Step 0.0001 y = x 2 Picture1.Pset (x, y), RGB(255, 0, 0) Next x End Sub这里我们来看一下ScaleLeft/Top/Height/Width ScaleX ScaleY TextHeight TextWidth的一些特性与关连。所谓的ScaleLeft ScaleTop ScaleTop ScaleWidth指的是Window中的Client Area即可以画图、放元件的区域,像Title区就不在Client Area的范围。如果我们设定ScaleMode成不为0的数值,如设定ScaleMode = 3 (VBPixels)那麽就代表这区域的度量是以Pixels为单位,而ScaleTop =ScaleLeft = 0,即原点在左上角。VB提供了一个很好用的座标系统转换,即ScaleMode, ScaleLeft ScaleTop ScaleTopScaleWidth。我个人不喜欢VB内定的ScaleMode = VbTwips,我爱 ScaleMode=VBPixels原因是Window系统的度量单位是使用Pixels而不是Twips。如果我们想在一个画面上画上座标,那麽如何才能不管Window的大小,而只管我们所关注的座标呢?假设我们想做一个座标,原点在Form的左下角(0,0)而右上角座标是(100,100), 那我们只要对Form如此设ScaleTop = 100ScaleWidth = 100ScaleLeft = 0ScaleHeight = -100,那就成了,这时候,如果我们去查一下Form的MouseDown的X, Y值,会发现它的值已变成落在0-100之间了。(此时的ScaleMode = 自动变Vbuser)更有趣的是用来计算字串高、宽的TextHeight/TextWidth也变成以座标0-100的方式来表现了。例如说,.CurrentX = 10.CurrentY = 10Form1.Print HaHa,这时会见到於Form左下方会出现HaHa,它的位置便是於座标(10,10)之处,所以了,如果Form变大,Form1.Print HaHa所显示之位置也会自动更动不像其他的ScaleMode(如vbPixel),会在固定的绝对单位处显示HaHa。然而,有时候我们会想要以绝对单位来做一些事,例如:我们希望在左边算来第三个Pixels处来显示东西,的确,数学好的人可以自己转换,而像我数学不好的人,可以用ScaleX/ScaleY来做,像方才的例子,左边算来第三点(Pixels)相对应於新的座标的宽度便是Form1.ScaleX(3,vbPixels, vbUser)。再来一个有趣的问题,如果有人见过我的一篇文章,用API来任意角度旋转字型,那篇文章中字型旋转之後印在Form上,如果我们转90度,而且於(50,50)处印字,会发现它是从(50,50)处往萤幕上方写出字,如果我们想在座标(50,50)处当作字串的结束之地,那该如何呢,我会计算出该字串的长度(例如:长度20),而後在(50,70)处印字,那困难点变成如何得知该字串长度,第一个反应是.TextWidth,不过别忘了,TextWidth它随着ScaleMode的更动而变,宽度x1者,如果垂直Print,而便假设其高度也是x1是不对的(如:ScaleTop = 0, ScaleHeight = 10, ScaleLeft = 0, ScaleWidth=20,而宽度=10的字串,垂直印的高度应是不会是10,若X Y轴单位不同时也不一定是5(如果字大小不变的话)。那我会使用Pixels来做二者的转换,Pixels一个点便是一个点,所以X,Y轴的单位是相同的,当然,使用Twips也可以,只是如果中间有用上API,人家大多以Pixels为单位。With Form1OldScaleLeft = .ScaleLeftOldScaleTop = .ScaleTopOldScaleWidth = .ScaleWidthOldScaleHeight = .ScaleHeightOldScaleMode = .ScaleMode.ScaleMode = vbPixelstxtLen = .TextWidth(mystring) myString是待旋转的

温馨提示

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

评论

0/150

提交评论