用Visual Basic創建高科技窗體
那不是窗體!
有時候你會偶爾遇到一個windows應用程序,它不像普通windows應用程序。你知道我是什么意思。Windows應用程序是矩形的用戶界面。正是如此。但有時,你會看到一個應用程序具有圓形的角,甚至有時具有近乎瘋狂的奇異形狀的窗體,根本就不像一個windows應用程序。拿Net2Phone 10.6.2作為例子,這兩個頂端的窗體看起來妖艷多姿。但實際上,他們僅僅是兩個“L”形狀的窗體(圖一所示)。如果你同意我的觀點,無論什么時候你遇到類似令你驚異、不知道如何為你自己創建如此玉石般的窗體時,你肯定認為不會用VB去做,不是嗎?
好,下面有一些好消息:事實上,用VB窗體你可以創建任何眼睛見到的、大腦想象的窗體形狀。你甚至可以創建中間有洞的窗體,或者創建一些由相互分離的區域組成的窗體。
不好的是,你不能僅僅用VB進行創建。需要的功能依賴于windows圖形用戶接口,這些
VB不具有。為了得到這些,你需要windows API調用。
圖一:一個自定義窗體樣式的例子
Region的基本原理
創建一個高科技的窗體的秘密是一個叫做Region的技術。一個Region就是計算機顯示器的一個區域。Windows應用程序用Region在屏幕上繪制輸出和執行點擊測試(測試光標的位置)。簡單來說,一個Region就是幾個特定的輸入輸出能夠在顯示器上發生的區域。GDI
構造了三種可用的Region:矩形、橢圓形和多邊形。API調用用于創建和操縱Region。
所以在VB窗體里需要做什么呢?很簡單,每一個窗體都是在Region里邊被繪制出的。事實上,每一個窗口都是在Region里被繪制的。你可能知道,windows操作系統定義了一個窗口作為一個區域,該區域接收該應用程序的輸入,并且顯示輸出。聽起來非常類似于定義一個Region。事實上,窗口是比Region復雜得多的。窗口可以呈現多種外觀:窗體、按鈕、文本框等等。然而總的來說,窗口被繪制在一個Region里邊。所以我們可以說,每一個窗口擁有一個Region,所以VB窗體擁有一個Region。
通常情況下,一個窗體被繪制在一個矩形的Region里。事實上,VB幫助里邊基本不談論Region。操作系統自動為每一個窗體分派一個矩形Region。VB并不提示你去改變這些。因此,在設計模式里,你必須經常以矩形窗體工作。但是在少許簡單的API的幫助下,你可以在運行的時候改變個窗體的Region。
以圓形運行
讓我們看看最簡單的二者選其一的Region,一個橢圓。Windows操作系統提供了一個函數CreateEllipticRgn,該函數提供一個矩形的左上角和右下角坐標。該函數記下了一個在此矩形里邊的一個橢圓,用來創建需要的Region。
一旦你得到這個Region的句柄,你要把它指派到你的窗體里。為此,用CreateEllipticRgn函數,該函數把句柄提供給窗口和Region,還要提供一個布爾型的聲明,用以確定當分派
Region后窗口是否重繪。通常情況下,你想把最后一個聲明設為TRUE,下面是這些代碼:
Public Declare Function CreateEllipticRgn _
Lib "gdi32" (ByVal X1 As Long, _
ByVal Y1 As Long, _
ByVal X2 As Long, _
ByVal Y2 As Long) As Long
Public Declare Function SetWindowRgn _
Lib "user32" (ByVal hWnd As Long, _
ByVal hRgn As Long, _
ByVal bRedraw As Boolean) As Long
Public Sub CreateEllipseFromWindow(ByRef oWindow As Object)
Dim lRight As Long
Dim lBottom As Long
Dim hRgn As Long
With oWindow
lRight = .Width / Screen.TwipsPerPixelX
lBottom = .Height / Screen.TwipsPerPixelY
hRgn = CreateEllipticRgn(0, 0, lRight, lBottom)
SetWindowRgn .hWnd, hRgn, True
End With
End Sub
Private Sub Form_Load()
CreateEllipseFromWindow Me
End Sub
應當注意到在這些代碼中,要用到左上角和右下角的坐標作為橢圓的基礎。當工程啟動以后,該窗體最初有我們在設計的時候給定的尺寸,所以橢圓要基于那些數據。同時要注意,為了得到正確的尺寸,我們需要把高度和寬度從緹轉換到像素。缺省狀態下,VB用緹作為屏幕的尺寸。當用到Region時,需要以像素記數。Screen.TwipsPerPixelX和Screen.TwipsPerPixelY函數使得該轉換容易進行。
當你運行這些代碼時,你會發現該窗體的確以橢圓方式出現,但是是一個非常難看的橢圓。(圖二)問題出在VB的窗體基于矩形的Region上面。然而窗體是不允許繪制在橢圓Region的外面的。所以結果是,矩形的角被嚴格的切掉了!你肯定不想做一個像這樣的窗體的!
圖二:自定義橢圓窗體的最初外觀
第二個明顯的問題是改變該窗體的大小。
待續……
文章來源于領測軟件測試網 http://www.kjueaiud.com/
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月