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