VB中對(duì)象隨窗體而改變大小的方法總結(jié)
L0ftFC
前些時(shí)在做VB的編程研究時(shí),發(fā)現(xiàn)一個(gè)問(wèn)題:針對(duì)某一窗體(FORM),若它在運(yùn)行過(guò)程中人為改變其大小(即Resize),如何讓該窗體內(nèi)的對(duì)象也隨之改變呢?于是對(duì)此鄙人做了一下的一個(gè)方法小總結(jié),僅供參考,如有遺漏,請(qǐng)見諒,如有高見,請(qǐng)不吝惜賜教。
問(wèn)題的核心是要等比縮放對(duì)象,所以關(guān)鍵應(yīng)該在如何改變對(duì)象的大小上。而針對(duì)不同的對(duì)象,也有當(dāng)然有其不同的方法,在此我暫將對(duì)象分為兩類:1.固有對(duì)象;2.構(gòu)造對(duì)象。
1.固有對(duì)象:
即VB本身提供的對(duì)象接口,它們是實(shí)體對(duì)象,且君有其固定的屬性值,并且屬性值只可修改而不能創(chuàng)造的這一類對(duì)象。例如:CommandButton , Textbox , Label,PictureBox 等。
針對(duì)固有對(duì)象的特性,很自然想到用類來(lái)進(jìn)行對(duì)象放縮,一下是我的一個(gè)操作方案:
A.定義類(即比例尺):
'定義一個(gè)類用于保存每個(gè)控件的放大比例
Type MyControl
mcTop As Single
mcLeft As Single
mcHeight As Single
mcWidth As Single
End Type
定義這樣一個(gè)類的目的,就是在窗體加載時(shí)記錄下窗體內(nèi)的對(duì)象和窗體初始時(shí)的比例尺。
B.初始化類(獲取比例尺):
'用于在form_load時(shí)初始化控件與窗體的初始比例,用于以后原始比例放大
Private Function InitMycont(Obj As Control, mcControl As MyControl)
mcControl.mcLeft = Obj.Left / Form1.ScaleWidth
mcControl.mcTop = Obj.Top / Form1.ScaleHeight
mcControl.mcWidth = Obj.Width / Form1.ScaleWidth
mcControl.mcHeight = Obj.Height / Form1.ScaleHeight
End Function
這樣針對(duì)該類,我現(xiàn)在便有了一個(gè)初始化操作了。
C.按類的記錄改變對(duì)象的屬性(按比例尺縮放):
'用于在form_resize時(shí)對(duì)控件進(jìn)行比例放大
Private Function ChangeMycont(Obj As Control, mcControl As MyControl)
Obj.Left = mcControl.mcLeft * Form1.ScaleWidth
Obj.Top = mcControl.mcTop * Form1.ScaleHeight
Obj.Width = mcControl.mcWidth * Form1.ScaleWidth
Obj.Height = mcControl.mcHeight * Form1.ScaleHeight
End Function
經(jīng)過(guò)以上三步后,我便有了一個(gè)完整的面向縮放對(duì)象的編程方式(包含類及其基本操作)了,但我們?cè)撊绾问褂眠@個(gè)類呢?沒錯(cuò),初始化一定是在窗體加載(Form_Load)時(shí)使用,而改變大小操作就放在窗體改變(Form_Resize)時(shí)操作啦!代碼如下:
'調(diào)用InitMycont()函數(shù)初始化放大比例
Private Sub Form_Load()
a = InitMycont(Command1, mcControl(1))
b = InitMycont(Text1, mcControl(2))
End Sub
'調(diào)用changMycont()函數(shù)進(jìn)行按比例的放大
Private Sub Form_Resize()
a = ChangeMycont(Command1, mcControl(1))
b = ChangeMycont(Text1, mcControl(2))
End Sub
以上便實(shí)現(xiàn)了固有對(duì)象的大小變化。
2.構(gòu)造對(duì)象
即針對(duì)于VB中的圖形編程而言的,特別是那些直接在窗體上所做的圖形(因?yàn)樘热粼赑ictureBox中做圖,仍然屬于固有對(duì)象的范疇)。對(duì)于固有對(duì)象,當(dāng)窗體縮小以至于比固有對(duì)象還小時(shí),固有對(duì)象僅僅是被遮蓋了,當(dāng)窗體放大后,對(duì)象仍然完整。但是對(duì)于圖形等構(gòu)造對(duì)象而言,即使窗體再放大,原來(lái)的圖形一旦被遮蓋,就無(wú)法像固有對(duì)象一樣依舊完整了。
當(dāng)然,凡事有弊必有利。既然圖形本身是可重構(gòu)的,為何不在窗體改變時(shí)重新構(gòu)造原有的圖形呢?
VB在做圖形編程時(shí),有兩種方法:1.絕對(duì)坐標(biāo);2.自定義坐標(biāo)。然而VB中的自定義坐標(biāo)本身就是一個(gè)相對(duì)值集合,即無(wú)論窗體怎么變化,坐標(biāo)的值是相對(duì)值,值是不變,那么我們?cè)谶@樣一個(gè)坐標(biāo)下所做的圖形本身就具有隨窗體大小改變的能力。于是,我自創(chuàng)了如下方法:
A.根據(jù)需求建立自定義坐標(biāo):
e.g: Scale (-1, 1)-(1, -1) ‘建立了一個(gè)自定義坐標(biāo)
注:VB默認(rèn)的x軸正方向是向右沒問(wèn)題,但是y軸正方向是向下的,所以想定義一個(gè)標(biāo)準(zhǔn)笛卡爾坐標(biāo)系(即直角坐標(biāo)系,y軸正方向向上),起始點(diǎn)與終止點(diǎn)的y坐標(biāo)正好反過(guò)來(lái)了。
B.利用圖形工具(PSet,Circle,Line)作“持久圖形”
e.g: AutoRedraw = True
Circle (x, y) ‘畫一個(gè)可持久的圓
注:這里“可持久”并非真的持久不變,只是將圖形的AutoRedraw打開了。這樣該圖形在每一次被加載時(shí)都會(huì)重畫一次,再加上自定義坐標(biāo)的相對(duì)性,于是每改變一次,圖形都會(huì)根據(jù)當(dāng)前坐標(biāo)再做一次圖,圖形就能夠縮放了。不過(guò)這里的AutoRedraw 屬性只針對(duì)一個(gè)圖形,假若有兩個(gè)圖形同時(shí)產(chǎn)生,想要它們均可重畫,必須對(duì)每個(gè)圖形定義前加上“AutoRedraw = True”
e.g: AutoRedraw = True
Circle (50, 50), 30 '一個(gè)實(shí)心圓(持久圖形)
AutoRedraw = False
Circle (70, 70), 10 '一個(gè)實(shí)心圓(臨時(shí)圖形)