VB.Net創建不規則窗體Montaque(原作)
一般說來,應用程序的窗體都是規則的,即是矩形窗體。有時候為了某種特殊的用途,我們希望改變應用程序窗體的形狀,比如做個個性十足的mp3播放器,小時鐘等等,這就需要 "定制"我們的應用程序。另外,特殊形狀的窗體有時候也能吸引用戶的注意力,使得他們格外注意你的程序。
在VB6里面,我們一般通過以下代碼來創建不規則窗體。 Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _ ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Sub Form_Activate() Dim hndRgn As Long hndRgn = CreateEllipticRgn(0, 0, 175, 175) Call SetWindowRgn(Me.hWnd, hndRgn, True) Call DeleteObject(hndRgn) End Sub 首先用Win32 API CreateEllipticRgn創建一個圓形的區域,然后設置Form的區域為用戶自定義的Region,這樣我們就可以得到下面一個圓形的窗體
為了更美觀一點,我們可以設Form的BorderStyle為None,然后自己畫一個TitileBar,就可以做成比較活潑的應用程序。
VB.Net里面如何實現以上效果: VB.NET是一中跨平臺的語言,更好的利用了面向對象機制。它的面向對象能力擴展了語言本身的通路:一切都是對象。這意味著比在以前的VB版本里,你獲得了更多的內在功能,你將很少被迫使用 Windows API。因此在VB.Net里面我們也只好放棄VB6里面利用API的觀念,用VB.Net強大的對象機制來闡述以上話題。 在VB.Net里面,Form有一個Reigin屬性,我們通過創建自定義的Reigin,然后指定Form的Reigin,就可以得到不規則的窗體。而且VB.Net里面的Reigin對象功能強大,遠超過了之前VB的限制,因此我們可以作出很多漂亮的界面。
Regin對象 System.Drawing的一個對象,指示由矩形和由路徑構成的圖形形狀的內部。因為區域的坐標是在全局坐標中指定的,所以可對它進行縮放。然而,在繪制表面上,它的內部取決于表示它的像素的大小和形狀。應用程序可以使用若干區域來堆砌繪圖操作的輸出。窗口管理器則使用區域來定義窗口的繪制區域。這些區域被稱為剪輯區域。應用程序還可以在命中檢測的操作中使用區域,例如檢查一個點或矩形是否與某個區域相交。應用程序可通過使用 Brush 對象來填充一個區域。 GraphicsPath表示一系列相互連接的直線和曲線,應用程序使用路徑來繪制形狀的輪廓、填充形狀內部和創建剪輯區域。圖形引擎在全局坐標空間中維護路徑內的幾何形狀的坐標。路徑可由任意數目的圖形(子路徑)組成。每一圖形都是由一系列相互連接的直線和曲線或幾何形狀基元構成的。圖形的起始點是相互連接的一系列直線和曲線中的第一點。終結點是該序列中的最后一點。幾何形狀基元的起始點和終結點都是由基元規范定義的。 下面我們看兩個具體的實例 1.文字格式的窗體
在Form的Load事件加入以下代碼: Dim text_path As GraphicsPath Dim text_region As Region Me.BackColor = Color.Red Me.Width = 600 ' Create the text path. text_path = New GraphicsPath( Drawing.Drawing2D.FillMode.Alternate) text_path.AddString("CSDN", New FontFamily("Times New Roman"), FontStyle.Bold, 200,New Point(10, 10), StringFormat.GenericDefault) ' Create a Region from the path. text_region = New Region(text_path) ' Constrain the form to the region. Me.Region = text_region
運行將將得到如下形狀的窗體,記住按Shift+F5 中止程序。
2.橢圓形狀的窗體: 同樣加入以下代碼,得到如下窗體
Me.Width = 300 Me.Height = 220 Me.BackColor = Color.RoyalBlue Dim m_path As GraphicsPath m_path = New GraphicsPath(FillMode.Winding) m_path.AddEllipse(1, 1, 200, 200) Dim m_region As New Region(m_path) Me.Region = m_region
以上只是兩個簡單的例子,通過利用Region和GraphicsPath對象,你將得到更多有趣的效果。
|