Vb.net 渐变绘制控件-FlowLayoutPanel滚动闪烁

Vb.net 渐变绘制控件-FlowLayoutPanel滚动闪烁,vb.net,winforms,paint,gradient,flowlayoutpanel,Vb.net,Winforms,Paint,Gradient,Flowlayoutpanel,因此,我有一个FlowLayoutPanel,其中填充了多个用户控件。这些用户控件具有渐变绘制的背景色。在MouseEnter上,渐变的颜色会发生变化(如鼠标悬停效果),并在MouseLeave上恢复正常。这非常有效,但是FlowLayoutPanel在滚动时闪烁严重(即使是双缓冲)。如果我在表单中添加以下代码,滚动闪烁将完全消失,并且我的用户控件的MouseEnter/MouseLeave事件仍会触发,但新的背景渐变不会绘制为类似鼠标悬停的效果 Protected Overrides Read

因此,我有一个FlowLayoutPanel,其中填充了多个用户控件。这些用户控件具有渐变绘制的背景色。在MouseEnter上,渐变的颜色会发生变化(如鼠标悬停效果),并在MouseLeave上恢复正常。这非常有效,但是FlowLayoutPanel在滚动时闪烁严重(即使是双缓冲)。如果我在表单中添加以下代码,滚动闪烁将完全消失,并且我的用户控件的MouseEnter/MouseLeave事件仍会触发,但新的背景渐变不会绘制为类似鼠标悬停的效果

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or &H2000000 ' WS_CLIPCHILDREN

        Return cp
    End Get
End Property
绘制的代码在一个公共子例程中,并被这样调用

Call PaintMe(Me, ColorTranslator.FromOle(RGB(18, 18, 18)), _
                    ColorTranslator.FromOle(RGB(29, 29, 29)), _
                    ColorTranslator.FromOle(RGB(18, 18, 18)), _
                    Color.Black, True, True, 2)

Public Sub PaintMe(ByVal ctrl As Control, ByVal color1 As Color, color2 As Color, color3 As Color, ByVal border_color As Color, Optional ByVal correct_gama As Boolean = False, Optional ByVal has_border As Boolean = False, Optional ByVal border_width As Single = 0)
    ' Make the basic brush.
    Dim gBrush As LinearGradientBrush
    gBrush = New LinearGradientBrush(New Point(0, 0), New Point(0, ctrl.ClientSize.Height), _
                                     ColorTranslator.FromOle(RGB(color1.R, color1.G, color1.B)), _
                                     ColorTranslator.FromOle(RGB(color3.R, color3.G, color3.B)))

    gBrush.WrapMode = WrapMode.TileFlipX

    ' Define the colors.
    Dim color_blend As New ColorBlend
    color_blend.Colors = New Color() {ColorTranslator.FromOle(RGB(color1.R, color1.G, color1.B)), _
                                      ColorTranslator.FromOle(RGB(color2.R, color2.G, color2.B)), _
                                      ColorTranslator.FromOle(RGB(color3.R, color3.G, color3.B))}

    color_blend.Positions = New Single() {0.0, 0.5, 1.0}
    gBrush.InterpolationColors = color_blend
    gBrush.GammaCorrection = correct_gama

    ctrl.CreateGraphics().SmoothingMode = SmoothingMode.AntiAlias
    ctrl.CreateGraphics().FillRectangle(gBrush, ctrl.ClientRectangle)

    If has_border = True Then
        ' Create pen. 
        Dim myPen As New Pen(border_color, border_width)
        ' Create rectangle. 
        Dim rect As New Rectangle(0, 0, ctrl.ClientSize.Width, ctrl.ClientSize.Height)
        ctrl.CreateGraphics().DrawRectangle(myPen, rect)
    End If
End Sub

我的问题是,有没有其他方法可以从FlowLayoutPanel中删除闪烁,或者仍然让窗体上的子控件在鼠标上绘制事件?现在,唯一触发的PaintMe是窗体第一次实际加载控件时。

UserControls
也设置了
DoubleBuffered=true
?@DonBoitnott,是的。