六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

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

[摘要]Line控件本來是最簡單的一個控件,但它太簡單了,以至于不提供我們想要的一些事件,為了增強它的功能,我自己制作了一個Line控件,還給她取名叫作MLine控件。制作控件的方法請參看"MSDN - Visual Basic 文檔 - 使用Visual Basic -部件工具指南 - 創建A...
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的變化了。


主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 日本在线视频播放 | 欧美亚洲第一区 | 天天躁夜夜躁狠狠躁躁88 | 十八成人网 | 午夜综合 | 欧美亚洲综合一区 | 青草99 | 人人色在线视频播放 | 青青青草视频 | 做性视频 | 亚洲九九香蕉 | 日本一道dvd在线播放 | 我要看一级黄色 | 天天操天天射天天色 | 天天综合天天综合色在线 | 青青视频免费看 | 综合久久久久综合体桃花网 | 亚洲欧美综合图片 | 伊人色院成人蜜桃视频 | 最新国产精品精品视频 | 亚洲欧美视频在线 | 天天噜噜揉揉狠狠夜夜 | 日本高清无卡码一区二区久久 | 无码日韩精品一区二区免费 | 午夜视频啪啪 | 青春草国产视频 | 午夜欧美性欧美 | 青草下载 | 日韩高清在线日韩大片观看网址 | 天天射视频 | 伊人狠狠 | 神马热 | 五月天婷婷基地 | 亚洲福利二区 | 欧美特黄视频在线观看 | 一二三四视频免费观看影视 | 色综合色| 日日做夜夜爽夜夜爽 | 中文字幕在线视频免费观看 | 婷婷深爱五月 |