Jump to content
Xtreme .Net Talk

Recommended Posts

Posted (edited)

[PLAIN]"OnPaint" flickering on text lines. can it be avoided somehow? [source code included][/PLAIN]

 

Hi There

Anyone got a idea how to get rid of the flickering?

 

Yes, complete source code is pasted also.

copy and paste the code and RUN it.

now move the mouse up and down...

 

Option Explicit On

Public Class Form1
   Dim iLine As Integer
   Dim iTab As Integer

   Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

       Dim myGraphics As Graphics = MyBase.CreateGraphics()
       Dim myPen As New Pen(Color.FromArgb(45, 45, 45))
       Dim myBrush As New SolidBrush(Color.FromArgb(230, 230, 230))
       Dim myBrush2 As New SolidBrush(Color.FromArgb(80, 80, 80))
       Dim g As Graphics = e.Graphics

       ' [1] Draw the rectangle behind text line
       myGraphics.FillRectangle(myBrush, iTab, iLine, 300, 20)

       ' [2] Draw 20 lines with some text
       For i = 0 To 20
           g.DrawString("Textline_" & (i), New Font("Verdena", 12), myBrush2, iTab, i * 20)
       Next i

       MyBase.OnPaint(e)
   End Sub
 
   Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

       ' iline is used to -> Dont update screen while mouse at same line as last time
       ' my idea to avoid unnessesary screen updates

       Select Case e.Y
           Case 0 To 19 And iLine <> 0
               iLine = 0
               Me.Invalidate()
           Case 20 To 39 And iLine <> 20
               iLine = 20
               Me.Invalidate()
           Case 40 To 59 And iLine <> 40
               iLine = 40
               Me.Invalidate()
           Case 60 To 79 And iLine <> 60
               iLine = 60
               Me.Invalidate()
           Case 80 To 99 And iLine <> 80
               iLine = 80
               Me.Invalidate()
           Case 100 To 119 And iLine <> 100
               iLine = 100
               Me.Invalidate()
           Case 120 To 139 And iLine <> 120
               iLine = 120
               Me.Invalidate()
           Case 140 To 159 And iLine <> 140
               iLine = 140
               Me.Invalidate()
           Case 160 To 179 And iLine <> 160
               iLine = 160
               Me.Invalidate()
           Case 180 To 199 And iLine <> 180
               iLine = 180
               Me.Invalidate()
       End Select

   End Sub

   Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   End Sub

End Class

Edited by PlausiblyDamp
  • Administrators
Posted

[PLAIN]Re: "OnPaint" flickering on text lines. can it be avoided somehow? [source code inclu[/PLAIN]

 

Try adding

   Public Sub New()

       ' This call is required by the Windows Form Designer.
       InitializeComponent()

       ' Add any initialization after the InitializeComponent() call.
       DoubleBuffered = True
   End Sub

to the form and see if that helps. Also is there a reason you are doing the call to base.CreateGraphics in the OnPaint as you could just use e.Graphics for all the drawing.

Posting Guidelines FAQ Post Formatting

 

Intellectuals solve problems; geniuses prevent them.

-- Albert Einstein

Posted

[PLAIN]Re: "OnPaint" flickering on text lines & rectangle. [sollution included][/PLAIN]

 

well... seems flickerfree now.

no flickering text and a flickerfree progressbar added

just add a timer and run code. hope it helps someone out there.

 

 

Option Explicit On

Imports System.Drawing.Drawing2D

 

Public Class Form1

Dim iWidth As Integer

Dim iLine As Integer

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Timer1.Interval = 10

Timer1.Enabled = True

Me.DoubleBuffered = True

iWidth = 1

iLine = 20

End Sub

 

Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)

Dim g As Graphics = pe.Graphics

Dim fnt As New Font("Verdana", 10)

Dim rect As New Rectangle(20, iLine, iWidth, 20)

Dim lBrush As New LinearGradientBrush(rect, Color.Red, Color.Yellow, LinearGradientMode.BackwardDiagonal)

 

g.FillRectangle(lBrush, rect)

For i = 1 To 20

g.DrawString("GDI+ World", fnt, New SolidBrush(Color.Red), 20, i * 20)

Next i

End Sub

 

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

Select Case e.Y

Case 0 To 19 And iLine <> 0

iLine = 0

Case 20 To 39 And iLine <> 20

iLine = 20

Case 40 To 59 And iLine <> 40

iLine = 40

Case 60 To 79 And iLine <> 60

iLine = 60

Case 80 To 99 And iLine <> 80

iLine = 80

Case 100 To 119 And iLine <> 100

iLine = 100

Case 120 To 139 And iLine <> 120

iLine = 120

Case 140 To 159 And iLine <> 140

iLine = 140

Case 160 To 179 And iLine <> 160

iLine = 160

Case 180 To 199 And iLine <> 180

iLine = 180

End Select

End Sub

 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

iWidth = iWidth + 1

Me.Text = iWidth

If iWidth = 400 Then iWidth = 1

Me.Refresh()

End Sub

End Class

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...