如何理解VB窗體中的scale類屬性
及width height屬性之間的關(guān)系
VB中的SCALEHIEGT,SCALEWIDTH,與窗體中的WIDTH,HEIGHT的區(qū)別及關(guān)系是許多VB初學(xué)者難以理解的。本人在學(xué)習(xí)DELPHI的過程中也曾經(jīng)對(duì)這類似的概論搞不清楚,但通過這次對(duì)VB中這些類似概念的學(xué)習(xí)后,可以說是已掌握了這種概念及原理了。現(xiàn)在回頭看DELPHI的相關(guān)知識(shí)點(diǎn)有豁然開朗的感覺,VB的確是可視化編程入門的最佳語(yǔ)言。
問題的提出
在VB中默認(rèn)的度量單位是緹,這是一種跟屏幕分辨率無關(guān)的一種度量單位,主要是用在打印機(jī)上的,大概是1緹=1/20磅。其它的一些單位請(qǐng)查看MSDN。使用緹就會(huì)給我們帶來一些麻煩,因?yàn)槲覀兌剂?xí)慣于使用像素來度量窗體及控件的大小,并使用顯示器當(dāng)前的分辨率作參考物來確定窗體的適當(dāng)大小,當(dāng)我們想動(dòng)態(tài)地改變窗體的大小的時(shí)候我們?cè)撊绾未_定正確的數(shù)值呢,想動(dòng)態(tài)地移動(dòng)窗體中的控件,該如何確定控件的位置呢?同時(shí),在VB的窗體中同時(shí)存在著這樣的一些屬性:scaleWidth,scaleHeight,scaleLeft,scaleTop,scaleMode,Width,Height,他們之間是怎樣的關(guān)系,是如何影響窗體中控件的大小的呢?通過下面的解說,我們就能解決上面所提到的問題。
預(yù)備知識(shí)
其實(shí)在VB中的窗體內(nèi)部(除去窗體邊框及標(biāo)標(biāo)題欄的區(qū)域)有一個(gè)類似于畫布的東西,它始終是占滿整個(gè)窗體區(qū)域的,他有一個(gè)坐標(biāo)系統(tǒng),默認(rèn)的是原點(diǎn)就是窗體的左上角,坐標(biāo)是0,0 然后往左伸延的就是X軸,往下就是Y軸了,但是這個(gè)坐標(biāo)的單位默認(rèn)就是緹,當(dāng)然我們是可以修改成其它類型的單位,要修改度量單位的話就要設(shè)定窗體的scaleMode屬性。如:設(shè)為像素scaleMode=3 。這個(gè)坐標(biāo)系統(tǒng)是用來確定要在什么位置上通過PRINT等方法來作圖的,以及確定在這個(gè)容器中的什么位置上放置控件,以及跟窗體寬和高的比例情況。
scale類屬性的作用
清楚了窗體有這樣一個(gè)畫布及它的坐標(biāo)后,我們?cè)賮砜纯从嘘P(guān)這個(gè)坐標(biāo)系統(tǒng)的屬性。這些scale類型屬性主要是用來設(shè)定畫布坐標(biāo)系統(tǒng)的數(shù)值跟窗體的高寬數(shù)值比例情況的。具體是怎樣的關(guān)系及怎樣影響在下面有論說。scaleLeft,scaleTop這兩個(gè)屬性是用來設(shè)定這個(gè)坐標(biāo)系統(tǒng)的原點(diǎn)位置的,系統(tǒng)默認(rèn)的scaleLeft,scaleTop是0,也就是說原點(diǎn)在窗體的左上角了,坐標(biāo)系統(tǒng)只有大于0的那一塊坐標(biāo),這樣的好處是可以很直觀地使用這個(gè)坐標(biāo)系統(tǒng)因?yàn)閰⒄拯c(diǎn)是0且是從窗體的左上角開始的。如果把這兩個(gè)值設(shè)定為大于0的話,畫布的坐標(biāo)就有正負(fù)區(qū)域了,這樣就更像我們數(shù)學(xué)上的坐標(biāo)系統(tǒng)了。scaleMode用于設(shè)定坐標(biāo)軸的度量單位。
width,Height的作用
這兩個(gè)屬性是用于設(shè)定窗體的寬和高,他們的單位始終是緹,會(huì)直接影響到畫布的大小及坐標(biāo)的比例情況,要?jiǎng)討B(tài)設(shè)置窗體的大小也只能通過這兩個(gè)屬性來設(shè)定。
這些屬性的關(guān)系
默認(rèn)情況下,窗體的寬和高是跟窗體上的畫布的寬和高是一樣大小的,且畫布的坐標(biāo)原點(diǎn)就是窗體的左上角。也就是說,畫布的寬和窗體的寬是1:1的關(guān)系,也就是說畫布的1緹寬度相當(dāng)于窗體的1緹寬度。那么當(dāng)我們?cè)诖绑w上用print.circle (500,500),200來畫一個(gè)圓的時(shí)候,原點(diǎn)就是在距窗體頂部500個(gè)緹,左邊500個(gè)緹,半徑是200個(gè)緹?,F(xiàn)在我們嘗試把窗體上的scaleHeight,scaleWidth修改為原來的1/2,現(xiàn)在也是用同樣的方法來畫一個(gè)圓,對(duì)比這一下現(xiàn)在的圓跟修改前的圓,可以發(fā)現(xiàn)當(dāng)前圓的半徑比原來的擴(kuò)大了一倍,而且圓心的位置也改變了。同樣的參數(shù)為什么會(huì)有不一要結(jié)果呢?這就是scaleHeigh scaleWidth起的作用,假如窗體原本的width是1000緹,scaleWidth也是1000緹,也就是說他們是1:1的關(guān)系,我們用 print.circle (500,500),200在畫布上畫出來的圓所用的尺寸單位是1:1的,明確一點(diǎn)說就是在畫布寬上所畫的一緹就是窗體寬度的一緹,但修改了scaleWidth后,比如說是原來值的一半,情況就不一樣了,畫布跟窗體的比例就變成是1:2了,在畫布看來,要用原來數(shù)值的一半來表示窗體的寬,那么只能是1個(gè)緹來表示窗體width的兩個(gè)緹了,這樣的話如果還是用原來參數(shù)來使用print方法來作圓的話,出來的圓就是原來的兩倍了。情況就有點(diǎn)像要在一張白張上把整個(gè)中國(guó)地圖畫出來一樣,張上的一毫米就相當(dāng)于實(shí)際十萬八千公里了。這就是scale屬性跟窗體width,height之間或關(guān)系了。
緹跟像素的關(guān)系
我們可以通過VB的系統(tǒng)對(duì)像screen的twipPerPixersX及twipPerPixersX屬性來返回當(dāng)前分辨率下每一像素所占緹,默認(rèn)情況下應(yīng)該是15。但這個(gè)值是不是固定的呢?答案是不的,屏幕也是一個(gè)畫布,同時(shí)也像窗體一樣有高和寬,要返回15的前提條件是scaleWidth跟width是1:1,scaleHeight跟height也是1:1。
總結(jié)
窗體上有一個(gè)畫布,它的坐標(biāo)系統(tǒng)默認(rèn)是跟窗體一樣的,但可以通過scale類屬性可以去修改。通過這些scale類屬性我們可以開發(fā)出一種具有圖形放大縮小功能的程序,只要把作圖的方法中參數(shù)保持不變,動(dòng)態(tài)改變scale屬性就可以達(dá)到目的,這種關(guān)系是成反比的,也就是說參數(shù)不變,scale減小的話圖形就放大。這類程序的例子就像是股票分析軟件中的成交量圖。
另:DELPHI也有類似的畫布機(jī)制。原理是基本上一致的。
ps:在vb中感覺真不習(xí)慣.
聯(lián)系客服