VB中建立用户自定义图形坐标系统的方法
- 格式:doc
- 大小:37.00 KB
- 文档页数:5
VB中建立用户自定义图形坐标系统的方法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中建立用户自定义图形坐标系统的方法
王晋棠;朱昊
【期刊名称】《智能计算机与应用》
【年(卷),期】1999(000)005
【摘要】@@ VB中,窗体和图片框内可以用图形方法画图.在画图时,出于各种需要,会用到各种坐标系统.VB提供了用户定义的坐标系统以满足各种需要.由于VB使用手册等各种参考资料对这方面的叙述很简单,因此部分设计人员在定义此类坐标系统时遇到了困难.本文介绍了建立用户自定义图形坐标系统的方法.
【总页数】1页(P21)
【作者】王晋棠;朱昊
【作者单位】无锡轻工大学西山校区CAD教研室;无锡轻工大学西山校区CAD教研室
【正文语种】中文
【中图分类】TP3
【相关文献】
1.PRO/ENGINEER中的用户自定义特征的建立和使用 [J], 王崴
2.在VB中设计用户自定义控件 [J], 陈巍
3.Visual C#.NET实现用户自定义图形编程方法 [J], 朱卫新
4.在UG Ⅱ系统中建立用户自定义刀具库 [J], 吴勤
5.在UG Ⅱ系统中建立用户自定义刀具库 [J], 吴勤
因版权原因,仅展示原文概要,查看原文内容请购买。
VB的坐标系统综述由于在visual basic系统中有多种坐标定义,容易使初学者混淆,本文将详细总结vb的坐标系统的一些基本概念,并提供坐标定义的详细方法:visual basic 坐标系统概述:visual basic 的坐标系统是指在屏幕(screen)、窗体(form)、容器(container)上定义的表示图形对象位置的平面二维格线,一般采用数对(x,y)的形式定位。
其中,x 值是沿x 轴点的位置,最左端是缺省位置 0。
y 值是沿 y 轴点的位置,最上端是缺省位置 0。
在visual basic坐标系中,沿坐标轴定义位置的测量单位,统称为刻度,坐标系统的每个轴都有自己的刻度。
坐标轴的方向、起点和刻度都是可变的,在后面的叙述中,将讨论如何改变这些定义。
如何创建坐标系统:创建图形对象的坐标系统,一般有以下几种方法:1、使用系统缺省定义:在系统缺省状态下,visual basic使用twips坐标系,以’缇’为单位(1缇的长度等于1/1440英寸;1/567厘米;1/20磅)。
应当注意的是:这些值指示的是图形对象打印尺寸的大小。
而在计算机屏幕上的物理距离则根据监视器的大小及分辨率的变化而变化。
2、选择系统标准刻度定义:除了缺省的twips坐标系外,用户还可以通过对象的scalemode 属性来设置其它的坐标刻度:(共有8种设置),现将这些设置列表如下:scalemode值表示说明0 user 用户自定义1 twip 缇,系统缺省设置2 point 磅,每英寸约为72磅3 pixel 像素,像素是监视器或打印机分率的最小单位。
每英寸里像素的数目由系统设备的分辨率决定。
4 character 字符,打印时,一个字符高 1/6 英寸,宽1/12 英寸5 inch 英寸,每英寸为2.54厘米6 millimeter 毫米7 centimeter 厘米在上述设置值中,除了0 和3以外,其它所有模式都是打印机所打印的单位长度。
(十二)图形设计12.1 系统标准坐标系在VB中,每具对象定位于存放它的容器内,对象定位都要使用容哭喊听坐标系,对象的Left.Top属性指示了该对象在容器内的位置。
例如:窗体处于屏幕内,屏幕是窗体的容器;在窗体内绘制控件,窗体就是控件的容器在图形框内绘制图形,该图形框就是容器。
对象只能在容器界定的范围内变动。
当移动容器时,容器内的对象也随着一起移动,而且与容器的相对位置保持不变。
每一个容器都有一个坐标系。
构成一个坐标系需要三个要素:坐标原点、坐标度量单位、坐标由长度与方向。
VB提供了系统标准和用户自定义两种方法的坐标系。
1、坐标原点~根据Scaletop和Scaleft两个属性值形成的。
(1):Scaletop:控制器对象左边的坐标。
(2):Scaleleft;控制器对象顶端的坐标所有对象的Scaletop及Scaleleft的属性的默认值均为0,坐标原点在左上角。
2、标度量单位~Scalenlode属性控件。
坐标系的度量单位常用的有8种,详见教材126页的表8-1注意:改变Scalemode属性并不改变器的大小和它在窗体上的位置,只是改变它的度量的单位而已。
3、坐标原点~根据Scaletop和Scaleft两个属性值形成的。
4、坐标轴的长度与方向(1) Scaleteight(2) Scalewidth(3) Height(4) Width无论采用哪种坐标单位,默认的坐标原点为对象的左上角,横向向右为X轴的正向。
纵向向下为Y轴的正向。
12.2 自定义坐标系由于系统默认的坐标系统对于绘制某些曲线图形不太方便,因而用户可以通过修改它们的属性来自行定义坐标系。
Scale方法是建立用户坐标系最方便的方法。
其语法格式为:〔对象〕Scale[(xleft,ytop)-(xright,ybutton)]其中:(1)对象可以是Form、Picturebox或Priinter(打印机)如果省略对象名,则为带有焦点的窗体对象。
自定义坐标系me.scale (左上角坐标)-(右下角坐标)比如:Me.Scale (-10, 10)-(10, -10)定义了原点在中心,坐标轴长度都是20的坐标系‘-----------------------------------------------------------------------------------------------------------Picture1.Scale (-100, 100)-(100, -100)左上角坐标(-100,100)右下角坐标(100,-100)原点在中间‘---------------------------------------------------------------------------------------------------------------------Private Sub Form_Load()Picture1.Scale (-110, 110)-(110, -110)Picture1.DrawWidth = 5Picture1.PSet (0, -100)Picture1.PSet (0, 100)Picture1.PSet (-100, 0)Picture1.PSet (100, 0)Picture1.PSet (0, 0)Picture1.DrawWidth = 1Label1.Caption = ""Label2.Caption = ""End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Label1.Caption = "坐标是:" & X & "," & YIf Y = 0 Then Exit Suba = Atn(X / Y)If X >= 0 And Y >= 0 ThenLabel2.Caption = "方位角是:" & a * 180 / 3.14159265358979Exit SubEnd IfIf X < 0 And Y >= 0 ThenLabel2.Caption = "方位角是:" & 360 + a * 180 / 3.14159265358979Exit SubEnd IfIf Y < 0 ThenLabel2.Caption = "方位角是:" & 180 + a * 180 / 3.14159265358979 End IfEnd Sub‘--------------------------------------------------------------------------------------------------------------------更正Me.Scale (0, -1000)-(1000, 0) ' 定原点在左下角‘-----------------------------------------------------------------------------------------------------------这似乎是画图区域里的Y坐标都要变成负值了???想要一个正常的左下角为坐标原点应为如下:Me.Scale (0, 1000)-(1000, 0)‘------------------------------------------------------------------------------------------------------------Const Pi = 3.141592653589Rem 原理:1;利用逐点计算的算法是:若在图像框中有以源点,其坐标为(X,Y),图像要旋转的角度为K,则' x0=X*cos(-K)+Y*sin(-K)' y0=Y*Cos(-K)-X*Sin(-K)Private Sub Command1_Click()Dim X As DoubleDim Y As DoubleDim x0 As Double, y0 As Double, Xc As Double, Yc As DoubleDim Xn As DoubleDim K As SingleDim pcorlor As LongPicture2.ClsK = Val(Text1.Text) * Pi / 180 ’Text1用来输入旋转角度Picture1.ScaleMode = vbPixels '以VB 像素为刻度Picture2.ScaleMode = vbPixelsFor X = 0 To Picture1.ScaleWidth - 1Xc = X - Picture1.ScaleWidth \ 2 '为什么原坐标要加上Picture1.ScaleWidth\2 ?For Y = 0 To Picture1.ScaleHeight - 1Yc = Y - Picture1.ScaleHeight \ 2x0 = Xc * Cos(-K) + Yc * Sin(-K)y0 = Yc * Cos(-K) - Xc * Sin(-K)Xn = x0 + Picture2.ScaleWidth \ 2yn = y0 + Picture2.ScaleHeight \ 2pcorlor = Picture1.Point(X, Y) '提取像素值再重放的写法Picture2.PSet (Xn, yn), pcorlorNext YNext X'旋转角度越大,新图越多白点,是因为以Vb像素做单位的缘故吗? ,怎么解决?End SubPrivate Sub Command2_Click()Picture1.Scale (-500, 500)-(500, -500)Picture2.Scale (-500, 500)-(500, -500)For X = -500 To 500For Y = -500 To 500corlor = Picture1.Point(X, Y)Picture2.PSet (-X, Y), corlor '这里想左右上下小小改一下代码就行 Next YNext X'要是整个旋转180度的话,执行完后新图像会自动消失,怎么回事?End SubPrivate Sub Command3_Click()Picture1.Scale (-500, 500)-(500, -500)Picture2.Scale (-500, 500)-(500, -500)For X = -500 To 500For Y = -500 To 500corlor = Picture1.Point(X, Y)Picture2.PSet (X, -Y), corlorNext YNext XEnd SubPrivate Sub Command4_Click() ’ 选区处理X1 = Val(Text2.Text)Y1 = Val(Text3.Text)X2 = Val(Text4.Text)Y2 = Val(Text5.Text)'这样的坐标系和怎么重新分配像素都要重新考虑,I'll come back laterPicture1.Scale (-500, 500)-(500, -500)Picture2.Scale (-500, 500)-(500, -500)For X = X1 To X2For Y = X2 To Y2corlor = Picture1.Point(X, Y)Picture2.PSet (X, -Y), corlorNext YNext XEnd SubPrivate Sub Form_Load()Text1.Text = "0"Picture1.ScaleMode = vbPixels '以VB 像素为刻度Picture2.ScaleMode = vbPixelsEnd Sub"The more I know,[color=SeaG‘------------------------------------------------------------------------------------------------------------------- 笛卡尔坐标系Dim l As SingleDim t As SingleDim w As SingleDim h As SingleDim i As IntegerConst X = 110Const Y = 90Private Sub Form_activate() '定义坐标系Picture1.ScaleMode = 6Picture1.Scale (-500, 500)-(500, -500)Picture1.Line (-500, 0)-(500, 0)Picture1.Line (0, 500)-(0, -500)Dim i As Integer '标x轴刻度For i = -500 To 500 Step 100Picture1.Line (i, 10)-(i, 0)Picture1.CurrentX = i: Picture1.CurrentY = -10: Picture1.Print iNext i '标y轴刻度For i = -500 To 500 Step 100Picture1.Line (10, i)-(0, i)If i <> 0 Then Picture1.CurrentX = 10: Picture1.CurrentY = i: Picture1.Print i Next iPicture1.Line (Y, Y)-(X, X), vbRedPicture1.Line (Y, X)-(X, Y), vbRedPicture1.Line (-Y, -Y)-(-X, -X), vbRedPicture1.Line (-Y, -X)-(-X, -Y), vbRedEnd Sub‘-------------------------------------------------------------------------------------------------------------------- Form1.Height = Form1.Width + 520Form1.Scale (-50, 50)-(50, -50)‘-----------------------------------------------------------------------------------------------------------me.scale (左上角坐标)-(右下角坐标)比如:Me.Scale (-10, 10)-(10, -10)定义了原点在中心,坐标轴长度都是20的坐标系‘------------------------------------------------------------------------------------------------------------Private Sub Form_activate() '定义坐标系Picture1.ScaleMode = 6Picture1.Scale (-500, 500)-(500, -500)Picture1.Line (-500, 0)-(500, 0), vbBlackPicture1.Line (0, 500)-(0, -500)Dim i As Integer'标x轴刻度For i = -500 To 500 Step 100Picture1.Line (i, 10)-(i, 0)Picture1.CurrentX = i: Picture1.CurrentY = -10: Picture1.Print iNext i'标y轴刻度For i = -500 To 500 Step 100Picture1.Line (10, i)-(0, i)If i <> 0 Then Picture1.CurrentX = 10: Picture1.CurrentY = i: Picture1.Print iNext iEnd Sub‘------------------------------------------------------------------------------------------------------------ 更正Me.Scale (0, -1000)-(1000, 0) ' 定原点在左下角‘------------------------------------------------------------------------------------------------------------VB定义坐标系VB定义坐标系,简略,VB在窗体上定义一个简单的坐标系曲线,设定X/Y坐标和原点,用VB结合图形绘制的相关小例子。
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轴向下,刻度单位是缇;2~7. 坐标系统也都是坐标原点在工作区左上角,X轴向右,Y轴向下,但刻度单位分别是磅(Point)、象素(Pixel)、字符、英寸、毫米和厘米。
ScaleMode属性值为1~7时,坐标系统是标准坐标系统。
用户设置Width 和Height这二个属性值之后,如把ScaleMode属性设置为1~7中的一个值后,VB会自动设置ScaleLeft为0、ScaleTop为0;对ScaleWidth和ScaleHeight 这2个属性值,VB会将它们自动圆整为象素数的相应值(用户不能再设置这四个属性值)。
例如,图片框的ScaleMode属性设置为1,Width为2887.5~2902.5缇及Height为2167.5~2182.5缇,图片框的Scalewidth返回值是2835缇(折合为189象素),图片框的ScaleHeight返回值是2155缇(折合为141象素)。
3.建立用户自定义坐标系统只要用户设置了ScaleWidth、ScaleHeight、Scaletop或ScaleLeft中的任一个,则ScaleMode属性自动设置为0,而这时的坐标系统原点和坐标轴刻度单位都发生了改变,但这种改变往往需要通过计算才能看出。
所以在一般情况下,不要去随便更改ScaleWidth、ScaleHeight、ScaleTop或ScaleLeft中的任一个。
只有在需要建立用户自定义坐标系统时才去改变它们。
现通过举例来说明如何计算有关的属性值。
例:设窗体的ScaleMode为1,图片框的Width=2894,Heigth=2179,图片框的左右边框之和及上下边框之和都为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.0001y = x ^ 2Picture1.Pset (x, y), RGB(255, 0, 0)Next xEnd 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(如果字大小不变的话)。