[WM]利用Microsoft.Drawing擴充Graphics & 製作我的按鈕

在compact framework的開發環境中,預設的環境對於繪圖部分的資源是比較少的,也沒有"透明色"這東西可以用,所以當需要製作漂漂的畫面時比就比較費力了。
而在最近,微軟的網站上也推出了UI Framework for .Net Compact Framework 3.5,今天初步的來測試看看有了UI Frameowrk之後多了哪些資源可以利用,首先UI Framework的參考網址是下面這邊
http://code.msdn.microsoft.com/uiframework/Release/ProjectReleases.aspx?ReleaseId=2315
接下來進入到下載頁面中可以下載相關的範例程式碼(程式碼是以C#撰寫),像下面這樣

可以先把相關的範例程式碼下載回來,慢慢消化,這邊筆者會先利用ListViewDemo相關的程式碼;開啟範例程式碼之後,在方案總管這邊會看到像下面的相關專案

筆者這邊只會用到Microsoft.Controls相關的東西,所以要先建置一下這個專案;建置完成之後就會得到MMobile.Controls.dll,像是下圖這樣

這就是要加入參考使用的dll了;原先ListViewDemo的專案就可以先關閉,之後建立一個新的智慧型裝置的專案(記得compact framework要選3.5喔),並且將剛剛產生的dll加入參考,加入參考之後在方案總管中可以看到新加入的參考,應該會像下面這樣

好,準備工作都完成了,接下來就來測試看看吧;首先要先引入命名空間
Imports Microsoft.Drawing
引入的命名空間之後在Graphics類別中就多了很多擴充方法可以利用,例如
        ''繪製具透明度的image
''e.Graphics.DrawAlpha()
''繪製圓角矩形
''e.Graphics.DrawGradientRoundedRectangle
''繪製具透明度的圓角矩形
''e.Graphics.DrawGradientRoundedRectangleAlpha
那麼就先來測試看看DrawGradientRoundedRectangle的效果,在Form的Paint事件中加入以下的程式碼
 Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
e.Graphics.DrawGradientRoundedRectangle( _
New Rectangle(20, 0, 200, 50), _
Color.LightPink, Color.Red, _
Color.White, New Size(10, 10))
End Sub
針對這個方法筆者簡單說明一下(或是可以直接參考Microsoft.Controls的source code)第一個參數是要繪製矩形的大小,第二個參數是漸層色的起始顏色,第三個參數是漸層色的結束顏色,第四個參數是邊框的顏色,第五個參數是圓角部分的大小。執行之後,在模擬器的畫面上就會看到像下面這樣的效果

太讚了,只要呼叫一個簡單的方法就可以畫出一個有漸層顏色的圓角矩形了,如果都要自己來可是要寫不少的code哩;好,畫出來了圓角矩形,那接下來呢?就來幫陪我們爭戰多年、南征北討的夥伴Button來穿個新衣服吧。
那麼就開始來做一個按鈕,第一個要注意的地方,因為我們必須要自行的處理繪製畫面的相關動作,所以不能從button這邊繼承過來,要改由Control類別繼承過來;接下來是程式碼的部分,首先要要入一個新的"元件類別",程式碼的部分會像下面這樣
''reference:http://code.msdn.microsoft.com/uiframework
Imports Microsoft.Drawing
Imports System.Drawing

Public Class MyButton
Inherits Windows.Forms.Control
''暫存目前按鈕是否被按下
Private _bolPsuhed As Boolean = False
''漸層色開始
Private _GradientStart As Color
''漸層色結束
Private _GradientEnd As Color
''緩衝用的圖形
Private _bmpOff As Bitmap
''預留
Private _img As Image
''繪製文字時用的筆刷
Private _fontBrush As New SolidBrush(Color.Black)
''繪製文字時所使用的相關設定
Private _fontFormat As New System.Drawing.StringFormat

#Region "property"
'''
''' 取得或設定漸層色的開始色彩
'''

'''
'''
'''
Public Property GradientStart() As Color
Get
Return _GradientStart
End Get
Set(ByVal value As Color)
_GradientStart = value
End Set
End Property

'''
''' 取得或設定漸層色的結束色彩
'''

'''
'''
'''
Public Property GradientEnd() As Color
Get
Return _GradientEnd
End Get
Set(ByVal value As Color)
_GradientEnd = value
End Set
End Property

'''
''' 取得或設定button的圖示(預留)
'''

'''
'''
'''
Public Property [Image]() As Image
Get
Return _img
End Get
Set(ByVal value As Image)
_img = value
End Set
End Property
#End Region

'''
''' 複寫繪製事件
'''

'''
'''
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
''判斷緩衝用的圖形是否已經經過初始化
If _bmpOff Is Nothing Then
_bmpOff = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
End If
''建立Graphic物件
Dim gOff As Graphics = Graphics.FromImage(_bmpOff)
''清除歡衝區原有圖形
gOff.Clear(Me.BackColor)

''繪製背景
''判斷目前狀態是否被按下
If _bolPsuhed Then
''被按下時的繪製動作
gOff.DrawGradientRoundedRectangle( _
New Rectangle(0, 0, Me.Width, Me.Height), _
Color.LightPink, Color.Pink, _
Color.White, New Size(10, 10))
Else
''一般情形的繪製動作
gOff.DrawGradientRoundedRectangle( _
New Rectangle(0, 0, Me.Width, Me.Height), _
_GradientStart, _GradientEnd, _
Color.White, New Size(10, 10))
End If

''繪製文字動作
''設定垂直置中
_fontFormat.Alignment = StringAlignment.Center
''設定水平置中
_fontFormat.LineAlignment = StringAlignment.Center
''設定字型顏色
_fontBrush.Color = Me.ForeColor
''繪製文字動作
gOff.DrawString(Me.Text, Me.Font, _fontBrush, Me.ClientRectangle, _fontFormat)

''將圖形實際繪製到button上
e.Graphics.DrawImageTransparent(_bmpOff, Me.ClientRectangle)
''release resources
gOff.Dispose()
End Sub

'''
''' 複寫mousedown事件
'''

'''
'''
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
''設定按下的旗標
_bolPsuhed = True
''立刻觸發重繪的事件
Me.Invalidate()
End Sub

'''
''' 複寫mouseup事件
'''

'''
'''
Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
''設定放開的旗標
_bolPsuhed = False
''立刻觸發重繪的事件
Me.Invalidate()
End Sub
End Class
建立好類別之後,先建置一下專案,沒有問題的話會在工具箱裡面看到新增加的類別

就可以利用拖拉的方式拉到畫面上使用了,執行的結果會像下面這樣,左圖是一般的狀態,點選時會像右圖的狀態,也會觸發click的事件

這樣就有比較漂漂的button可以用了,當然這個button也可以再擴充,例如文字筆者這邊都是畫在置中的位置,可以將位置改變、加上圖示,整個感覺也會很不一樣的。
最後,有擴充button類別或是更好的方式別忘了告訴筆者喔,感謝。

留言

這個網誌中的熱門文章

開啟cshtml檔案時,出現『並未將物件參考設定為物件執行個體』的錯誤訊息

無法設定中斷點 尚未載入符號檔

DataGridView欄位計算總合