Solved

Flicker in Picturebox

Posted on 2002-04-02
5
381 Views
Last Modified: 2008-02-01
G'day,
I want to show this(Rotline.frm) rotating line without the flicker it presently suffers.

I think the PictureBox should be filled with a 'bitblt' routine but I don't know how; I don't want to use 2
Picturebox controls.
Has anybody got any ideas?
Thank you,           Dan Dierikx



'_____________Rotline.frm ________________

VERSION 5.00
Begin VB.Form Form1
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton Command2
      Caption         =   "&Exit"
      Height          =   450
      Left            =   3165
      TabIndex        =   2
      Top             =   2625
      Width           =   1245
   End
   Begin VB.CommandButton Command1
      Caption         =   "&Start"
      Height          =   435
      Left            =   3165
      TabIndex        =   1
      Top             =   1080
      Width           =   1290
   End
   Begin VB.PictureBox Picture1
      AutoRedraw      =   -1  'True
      Height          =   2355
      Left            =   405
      ScaleHeight     =   2295
      ScaleWidth      =   2445
      TabIndex        =   0
      Top             =   375
      Width           =   2505
      Begin VB.Line Line1
         BorderWidth     =   5
         DrawMode        =   9  'Not Mask Pen
         X1              =   1125
         X2              =   1125
         Y1              =   1050
         Y2              =   90
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim LH As Single
Dim Rad As Single
Const PI = 3.1416
Private Sub Command1_Click()
If Command1.Caption = "&Start" Then
  Command1.Caption = "&Stop"
For t = 62832 To 0 Step -1
If Command1.Caption = "&Start" Then Exit For
Rad = t / 100
SinRad = Sin(Rad)
CosRad = Cos(Rad)
Line1.X2 = Line1.X1 + (LH * CosRad)
Line1.Y2 = Line1.Y1 - (LH * SinRad)
If t = 0 Then t = 62832
DoEvents
Sleep (10)
Next t
End If
Command1.Caption = "&Start"
End Sub

Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Form_Load()
LH = Sqr((Line1.X2 - Line1.X1) ^ 2 + (Line1.Y2 - Line1.Y1) ^ 2)
End Sub
0
Comment
Question by:dierdan
  • 3
  • 2
5 Comments
 
LVL 22

Accepted Solution

by:
rspahitz earned 200 total points
ID: 6915494
I'm not sure how much better this will be, but you can draw directly on the picturebox like this (see Picture1.Line reference):

Private Sub Command1_Click()
Dim X1 As Single, Y1 As Single
Dim X2 As Single, Y2 As Single
Dim lColor1 As Long, lColor2 As Long

X1 = Line1.X1
Y1 = Line1.Y1
lColor1 = Picture1.BackColor
lColor2 = Line1.BorderColor

If Command1.Caption = "&Start" Then
 Command1.Caption = "&Stop"
For t = 62832 To 0 Step -1
If Command1.Caption = "&Start" Then Exit For
Rad = t / 100
SinRad = Sin(Rad)
CosRad = Cos(Rad)
Picture1.Line (X1, Y1)-(X2, Y2), lColor1
X2 = Line1.X1 + (LH * CosRad)
Y2 = Line1.Y1 - (LH * SinRad)
'Line1.X2 = Line1.X1 + (LH * CosRad)
'Line1.Y2 = Line1.Y1 - (LH * SinRad)
Picture1.Line (X1, Y1)-(X2, Y2), lColor2
If t = 0 Then t = 62832
DoEvents
Sleep (20)
Next t
End If
Command1.Caption = "&Start"
End Sub
0
 
LVL 22

Expert Comment

by:rspahitz
ID: 6915512
BTW BitBlt is "Bit Block Transfer" and is used to transfer an image from one place to another.

To draw images, you usually use one of the following:

1) An object that handles drawing through simple properties or methods
2) A drawing area (picturebox or form) with the PSet command (set a pixel)
3) A drawing area with the Line command
4) A drawing area with the Circle command

0
 

Author Comment

by:dierdan
ID: 6919562
Thank you rspahitz for your solution.
My project however requires 16 lines which are manipulated with Vscrolls to make up an animated figure.
I would prefer to use Line Controls for ease of programming. The Control Lines are just 'rearranged' during animation whereas each drawn line needs to be erased and redrawn.
I could make an array of line 'joins', x1y1.....x16y16 and rearrange the relative angles of the lines but need to figure out how to erase the previous position of the line.
You have answered my original question but I would welcome further comments from you or anyone following this.
0
 
LVL 22

Expert Comment

by:rspahitz
ID: 6919609
I know that if you XOR things, they tend to "reverse" themselves.  That would seem to be a good strategy here, but I'm not sure how you can XOR a line.

This could end up getting more complex by creating your own line method which draws each pixel by XORing the current color, but then it will probably be slower than using the line control:

Private Sub DrawLine(X1 as single, Y1 as single, X2 as single, Y2 as single, RGBColor as long, optional EraseLine as boolean = False)
  Dim X as single
  Dim Y as Single
  ' determine pixel X,Y location for next item in the line
  ...
 
  if EraseLine then
    PSet(X,Y), Point(X,Y) XOR vbWhite ' I think this is right...
  else
    PSet(X,Y), RGBColor
  endif
end sub

Other than that, using your existing method, the best suggestion I can offer is to investigate "double-buffering" which is one way to handle flickering in animations, which is essentially what you're doing.
0
 

Author Comment

by:dierdan
ID: 6920169
I will post another question on 'double buffering' if I find Drawn Lines impractical.
Thanks for your help rspahitz.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Introduction While answering a recent question (http://www.experts-exchange.com/Q_27402310.html) in the VB classic zone, I wrote some VB code in the (Office) VBA environment, rather than fire up my older PC.  I didn't post completely correct code o…
If you have ever used Microsoft Word then you know that it has a good spell checker and it may have occurred to you that the ability to check spelling might be a nice piece of functionality to add to certain applications of yours. Well the code that…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now