国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

VB6.0自制Line控件時實現X1,Y1,X2,Y2屬性

2024-07-21 02:21:10
字體:
來源:轉載
供稿:網友
line控件本來是最簡單的一個控件,但它太簡單了,以至于不提供我們想要的一些事件,為了增強它的功能,我自己制作了一個line控件,還

給她取名叫作mline控件。

制作控件的方法請參看"msdn - visual basic 文檔 - 使用visual basic -部件工具指南 - 創建activex部件"中的"創建一個activex控件"和"

建立activex控件"部分。


vb自帶的line控件有x1,x2,y1,y2四個屬性,沒有left,top,width,height這四個屬性,通過調整x1-y2四個屬性的值,來改變線條的位置和形狀

。但,我們的mline控件中只有ltwh這四個屬性,所以mline控件的關鍵在于如何把ltwh四個屬性跟x1-y2四個屬性聯系起來。

很顯然,如果mline控件中的線條是從左上角到右下角的話,那么:
a1=left : b1=top : a2=left+width : b2=top+height
這里我用(a1,b1)表示左上角的坐標,(a2,b2)表示右上角的坐標,這樣我就可以通過a1-b2來確定控件的區域了,但并不能確定直線的形狀,也

就是說直線是撇傾斜還是捺傾斜,通過a1-b2無法確定,我們需要一個標志變量來記錄這個傾斜值,下面會說到。

好了,a1-b2顯然和ltwh是一一對應的,我們可以寫出:
left=a1 : top=b1 : wdith=a2-a1 : height=b2-b1
a1=min(x1,x2) : b1=min(y1,y2) : a2=max(x1,x2) : b2=max(y1,y2)
通過上面的關系,我們把x1-y2和ltwh聯系起來了。
那么你去做吧,基本上這個線條可以畫出來,但不會太精確,在線條接近水平或垂直的時候就會有誤差了,出現誤差的原因是,控件有一個最

小寬度和最小高度!你可以隨便建立一個exe工程觀察一下常用的控件,他們的height/width最小只能設置到15或者更大一些,而usercontrol

,也就是我們的控件,其height/width最小只能設置到30,所以如果沒有考慮到這個因素,做出來的mline控件總會出現誤差的,如果你把做出

來的mline控件,以(x1,y1)為圓心,讓(x2,y2)繞著它畫圓,你會發現線條的一些細微變化,這種變化是不能容忍的。

所以mline控件的重點是要理解這個控件的真實形狀,它不僅僅是一個長方形的區域內做一條對角線,而是這樣的一個樣子:
在它的區域當中,有一片冗余區域,我們不能在這里畫線,理由是這個冗余區域正是這個控件的最小區域。這個冗余區域我設置它為一個空心

矩形,它和mline控件的整個區域是重合的,它中間的空心區域才是我們畫線的地方。空心區域應該是由最小寬度和最小高度決定的,讓minwid

th表示最小寬度,minheight表示最小高度,那么空心區域和控件區域的左邊界=minwidth/2,右邊界=minwidth/2,上邊界=minheight/2,下邊

界=minheight/2,你應該可以想象出來這個樣子。


好了,這就是mline控件的重點所在,我們再來調整一下x1-y2和ltwh之間的關系,當然我還是先用a1-b2來解釋,這樣清楚一點:
a1=extender.left+minwidth/2
b1=extender.top+minheight/2
a2=extender.left+extender.width-minwidth/2
b2=extender.top+extender.height-minheight/2

a2=a1+extender.width-minwidth
b2=b1+extender.height-minheight

extender.left=a1-minwidth/2
extender.top=b1-minheigth/2
extender.width=a2-a1+minwidth
extender.height=b2-b1+minheight

其中a1=min(x1,x2)
b1=min(y1,y2)
a2=max(x1,x2)
b2=max(y1,y2)
看到了嗎?a1-b2和ltwh建立了一一對應的關系,而通過min/max方法的計算,我們也可以使x1-y2和ltwh建立對應的關系,但不是一一對應的。
為什么呢?這里我們需要一個標志變量blnk,它表示直線的傾斜方向,也就是說撇傾斜或者捺傾斜,通過blnk,我們才可以使x1-y2和ltwh建立

一一對應的關系,也就是說,我們既可以改變ltwh來引起x1-y2的變化,也可以通過改變x1-y2來改變ltwh,這樣我們就得到了屬性x1-y2的get/

let方法如下:
(實際應用中,我沒有采用blnk來記錄傾斜方向,而是用posx1和posy1來記錄x1,y1在四個角的位置)

'客戶區位置x1
public property get x1() as single
if posx1 = ls_left then
x1 = extender.left + minwidth / 2
else
x1 = extender.left + extender.width - minwidth / 2
end if
end property

public property let x1(byval newx1 as single)
dim oldx2 as single
oldx2 = x2

if newx1 > oldx2 then
'新的x1在x2右邊
posx1 = ls_right
extender.left = oldx2 - minwidth / 2
extender.width = newx1 - oldx2 + minwidth
else
'新的x1在x2左邊
posx1 = ls_left
extender.left = newx1 - minwidth / 2
extender.width = oldx2 - newx1 + minwidth
end if
propertychanged "x1"
end property

x2,y1,y2的屬性方法與此類似,不再贅述。

在paint事件中我們使用line方法來畫線,但要記住不是從x1,y1畫到x2,y2,而是從x1-extener.left,y-extender.top到x2-extender.left,y2-

extender.top畫線。


值得注意的是,有人可能會不明白屬性和屬性方法get/let之間的關系,因此而造成許多的誤會,應該明白x1-y2的值是保存在get方法中的,每

次讀取x1-y2都會調用get方法來求得其值,注意!是求得!所以你也可以認為并沒有x1-y2這四個變量。而每次設置x1-y2,其實就是在設置ltw

h和posx1、posy1,希望你能對此明了,有的人會在resize/paint事件中去設置x1-y2,然后在x1-y2中又設置ltwh,這樣就又會引起resize/pai

nt事件,中間出現遞歸調用,雖然通過設置標志變量的方法可以防止無限遞歸,但那樣就復雜多了,很遺憾地說,我一開始就是這樣做的。

對于x1-y2的let方法的調用,只有三種情況,第一種情況是readproperties,這時會用form中保存的x1-y2來設置x1-y2的值;第二種情況就是

開發者,第三種情況可能會是使用者。

要明白,每次ltwh的變化都會直接引起x1-y2的變化,知道了這一點,就不會再去resize/paint事件中跟蹤ltwh的變化了。

菜鳥學堂:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 神农架林区| 句容市| 定襄县| 正阳县| 梅州市| 阳城县| 米脂县| 舒城县| 临武县| 高淳县| 东阳市| 松滋市| 宜宾县| 海丰县| 宣城市| 旬阳县| 灌阳县| 韶山市| 昌宁县| 通渭县| 朝阳市| 修水县| 大英县| 漾濞| 衡水市| 陕西省| 三亚市| 象州县| 信宜市| 太原市| 禹城市| 胶州市| 吴桥县| 鹿邑县| 繁昌县| 内黄县| 右玉县| 怀远县| 资源县| 昆明市| 玉龙|