兩個(gè)實(shí)例了解VB.NET特殊形狀窗體
#t#本人很喜歡VB.NET,在工作中也很喜歡總結(jié)關(guān)于VB.NET特殊形狀窗體的經(jīng)驗(yàn)教訓(xùn),下面就這個(gè)問題來詳細(xì)說說吧。我們的目的是實(shí)現(xiàn)VB.NET特殊形狀窗體,VB6中實(shí)現(xiàn)(借助API函數(shù))做一個(gè)古怪的窗口必須要用的也是此程序中最重要的一個(gè)函數(shù)就是SetWindowRgn它的功能就是對(duì)指定的窗口進(jìn)行重畫,把這個(gè)窗口你選擇的部分留下其余的部分抹掉。
VB.NET特殊形狀窗體參數(shù):
◆hWnd:你所要重畫的窗口的句柄,比如你想重畫form1則應(yīng)該讓此參數(shù)為form1.hWnd
◆hRgn:你要保留的區(qū)域的句柄,這個(gè)句柄是關(guān)鍵,你需要通過別的渠道來獲得在這里的區(qū)域是由Combinergn合成的新區(qū)域
◆bRedram:是否要馬上重畫,一般設(shè)為true
◆函數(shù)CombineRgn將兩個(gè)區(qū)域組合為一個(gè)新區(qū)域
◆函數(shù)Createrectrgn為創(chuàng)建一個(gè)由點(diǎn)X1,Y1和X2,Y2描述的矩形區(qū)域
◆函數(shù)CreateEllipticRgn為創(chuàng)建一個(gè)X1,Y1和X2,Y2的橢圓區(qū)域用DeleteObject這個(gè)函數(shù)可刪除GDI對(duì)象,比如畫筆、刷子、字體、位圖、區(qū)域以及調(diào)色板等等。對(duì)象使用的所有系統(tǒng)資源都會(huì)被釋放。
以下是VB6的代碼:
- PrivateDeclareFunction CreateEllipticRgn Lib "gdi32" (ByVal X1 AsLong,
ByVal Y1 AsLong, ByVal X2 AsLong, ByVal Y2 AsLong) AsLong- PrivateDeclareFunction CreateRectRgn Lib "gdi32" (ByVal X1 AsLong,
ByVal Y1 AsLong, ByVal X2 AsLong, ByVal Y2 AsLong) AsLong- PrivateDeclareFunction CombineRgn Lib "gdi32" (ByVal hDestRgn AsLong,
ByVal hSrcRgn1 AsLong, ByVal hSrcRgn2 AsLong, ByVal nCombineMode AsLong) AsLong- PrivateDeclareFunction SetWindowRgn Lib "user32" (ByVal hWnd AsLong,
ByVal hRgn AsLong, ByVal bRedraw AsBoolean) AsLong- PrivateDeclareFunction DeleteObject Lib "gdi32" (ByVal hObject AsLong) AsLong
- PrivateConst RGN_DIFF = 4
- PrivateSub Form_Load()
- Dim rgn AsLong
- Dim rgnRect AsLong
- Dim rgnDest AsLong
- rgn = CreateEllipticRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY)
- rgnRect = CreateRectRgn((Me.Width / Screen.TwipsPerPixelX - 20) / 2,
(Me.Height / Screen.TwipsPerPixelY - 20) / 2, (Me.Width / Screen.TwipsPerPixelX + 20) / 2,
(Me.Height / Screen.TwipsPerPixelY + 20) / 2)- rgnDest = CreateRectRgn(0, 0, 1, 1)
- CombineRgn rgnDest, rgn, rgnRect, RGN_DIFF
- SetWindowRgn Me.hWnd, rgnDest, True
- Call DeleteObject(rgnRect)
- Call DeleteObject(rgnDest)
- EndSub
- PrivateSub Command1_Click()
- End
- EndSub
在VB.NET中,我們可以使用.NET 框架類庫System.Drawing.Drawing2D的GraphicsPath 類(應(yīng)用程序使用路徑來繪制形狀的輪廓、填充形狀內(nèi)部和創(chuàng)建剪輯區(qū)域),來繪制圖形,然后通過VB.NET特殊形狀窗體的Me.Region來設(shè)置窗口的可見區(qū)域。
以下是VB.NET的代碼:
- '聲明一個(gè)布爾型變量,判斷窗體是否正常區(qū)域
- Dim IsNormalRegion AsBoolean = True
- PrivateSub Button2_Click(ByVal sender As System.Object,
_ByVal e As System.EventArgs) Handles Button2.Click- If (IsNormalRegion) Then
- '構(gòu)造一個(gè)GraphicsPath對(duì)象實(shí)例
- Dim Graphics AsNew System.Drawing.Drawing2D.GraphicsPath()
- Dim intHeight AsInteger = Me.Size.Height
- Dim intWidth AsInteger = Me.Size.Width
- '定義內(nèi)矩形的左上角坐標(biāo)
- Dim RectTop AsInteger = 100
- '在窗體上繪制一個(gè)大橢圓,左上角的坐標(biāo)取為(0,0)
- Graphics.AddEllipse(0, 0, intWidth, intHeight)
- '再繪制一個(gè)小矩形
- Dim AddRect AsNew Rectangle(RectTop, RectTop,
intHeight - (RectTop * 2), intHeight - (RectTop * 2))- Graphics.AddRectangle(AddRect)
- '設(shè)置窗口的可見區(qū)域
- Me.Region = New Region(Graphics)
- Else
- Me.Region = Nothing
- EndIf
- IsNormalRegion = Not IsNormalRegion
- EndSub