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