2015-04-24 127 views
-2

我有一個自定義'切換'(使用ButterscotchTheme),我想添加第三個選項。3路複選框(切換)

這是它目前操作方法是:(廣東話發佈照片由於是新的,但這裏是鏈接到圖片)

enter image description here

enter image description here

我想第三個選項。我檢查了主題代碼,並通過複選框規則完成。而且我知道Tricheckbox是一件東西,我只是不確定如何讓它工作。我做了一些研究,在這種情況下無法弄清楚。

下面是切換代碼的​​所有主題:

Public Class ButterscotchToggle : Inherits Control 

Private _check As Boolean 
Public Property Checked As Boolean 
    Get 
     Return _check 
    End Get 
    Set(ByVal value As Boolean) 
     _check = value 
     Invalidate() 
    End Set 
End Property 

Sub New() 
    MyBase.New() 
    SetStyle(ControlStyles.UserPaint Or ControlStyles.ResizeRedraw Or ControlStyles.SupportsTransparentBackColor, True) 
    DoubleBuffered = True 
    BackColor = Color.Transparent 
    Size = New Size(80, 25) 
End Sub 

Protected Overrides Sub OnClick(ByVal e As EventArgs) 
    Checked = Not Checked 
    MyBase.OnClick(e) 
End Sub 

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
    Dim b As Bitmap = New Bitmap(Width, Height) 
    Dim g As Graphics = Graphics.FromImage(b) 
    Dim outerrect As Rectangle = New Rectangle(0, 0, Width - 1, Height - 1) 
    Dim maininnerrect As Rectangle = New Rectangle(7, 7, Width - 15, Height - 15) 
    Dim buttonrect As New LinearGradientBrush(outerrect, Color.FromArgb(100, 90, 80), Color.FromArgb(48, 43, 39), 90S) 
    MyBase.OnPaint(e) 
    g.Clear(BackColor) 
    g.SmoothingMode = SmoothingMode.HighQuality 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic 
    g.FillPath(New SolidBrush(Color.FromArgb(40, 37, 33)), RoundRect(outerrect, 5)) 
    g.DrawPath(New Pen(Color.FromArgb(0, 0, 0)), RoundRect(outerrect, 5)) 
    g.FillPath(New SolidBrush(Color.FromArgb(26, 25, 21)), RoundRect(maininnerrect, 3)) 
    g.DrawPath(New Pen(Color.FromArgb(0, 0, 0)), RoundRect(maininnerrect, 3)) 
    If Checked Then 
     g.FillPath(buttonrect, RoundRect(New Rectangle(3, 3, CInt((Width/2) - 3), Height - 7), 7)) 
     g.DrawString("ON", New Font("Segoe UI", 10, FontStyle.Bold), New SolidBrush(Color.FromArgb(246, 180, 12)), New Rectangle(2, 2, CInt((Width/2) - 1), Height - 5), New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}) 
    Else 
     g.FillPath(buttonrect, RoundRect(New Rectangle(CInt((Width/2) - 3), 3, CInt((Width/2) - 3), Height - 7), 7)) 
     g.DrawString("OFF", New Font("Segoe UI", 10, FontStyle.Bold), New SolidBrush(Color.FromArgb(246, 180, 12)), New Rectangle(CInt((Width/2) - 2), 2, CInt((Width/2) - 1), Height - 5), New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}) 
    End If 
    e.Graphics.DrawImage(b, New Point(0, 0)) 
    g.Dispose() : b.Dispose() 
End Sub 
End Class 

任何幫助將不勝感激!

主題從Butterscotch Theme GDI+

+0

VB.NET編程語言本身沒有「奶油糖主題」。你似乎在談論一個特定的UI框架(Windows Forms,從你的代碼的外觀)與一個附加控件工具包/庫配對......哪一個?如有可能,請將相關詳細信息添加到您的帖子中,作爲文本和/或標籤。 – stakx

+0

那裏沒有代碼來處理第三個狀態。 CodeProject是一個很好的地方尋找這樣的事情, – Plutonix

+0

http://www.vbforums.com/showthread.php?777631-THEME-Butterscotch-Theme-GDI-20-Controls-VB-Net是我得到它的地方從。 – dwb

回答

0

下載您必須是布爾屬性更改爲一個整數(甚至更好,創建一個枚舉):

Private _check As Integer 

Public Property Checked As Integer 
    Get 
    Return _check 
    End Get 
    Set(ByVal value As Integer) 
    _check = value 
    Invalidate() 
    End Set 
End Property 

變化的OnClick行爲:

Protected Overrides Sub OnClick(ByVal e As EventArgs) 
    If Checked + 1 > 2 Then 
    Checked = 0 
    Else 
    Checked += 1 
    End If 
    MyBase.OnClick(e) 
End Sub 

,然後相應地調整圖紙(將第三個選項放在中間我猜測):

Select Case Checked 
    Case 0 
    g.FillPath(buttonrect, RoundRect(New Rectangle(CInt((Width/2) - 3), 3, CInt((Width/2) - 3), Height - 7), 7)) 
    g.DrawString("OFF", New Font("Segoe UI", 10, FontStyle.Bold), New SolidBrush(Color.FromArgb(246, 180, 12)), New Rectangle(CInt((Width/2) - 2), 2, CInt((Width/2) - 1), Height - 5), New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}) 
    Case 1 
    g.FillPath(buttonrect, RoundRect(New Rectangle(3, 3, CInt((Width/2) - 3), Height - 7), 7)) 
    g.DrawString("ON", New Font("Segoe UI", 10, FontStyle.Bold), New SolidBrush(Color.FromArgb(246, 180, 12)), New Rectangle(2, 2, CInt((Width/2) - 1), Height - 5), New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}) 
    Case 2 
    g.FillPath(buttonrect, RoundRect(New Rectangle((Width/2) - (Width/4), 3, CInt((Width/2) - 3), Height - 7), 7)) 
    g.DrawString("???", New Font("Segoe UI", 10, FontStyle.Bold), New SolidBrush(Color.FromArgb(246, 180, 12)), New Rectangle((Width/2) - (Width/4), 2, CInt((Width/2) - 1), Height - 5), New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}) 
End Select 
+0

你是該死的男人!非常感謝! – dwb

+0

確定,所以我用這 「如果ExpandToggle.Checked + 1> 2然後 ExpandToggle.Checked = 0 MSGBOX( 「0」) 否則 ExpandToggle.Checked + = 1 MSGBOX( 「1」) 完如果' 我如何獲得第三個選項? – dwb

+0

@dwb你將不得不考慮這一點。刪除您的MsgBox代碼,並在結束後如果,只需MsgBox(選中)。 – LarsTech