一、創建個性窗體
以前, 創建個性化窗體是一個既費時又費人力的過程, 其中涉及
到API 調用和大量的編程工作, 在vs.net 問題變得很簡單。創建個性
化窗體的過程有兩個要素: 創建成形的窗體, 并編寫某些編程邏輯的
代碼以允許移動和關閉窗體, 在自定義形狀的窗體上沒有標題欄, 并
且它本身不具有任何功能, 例如移動窗體以及關閉窗體的能力。因此,
編寫一些代碼是進行必要的補充。創建個性化窗體的過程:
創建一個個性化形狀的窗體步驟:
1.創建一個個性化的單色位圖, 將該圖的背景設為一種顏色(這種
顏色將被“裁剪掉”), 并且這種顏色要和保留的部分顏色不能相同。所
繪制的形狀最終將成為您的窗體, 因此請確保該形狀足夠大, 以滿足
使用的需求。特別提醒一下在選擇“背景色”時, 最好選擇一種便于記
憶或操作的顏色, 因為這個“顏色”要被用來作為“透明化”的索引顏
色。
2.創建一個新的Windows 應用程序項目。
3.設置以下以下屬性:
將FormBorderStyle 屬性設置為None。此屬性從窗體中移除標
題欄和一些常規的可見部分如邊框。將窗體的BackgroundImage 屬性
設置為先前創建的位圖文件。不必將文件添加到項目系統中; 這將在
指定該文件作為背景圖像時自動完成。此屬性將該位圖圖像設置為
窗體的背景。
圖2
圖1
將TransparencyKey 屬性設置為位圖文件的背景色。上面設置的
背景圖像中的某些和TransparencyKey 屬性相同的顏色部分將變“透
明”掉, 而乘下的所看到的部分就是窗體的形狀。特別要說明的是如果
監視器的顏色深度設置大于24 位, 則不管TransparencyKey 屬性是如
何設置的, 窗體的非透明部分都會產生顯示問題。
編寫關閉窗體的代碼因為在設置FormBorderStyle 屬性為None
時,關閉按鈕也不可見,可以用增加一個按鈕來實現它的功能。
1.向窗體添加一個Button 控件。
2.添加代碼, 使用戶可通過調用end 或close 方法關閉該窗體。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Me.end
End Sub
編寫移動窗體的代碼
1.創建一個在拖動窗體時使窗體移動的過程。輸入代碼來創建新
的Point 對象。這將作為計算如何移動窗體時的變量。isMouseDown 字
段用于跟蹤用戶是否按下了鼠標按鈕。該窗體應只在用戶按下鼠標按
鈕時才移動。
Private mouseOffset As Point
Private isMouseDown As Boolean = False
2.創建窗體的MouseDown 事件的事件處理程序。在處理程序中添
加代碼, 使用戶可以在窗體上的任意位置單擊以拖動窗體。輸入代碼,
以根據鼠標指針的當前位置, 將坐標分配給mouseOffset 變量。在以下
代碼中, 請注意偏移位置是使用有關邊框大小(FrameBorderSize .
Width) 和標題欄高度(CaptionHeight) 的系統信息進行計算的。在測試
偏移位置時必須考慮這些因素, 因為某些測量結果是使用工作區得出
的, 而另一些測量結果是使用屏幕坐標得出的。因此, 偏移位置等于邊
框寬度加上標題高度, 再加上窗體工作區的偏移位置。
Private Sub Form1_MouseDown(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles MyBase.MouseDown
Dim xOffset As Integer
Dim yOffset As Integer
If e.Button = MouseButtons.Left Then
xOffset = - e.X - SystemInformation.FrameBorderSize.Width
yOffset = - e.Y - SystemInformation.CaptionHeight - _
SystemInformation.FrameBorderSize.Height
mouseOffset = New Point(xOffset, yOffset)
isMouseDown = True
End If
End Sub
3.創建窗體的MouseMove 事件的事件處理程序。輸入代碼, 單擊
鼠標左鍵并且拖動鼠標時, 窗體的Location 屬性將設置為新的位置。
Private Sub Form1_MouseMove(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles MyBase.MouseMove
If isMouseDown Then
Dim mousePos As Point = Control.MousePosition
mousePos.Offset(mouseOffset.X, mouseOffset.Y)
Location = mousePos
End If
End Sub
4.創建窗體的MouseUp 事件的事件處理程序。輸入類似以下內容
的代碼。
Private Sub Form1_MouseUp(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles MyBase.MouseUp
If e.Button = MouseButtons.Left Then
isMouseDown = False
End If
End Sub
二、創建個性化控件
由于控件沒有窗體的“TransparencyKey”屬性, 因此不能用實現自
定義窗體形狀方法來實現自定義控件形狀。繪制一個自定義形狀的控
件, 我們可以用vs.NET FRAMEWORK 中提供了一個繪制圖形類的方
法來完成。可以認為控件就是一個占有一定屏幕面積的自動生成的形
狀。.NET Framework 中提供了一系列的類, 來實現這種繪制功能。只要
了解控件的產生( 繪制) 過程, 我們可以來實現產生各種形狀的控件。
事實上, 可以認為控件是繪制出一個形狀后, 將一系列的控件屬性設
置到這個形狀上, 一個個性化的控件就形成了。.NET Framework 中提
供了一個GraphicsPath 類, 它可用一系列的直線和曲線來繪制形狀。
先用這個類按要求繪制一個形狀, 然后將控件的“區域”屬性設置到這
個形狀上來。這時, 這個形狀就“相當于”一個控件了。按下面的步驟就
可完成一個性化的控件,首先創建一個GRAPHICSPATH 類的實例,然 |
|