如何将添加在图片框中的用户控件翻转180度?

问题描述

我正在向图片添加控件。该控件是一个组件,恰好是拨动开关posted here。我希望此控件为垂直而不是水平。

因此,由于无法旋转或翻转对象,因此我找到了一种翻转图片框图像的方法

PictureBox1.Image.RotateFlip(RotateFlipType.Rotate180FlipNone)
    PictureBox1.Refresh()

我在运行时遇到的错误是:

System.Windows.Forms.PictureBox.Image.get什么也不返回

该控件不是图像,是否可以将图片框内的控件翻转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

SOQ64236248

关于问题的第二部分,请阅读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