VB中建立用户自定义图形坐标系统的方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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=705
ScaleLeft=0, ScaleT op=0
在这样的坐标系中,图片框的左上角坐标为(0,0),左下角(0,700),右下角(940,700),右上角(940,0)。
建立用户定义坐标系统,使用Scale方法:
Picturel.Width=2894: Picture1.Height=2179
Picture1.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 ScaleT op ScaleWidth指的是Window中的Client Area即可以
画图、放元件的区域,像Title区就不在Client Area的范围。
如果我们设定ScaleMode
成不为0的数值,如设定ScaleMode = 3 (VBPixels)那麽就代表这区域的度量是以Pixels
为单位,而ScaleT op =ScaleLeft = 0,即原点在左上角。
VB提供了一个很好用的座标系统转换,即ScaleMode, ScaleLeft ScaleTop ScaleTop
ScaleWidth。
我个人不喜欢VB内定的ScaleMode = VbTwips,我爱 ScaleMode=VBPixels
原因是Window系统的度量单位是使用Pixels而不是Twips。
如果我们想在一个画面上画上座标,那麽如何才能不管Window 的大小,而只管我们所
关注的座标呢?假设我们想做一个座标,原点在Form的左下角(0,0)而右上角座标是
(100,100),那我们只要对Form如此设
ScaleTop = 100
ScaleWidth = 100
ScaleLeft = 0
ScaleHeight = -100,那就成了,这时候,如果我们去查一下Form的MouseDown的
X, Y值,会发现它的值已变成落在0-100之间了。
(此时的ScaleMode = 自动变Vbuser)
更有趣的是用来计算字串高、宽的TextHeight/TextWidth也变成以座标0-100的方式来
表现了。
例如说,
.CurrentX = 10
.CurrentY = 10
Form1.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)处印字
,那困难点变成如何得知该字串长度,第一个反应是.T extWidth,不过别忘了,
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 Form1
OldScaleLeft = .ScaleLeft
OldScaleT op = .ScaleTop
OldScaleWidth = .ScaleWidth
OldScaleHeight = .ScaleHeight
OldScaleMode = .ScaleMode
.ScaleMode = vbPixels
txtLen = .TextWidth(mystring) 'myString是待旋转的字串if OldScaleMode <> vbUser then
.ScaleMode = oldScaleMode
else
.ScaleLeft = OldScaleLeft
.ScaleTop = OldScaleTop
.ScaleWidth = OldScaleWidth
.ScaleHeight = OldScaleHeight
End If
txtHeight = .ScaleY(txtLen,vbPixels, vbUser)
End With
如此txtHeight便是字串於旋转後的高度啦!。