Как показать вращающийся градиент спектра в PictureBox? - PullRequest
1 голос
/ 01 апреля 2019

Мне в основном нужен прямоугольник в моей форме, который показывает градиент радуги и анимирует его (движется вправо), предпочтительно в качестве фона, чтобы я мог показать прозрачную картинку сверху.

Я пытался анимировать радугу GIFв качестве фона, но изображение никогда не будет таким легким, как спектр, сгенерированный кодом.

Мне также удалось реализовать случайный код движущегося градиента, но это перемещает градиент назад и вперед.

'' '

Private Sub picCanvas_Paint(ByVal sender As Object, ByVal e _
    As PaintEventArgs) Handles _
    WallpaperPreview.Paint
    ' Draw the background gradient.
    Dim br As New LinearGradientBrush(New Point(0, 0), New _
        Point(Me.ClientSize.Width, 0), Color.Red,
        Color.Blue)
    Dim color_blend As New ColorBlend
    color_blend.Colors = New Color() {Color.Red,
        Color.White, Color.Blue}
    color_blend.Positions = New Single() {0, m_Middle, 1}
    br.InterpolationColors = color_blend
    e.Graphics.FillRectangle(br, Me.ClientRectangle)
    br.Dispose()

    ' Change the gradient's midpoint.
    m_Middle += m_Delta
    If (m_Middle > 1) OrElse (m_Middle < 0) Then m_Delta =
        -m_Delta
End Sub

' ''

Есть ли способ, которым я могу преобразовать это в всегда вправо движущийся градиент радуги?

Редактировать: Мое решениеэто

'' '

Private posX As Single = 0
Private posXmover As Single = 10

Private Sub Timer_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer.Tick
    WallpaperPreview.Invalidate()
End Sub

Private Sub WallpaperPreview_Paint(ByVal sender As Object, ByVal e _
As PaintEventArgs) Handles _
WallpaperPreview.Paint
    Dim rect As New Rectangle(posX, 0,
        WallpaperPreview.ClientSize.Width * 2,
        WallpaperPreview.ClientSize.Height)
    Dim br As New LinearGradientBrush(rect, Color.Red,
        Color.Blue, 0)
    Dim color_blend As New ColorBlend
    color_blend.Colors = New Color() {
            Color.Red,
            Color.Magenta,
            Color.Blue,
            Color.Cyan,
            Color.Green,
            Color.Yellow,
            Color.Red,
            Color.Magenta,
            Color.Blue,
            Color.Cyan,
            Color.Green,
            Color.Yellow,
            Color.Red}
    color_blend.Positions = New Single() {0, 0.083F, 0.163F, 0.249F, 0.332F, 0.415F, 0.5F, 0.583F, 0.66F, 0.749F, 0.832F, 0.915F, 1}
    br.InterpolationColors = color_blend
    e.Graphics.Clear(WallpaperPreview.BackColor)
    e.Graphics.FillRectangle(br, Me.ClientRectangle)
    br.Dispose()
    posX += posXmover

End Sub

' ''

...