[VB專題]Window Transparent專門美化表單的控制項元件
Window Transparent 1.0完成到現在也有一段時間了,突然覺得它只能做視窗透明的功能還是不夠強大,所以我決定加上我之前文章裡寫到的漸層表單和視窗最上層顯示的程式,將其發展成Window Transparent 2.0。
一、前言
Visual Basic(以下簡稱VB)是由Microsoft開發的圖形化的Basic語言。自1991發展至今已歷經了許多版本。從VB 1、VB 2、VB 3一直發展到最為人知曉的VB 6。自從.NET Framework問世後,VB又發展為VB .NET,目前還正持續演進中。
VB雖然擁有強大的圖形設計介面,但是早期版本對現在來說,已經成為落伍的視窗介面。就拿VB6來說,它是Microsoft在1998年出的產物,可是現在仍無法被VB.NET完全取代,迄今還是有許多人在使用。但現在的作業系統都講求精緻好看的介面,VB6編寫出來的圖形介面已經可以算是老古董了。雖然VB6的Form可以自訂背景顏色,但也只能有單一種顏色,使用久了會顯得單調;雖然可以放背景圖片,但卻會導致編譯出來的執行檔的大小過大。再者,VB6以後的版本(VB.NET),Form都加了Opacity屬性,可以讓設計者自訂表單的透明度,可是VB6卻沒有提供這項屬性,導致VB6寫出來的程式視窗顯得非常乏味。為了解決以上的問題,提升使用者對於VB6介面的印象,我利用VB6可以隨意引用ActiveX控制項的特色,製作一個專門用來美化VB6表單的ActiveX控制項元件。只需幾行的程式碼,便能改變VB6程式的圖形風格,讓自己的VB6視窗擁有個人特色!
ActiveX控制項下載(OCX):
Window Transparent 2.0
http://www.megaupload.com/?d=U8MCSOBF
Google協作平台範例檔案下載
此ActiveX控制項不只是單純的視窗透明化,還增加了許多應用方法,像是漸次遞增(減)透明化,即視窗淡入(出)效果。ActiveX能控制的視窗還不只侷限於自己設計的VB程式,只要知道任意視窗的handle,均可控制,甚至還能達到淡入淡出的效果。有關此ActiveX控制項詳細使用方法,請繼續看下去。
二、引用OCX控制項
請先利用上面的載點下載transparent.ocx,然後再往下做。
步驟一 首先建立一個「標準執行檔」的專案。
步驟二 按上方功能表「專案→設定使用元件」。或用快速鍵Ctrl+T。
步驟三 接著在「控制項」設定標籤頁面中,按下右邊的「瀏覽」按鈕。
步驟四 找到要使用的OCX檔案,按下右下方「開啟」按鈕。
步驟五 勾選要加入的控制項,按下下方「確定」按鈕。
步驟六 加入成功後就會看到工具箱多了新的控制項元件了。
步驟七 將控制項元件加入表單中,便可使用。
步驟八執行程式時會發現控制項的字樣會顯示出來,請原諒我的小廣告。如果要隱藏它,就把Visible屬性設為False。
三、使用Window Transparent寫程式
設計此ActiveX控制項的宗旨就是要以最簡單的方式,美化Visual Basic 6的表單。因此為了能夠正確使用此控制項的功能,須先讓人了解此控制項屬性名稱所代表的意義。
控制項的名稱我們取名為Window Transparent(簡稱WT),直譯的話就是「視窗透明」,其預設引用的Name屬性為WT[+代號]。加入的第一個元件Name屬性為WT1;加入的第二個自然就是WT2了。但事實上,同一個Form上不需要用到超過一個的WT元件,因此,我們姑且以WT1來為這個控制項元件命名。
屬性名稱 | 使用方式 | 功能說明 |
Alpha | Let(Long) | 控制WT1.InputhWnd(handle)所指的視窗透明度。範圍在整數0~255之間,數值愈小愈透明。 |
Appeared | Get(Boolean) | WT1.Load淡入效果的完成傳回值。通常WT1.Load淡入效果會被用在表單載入的時候,當WT1.Load淡入效果結束後WT1.Appeared的傳回值為True。預設為False。可以利用此屬性來預防同時出現兩個以上的表單都正在執行淡入效果時的錯誤。 |
Copyright | Get(Srting) | 記錄著本ActiveX控制項的著作權。 |
EmitGradient | Call | 放射漸層副程式。引數為(ByVal R1 As Single, G1 As Single, B1 As Single, R2 As Single, G2 As Single, B2 As Single, Types As Integer) 。R1,G1,B1為起始的RGB顏色值,R2,G2,B2為終止的RGB顏色值,Types為漸層類型(1~5)。1.矩形放射型態1 2.矩形放射型態2 3.圓形放射型態1 4.圓形放射型態2 5.隨機放射型態 |
FindhWnd | Get(Srting) | 引數為(title As String)。尋找某個標題的視窗handle,通常會直接傳給WT1.InputhWnd。 |
Half | Let(String) | 直接讓某標題的視窗半透明化。 |
Hidden | Get(Boolean) | WT1.Unload淡出效果的關閉傳回值。通常WT1.Unload淡出效果會被用在表單載出的時候,當WT1.Unload淡出效果結束後WT1.Hidden的傳回值為True。預設為False。 |
InputAppear | Let(Integer)/Get(Integer) | 設定WT1.Load淡入效果的動畫速度,即設定每單位時間的變化量。範圍為整數1~255,預設值為5。 |
InputAppearTime | Let(Integer)/Get(Integer) | 設定WT1.Load淡入效果的動畫時間速度,即設定每單位變化量所需的時間。範圍為整數1~1000,預設值為1。 |
InputDisAppear | Let(Integer)/Get(Integer) | 設定WT1.Unload淡出效果的動畫速度,即設定每單位時間的變化量。範圍為整數1~255,預設值為5。 |
InputDisAppearTime | Let(Integer)/Get(Integer) | 設定WT1.Unload淡出效果的動畫時間速度,即設定每單位變化量所需的時間。範圍為整數1~1000,預設值為1。 |
InputhWnd | Let(Long)/Get(Long) | 設定欲透明的對象視窗handle值,通常和Me.hWnd或WT1.FindhWnd併用。預設值為0。 |
LineGradient | Call | 線性漸層副程式。引數為(ByVal R1 As Single, G1 As Single, B1 As Single, R2 As Single, G2 As Single, B2 As Single, Types As Integer) 。R1,G1,B1為起始的RGB顏色值,R2,G2,B2為終止的RGB顏色值,Types為漸層類型(1~5)。1.左到右漸層 2.上到下漸層 3.左中右漸層 4.上中下漸層 5.亂數漸層 |
Load | Get(Boolean) | 即淡入動作,當淡入動作正在執行時,傳回值為False。預設為True。 |
OffTop | Get(Long) | 取消設定WT1.InputhWnd(handle)所指的視窗永遠在其它視窗的最上層,並取得SetWindowPos函數的傳回值。 |
OnTop | Get(Long) | 設定WT1.InputhWnd(handle)所指的視窗永遠在其它視窗的最上層,並取得SetWindowPos函數的傳回值。 |
Percentage | Let(Integer) | 控制WT1.InputhWnd(handle)所指的視窗透明度。範圍在整數0~100之間,數值愈小愈透明。當數值為0,則該目標視窗屬性如同Hidden。 |
RandGradient | Call | 隨機亂數漸層副程式。引數為(ByVal proLine As Integer)。引數proLine為線性亂數漸層出現的機率。值的範圍為0~10,數值愈高機率愈大。 |
Unload | Get(Boolean) | 即淡出動作,當淡出動作正在執行時,傳回值為False;執行完畢後WT1.Hidden為True。預設為True。 |
主要美化功能為表單漸層背景、視窗透明、視窗最上層顯示。
簡易控制範例
1 2 3 4 5 |
Private Sub Form_Load() '只要三行程式碼即可在載入表單時出現淡入效果 Dim Rtn As Boolean WT1.InputhWnd = Me.hWnd Rtn = WT1.Load End Sub |
1 2 3 4 5 6 7 8 9 10 |
Private Sub Form_Load() '只要五行程式碼即可在載入表單時出現淡入效果和漸層背景 Dim Rtn As Boolean WT1.InputhWnd = Me.hWnd Rtn = WT1.Load Call WT1.EmitGradient(255, 0, 0, 0, 0, 255, 3) End Sub Private Sub Form_Resize() '當表單狀態改變時再執行一次繪製漸層的副程式 Call WT1.EmitGradient(255, 0, 0, 0, 0, 255, 3) End Sub |
四、程式碼控制範例
Alpha
'WT1.InputhWnd = (輸入目標視窗handle值) 'WT1.Alpha = (輸入目標視窗的透明度值(0 - 255)) WT1.InputhWnd = Me.hWnd WT1.Alpha = 200 |
Copyright
Print WT1.Copyright '能直接取得著作權說明 |
FindhWnd
'(要存入handle的變數) =WT1.FindhWnd(視窗標題名稱) WT1.InputhWnd = WT1.FindhWnd("我的電腦") |
Half
'WT1.Half = (輸入要半透明的視窗標題名稱) WT1.Half = "我的電腦" |
InputAppear
'WT1.InputAppear = (輸入目標視窗的淡入透明度變化量(1-255))
WT1.InputAppear = 3 |
InputAppearTime
'WT1.InputAppearTime = (輸入目標視窗的淡入透明度時間變化量(1-1000))
WT1.InputAppearTime = 10 |
InputDisAppear
'WT1.InputDisAppear = (輸入目標視窗的淡出透明度變化量(1-255))
WT1.InputDisAppear = 3 |
InputDisAppearTime
'WT1.InputDisAppearTime = (輸入目標視窗的淡出透明度時間變化量(1-1000))
WT1.InputDisAppearTime = 10 |
InputhWnd
'WT1.InputhWnd = (輸入目標視窗handle值)
WT1.InputhWnd = Me.hWnd |
Load
'淡入效果通常用於載入表單時,因此應寫入表單Load事件程序中 Private Sub Form_Load() Dim Lrtn As Boolean '儲存WT1.Load(淡入效果)的傳回值 WT1.InputhWnd = Me.hWnd '先將表單視窗的hWnd值存入WT1.InputHwnd中 WT1.InputAppear = 5 '設定淡入效果的動畫速度,範圍整數1~255,數值愈大愈快。預設值為5。 WT1.InputAppearTime = 1 '設定淡入效果的動畫時間速度,範圍整數1~1000,數值愈大愈慢。預設值為1。 WT1.InputDisAppear = 5 '設定淡出效果的動畫速度,範圍整數1~255,數值愈大愈快。預設值為5。 WT1.InputDisAppearTime = 1 '設定淡出效果的動畫時間速度,範圍整數1~1000,數值愈大愈慢。預設值為1。 Lrtn = WT1.Load '執行WT1.Load(淡入效果),並將WT1.Load的傳回值儲存給Lrtn End Sub |
Percentage
'WT1.InputhWnd = (輸入目標視窗handle值) 'WT1.Percentage = (輸入目標視窗的透明度值(0 - 100)) WT1.InputhWnd = Me.hWnd WT1.Percentage = 75 '設定透明度為75% |
Unload
'淡出效果通常用於載出表單時,因此應寫入表單Unload事件程序中 Private Sub Form_Unload(Cancel As Integer) WT1.InputhWnd = Me.hWnd '結束前將表單視窗的hWnd值存入WT1.InputHwnd中 If WT1.Unload Then '判斷WT1.Unload(淡出效果)的傳回值是否為True。當WT1.Unload(淡出效果)正在執行時,WT1.Unload(淡出效果)傳回值為False While Not WT1.Hidden '判斷WT1.Hidden是否為False,為True跳出迴圈,結束程式(或結束表單)。當WT1.Unload(淡出效果)執行完後,WT1.Hidden會為True,此時會跳出While迴圈,繼續執行程式 DoEvents '讓其它程式碼(WT1.Unload的程式碼)也能執行 Wend End '關閉程式(亦可用表單.Hide) Else '若WT1.Unload為False,即WT1.Unload(淡出效果)還在執行中的時候,不能立即關閉表單 Cancel = True '取消關閉 End If End Sub |
EmitGradient
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub Form_Load() '表單載入時。 Call PaintGradient '畫漸層 End Sub Private Sub Form_Resize() '當表單狀態改變時。 Call PaintGradient '畫漸層 End Sub Private Sub PaintGradient() '畫漸層的副程式。 'Call WT1.EmitGradient (R1, G1, B1, R2, G2, B2, Types) Call WT1.EmitGradient(255, 0, 0, 0, 0, 255, 3) '圓形放射漸層型態1,紅到藍。 End Sub |
LineGradient
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub Form_Load() '表單載入時。 Call PaintGradient '畫漸層 End Sub Private Sub Form_Resize() '當表單狀態改變時。 Call PaintGradient '畫漸層 End Sub Private Sub PaintGradient() '畫漸層的副程式。 'Call WT1.LineGradient (R1, G1, B1, R2, G2, B2, Types) Call WT1.LineGradient(255, 0, 0, 0, 0, 255, 4) '上中下線性漸層,紅到藍到紅。 End Sub |
PaintGradient
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub Form_Load() '表單載入時。 Call PaintGradient '畫漸層 End Sub Private Sub Form_Resize() '當表單狀態改變時。 Call PaintGradient '畫漸層 End Sub Private Sub PaintGradient() '畫漸層的副程式。 'Call WT1.RandGradient (proLine) Call WT1.RandGradient(3) '隨機亂數漸層。3成的機率出現線性漸層;7成的機率出現放射漸層。 End Sub |
OnTop
1 2 3 4 5 6 7 |
Private Sub Form_Load() '表單載入時自動最上層顯示。 'WT1.InputhWnd = (輸入目標視窗handle值) '變數 = WT1.OnTop Dim Rtn As Long '宣告Rtn儲存WT1.OnTop的傳回值 WT1.InputhWnd = Me.hWnd Rtn = WT1.OnTop '使WT1.InputhWnd所指的視窗最上層顯示 End Sub |
OffTop
1 2 3 4 5 6 7 |
Private Sub Command1_Click() '和WT1.OnTop連用,來取消WT1.OnTop的設定。 'WT1.InputhWnd = (輸入目標視窗handle值) '變數 = WT1.OnTop Dim Rtn As Long '宣告Rtn儲存WT1.OffTop的傳回值 WT1.InputhWnd = Me.hWnd Rtn = WT1.OffTop '使WT1.InputhWnd所指的視窗取消最上層顯示 End Sub |
更多更詳細的使用方法請參考範例檔案。