Hej! >Vilket sätt är bäst Du kan använda en picturebox som buffer. Ritning alla objekt. Sedan visa den för användaren med PaintPicture: Hej! Pictureboxen skall vara osynlig. Visible = false. Eftersom hela bilden uppdateras så komer det inte flimra på samma sätt som när du använder kontroller eller ritar direkt i formuläret. Det viktigaste är att du har autoredraw på true Flimrande rörelse
Första frågan. Vilket sätt är bäst (snabbast snyggast, enklast) att förflytta ett klot över formuläret, med Circle eller med ett objekt (shape t ex)? (eller finns det något annat sätt?)
Andra frågan. Hur får man bort flimret när klotet förflyttar sig? Tror ni förstår vad jag menar.
mvh
/MichaelSv: Flimrande rörelse
Det beror helt på situationen.
Rör det sig om en enkel animation så är det nog bäst med en shape. Det är lättast.
Vill du ha aningens mer kontroll använder du circle-metoden.
Ska du ha många cirklar som dessutom har vissa andra egenskaper är det nog bäst att göra egna klasser.
>Hur får man bort flimret när klotet förflyttar sig?
Använd BitBlit. Sök i forumet eller kolla i filarean.
/Niklas JanssonSv: Flimrande rörelse
Här är ett litet exempel:
<code>
Option Explicit
Private Type MyCircle
X As Single
Y As Single
Radius As Single
CX As Single
CY As Single
End Type
Private Circles() As MyCircle
Private Sub Form_Load()
Dim Index As Long
ReDim Circles(4)
For Index = 0 To 4
Randomize
With Circles(Index)
.X = Rnd * Picture1.ScaleWidth
.Y = Rnd * Picture1.ScaleHeight
.Radius = Rnd * Picture1.ScaleX(10, vbPixels)
.CX = Rnd * Picture1.ScaleX(10, vbPixels)
.CY = Rnd * Picture1.ScaleY(10, vbPixels)
End With
Next
Picture1.AutoRedraw = True
Picture1.DrawStyle = vbSolid
Picture1.ForeColor = vbBlack
Picture1.FillStyle = vbFSSolid
Picture1.FillColor = vbYellow
End Sub
Private Sub Form_Resize()
Picture1.Move ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight
End Sub
Private Sub Timer1_Timer()
Dim Index As Long
Dim NewX As Single
Dim NewY As Single
Picture1.Cls
For Index = 0 To 4
Randomize
With Circles(Index)
NewX = .X + .CX
If NewX > Picture1.ScaleWidth - .Radius Then
.CX = -.CX
NewX = Picture1.ScaleWidth - .Radius
ElseIf NewX < .Radius Then
.CX = -.CX
NewX = .Radius
End If
.X = NewX
NewY = .Y + .CY
If NewY > Picture1.ScaleHeight - .Radius Then
.CY = -.CY
NewY = Picture1.ScaleHeight - .Radius
ElseIf NewY < .Radius Then
.CY = -.CY
NewY = .Radius
End If
.Y = NewY
Picture1.Circle (NewX, NewY), .Radius
End With
Next
PaintPicture Picture1.Image, ScaleLeft, ScaleTop
End Sub
</code>Sv: Flimrande rörelse
Tack för din lösning men nog tycker jag det flimrar lite ändå. Om du gör Circle i en PictureBox eller i ett formulär har nog ingen betydelse. Sista raden 'PaintPicture Picture1.Image, ScaleLeft, ScaleTop' förstår jag inte. Den ritar ju bara ut bilden som finns i PictureBoxen på formuläret, UNDER PictureBoxen!! Ta bort denna rad och cirklarna visas precis som innan.
mvh
/MichaelSv: Flimrande rörelse
När figurer överlappar varandra komer den underliggande att ritas sedan överliggande. Tror det är det som du stör dig på.Sv: Flimrande rörelse
BitBlt är snabbare än paintpuicture men om du inte ska flytta så tung grafik gör det inte så stor skillnad