问题描述
我正在向图片框添加控件。该控件是一个组件,恰好是拨动开关posted here。我希望此控件为垂直而不是水平。
因此,由于无法旋转或翻转对象,因此我找到了一种翻转图片框图像的方法:
PictureBox1.Image.RotateFlip(RotateFlipType.Rotate180FlipNone)
PictureBox1.Refresh()
我在运行时遇到的错误是:
该控件不是图像,是否可以将图片框内的控件翻转180度? 另外,您认为有一种方法可以知道拨动开关的值是打开还是关闭? 谢谢
解决方法
如上所述,扩展控件以使其水平或垂直绘制。
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
Public Class ToggleSwitch
Inherits CheckBox
Public Sub New()
MyBase.New
SetStyle(ControlStyles.AllPaintingInWmPaint Or
ControlStyles.UserPaint,True)
UpdateStyles()
Padding = New Padding(6)
End Sub
Private _orientation As Orientation = Orientation.Horizontal
Public Property Orientation As Orientation
Get
Return _orientation
End Get
Set(value As Orientation)
_orientation = value
Dim max = Math.Max(Width,Height)
Dim min = Math.Min(Width,Height)
If value = Orientation.Vertical Then
Size = New Size(min,max)
Else
Size = New Size(max,min)
End If
End Set
End Property
'Fix by: @41686d6564
<Browsable(False),Bindable(False),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),EditorBrowsable(EditorBrowsableState.Never)>
Public Overrides Property AutoSize As Boolean
Get
Return False
End Get
Set(value As Boolean)
End Set
End Property
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim g = e.Graphics
g.Clear(BackColor)
g.SmoothingMode = SmoothingMode.AntiAlias
g.PixelOffsetMode = PixelOffsetMode.Half
Dim p = Padding.All
Dim r = 0
Dim rec As Rectangle
Using gp = New GraphicsPath
If _orientation = Orientation.Vertical Then
r = Width - 2 * p
gp.AddArc(p,p,r,-180,180)
gp.AddArc(p,Height - r - p,180)
r = Width - 1
rec = New Rectangle(0,If(Checked,Height - r - 1,0),r)
'Or
'rec = New Rectangle(0,Height - r - 1),r)
'To get the ON on top.
Else
r = Height - 2 * p
gp.AddArc(p,90,180)
gp.AddArc(Width - r - p,-90,180)
r = Height - 1
rec = New Rectangle(If(Checked,Width - r - 1,r)
End If
gp.CloseFigure()
g.FillPath(If(Checked,Brushes.DarkGray,Brushes.LightGray),gp)
g.FillEllipse(If(Checked,Brushes.Green,Brushes.WhiteSmoke),rec)
End Using
End Sub
End Class
关于问题的第二部分,请阅读CheckBox.Checked属性和CheckBox.CheckedChanged事件。
实施示例:
Private Sub ToggleSwitch1_CheckedChanged(sender As Object,e As EventArgs) Handles ToggleSwitch1.CheckedChanged
If ToggleSwitch1.Checked Then
'ToDo with ON state...
Else
'ToDo with OFF state..
End If
End Sub