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