title: Panel Flickering with Pictureboxes
body: <p>I need a way to avoid Flickering on a panel, I've made a lot of similar questions here and all around the world trying to asking to experts, I've tried a lot of tricks, extended panels, createparams, controlstyles, lost a lot of time, wasted time learning things that will don't work... I'm months trapped in this point.</p>
  
  <p>...Nothing of that really works as expected, the best "Flicker-Reducer" I found is the "Createparams" override sub, but that method makes any Form/App x20 times more slower any operation of a Form, I don't want to loose flickering if that means loose application performance too (At least not if is the same negative point of performance of CreateParams).</p>
  
  <p>In this video you can see my Test form with a 50% transparent panel where inside has pictureboxes with background images set to "Zoom" layering, when I scroll up or down I get a lot of flickering.</p>
  
  <p><a href="http://www.youtube.com/watch?v=zIBDTMjrDd4&amp;feature=youtu.be" rel="nofollow noreferrer">http://www.youtube.com/watch?v=zIBDTMjrDd4&amp;feature=youtu.be</a></p>
  
  <p>I use the "CreateParams" method, really you won't see what happens with the flicker of my panel if I don't use "CreateParams", really scary. </p>
  
  <p>This is the panel when is not flickering:</p>
  
  <p><img src="https://i.stack.imgur.com/4vyLK.jpg" alt="enter image description here"></p>
  
  <p>And this is the panel in a moment where it is Flickered:</p>
  
  <p><img src="https://i.stack.imgur.com/MjVti.jpg" alt="enter image description here"></p>
  
  <p>Here is the complete class:</p>
  
  <pre><code>It is a Windows Form proyect
  VS2012
  Framework 3.5
  On Windows 7 x64
  Application Visual Styles is ON
  Double Buffer is ON
  Panel and pictureboxes are default controls
  </code></pre>
  
  <p>(I think no need to say I've tried all the possible visual and environment configurations that people said me to forget forever the flickering.)</p>
  
  <pre><code>Public Class Form1
  
      Dim Scroll_Position As Int32 = 0
      Dim Button_Down_Is_Pressed As Boolean = False
      Dim Button_Up_Is_Pressed As Boolean = False
      Dim WithEvents Progressive_Scroll_Timer As New Timer
      Dim SmallChange As Int32 = 5
      Dim Largechange As Int32 = 10
  
      ' Sub which reduces the Flickering, but this sub makes x20 times slower any operation of any Form/Application.
      Protected Overrides ReadOnly Property CreateParams() As CreateParams
          Get
              Dim cp As CreateParams = MyBase.CreateParams
              cp.ExStyle = cp.ExStyle Or &amp;H2000000
              Return cp
          End Get
      End Property 'CreateParams
  
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          ' Me.BackColor = Color.FromArgb(255, 0, 0, 0)
          ' Me.TransparencyKey = Color.FromArgb(255, 0, 0, 0)
          Panel1.VerticalScroll.Maximum = 999999999
          Progressive_Scroll_Timer.Interval = 50
          Panel1.BackColor = Color.FromArgb(150, 0, 0, 0)
      End Sub
  
      Private Sub Panel_MouseHover(sender As Object, e As EventArgs) Handles Panel1.MouseHover
          sender.focus()
      End Sub
  
      Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Progressive_Scroll_Timer.Tick
          If Button_Down_Is_Pressed Then
              Scroll_Down(SmallChange)
          ElseIf Button_Up_Is_Pressed Then
              Scroll_Up(SmallChange)
          Else
              sender.stop()
          End If
      End Sub
  
      Private Sub Scroll_Up(ByVal Change As Int32)
          Scroll_Position -= Change
          Panel1.SuspendLayout()
          Try : Panel1.VerticalScroll.Value = Scroll_Position : Catch : Scroll_Position += Change : End Try
          Panel1.ResumeLayout()
      End Sub
  
      Private Sub Scroll_Down(ByVal Change As Int32)
          Scroll_Position += Change
          Try : Panel1.VerticalScroll.Value = Scroll_Position : Catch : Scroll_Position -= Change : End Try
      End Sub
  
      Private Sub Button_Down_MouseDown(sender As Object, e As MouseEventArgs) Handles Button2.MouseDown
          If e.Button = Windows.Forms.MouseButtons.Left Then
              Button_Down_Is_Pressed = True
              Progressive_Scroll_Timer.Start()
          End If
      End Sub
  
      Private Sub Button_Up_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
          If e.Button = Windows.Forms.MouseButtons.Left Then
              Button_Up_Is_Pressed = True
              Progressive_Scroll_Timer.Start()
          End If
      End Sub
  
      Private Sub Button_Down_MouseUp(sender As Object, e As MouseEventArgs) Handles Button2.MouseUp
          Button_Down_Is_Pressed = False
      End Sub
  
      Private Sub Button_Up_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
          Button_Up_Is_Pressed = False
      End Sub
  
      Private Sub Form_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel1.MouseWheel
          If Panel1.Focused Then
              Select Case Math.Sign(e.Delta)
                  Case Is &gt; 0 : Scroll_Up(Largechange)
                  Case Is &lt; 0 : Scroll_Down(Largechange)
              End Select
          End If
      End Sub
  
  End Class
  </code></pre>