Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0113: Grafik flackerfrei animieren und bewegen

 von 

Beschreibung 

Mit dem aus dem letzten Tip gewonnenen Masken lassen sich flackerfreie Animationen realisieren. Hier wird die flackerbehaftete Methode der Hintergrundauslöschung, der Methode durch Hintergrundverschmelzung gegenübergestellt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

BitBlt

Download:

Download des Beispielprojektes [12,88 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Horizontale Scrollbar "HScroll1"
' Steuerelement: Bildfeld-Steuerelement "Picture5"
' Steuerelement: Bildfeld-Steuerelement "Picture4"
' Steuerelement: Bildfeld-Steuerelement "Picture3"
' Steuerelement: Bildfeld-Steuerelement "Picture2"
' Steuerelement: Bildfeld-Steuerelement "Picture1" (Index von 0 bis 0)

Option Explicit

Private Declare Sub BitBlt Lib "gdi32" (ByVal hDestDC _
        As Long, ByVal x As Long, ByVal Y As Long, ByVal _
        nWidth As Long, ByVal nHeight As Long, ByVal _
        hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As _
        Long, ByVal dwRop As Long)

Const SRCCOPY = &HCC0020
Const SRCINVERT = &H660046
Const SRCAND = &H8800C6

Dim W&, H&, Running As Boolean
Dim hDCfore&, hDCback&
Dim hDCmask1&, hDCmask2&
Dim hDCbuffer1&, hDCbuffer2&

Private Sub Form_Load()
  'Bild zur Hintergrundspeicherung generieren
  Load Picture1(1)
  
  'Nötige Einstellungen vornehmen
  Picture1(1).AutoRedraw = True
  Picture2.AutoRedraw = True
  Picture3.AutoRedraw = True
  Picture4.AutoRedraw = True
  Picture5.AutoRedraw = True
  
  Picture2.ScaleMode = vbPixels
  Picture3.ScaleMode = vbPixels
  
  W = Picture2.ScaleWidth
  H = Picture2.ScaleHeight
  
  'hDCs zwecks einfacheren Handlings in Variablen merken
  hDCfore = Picture1(0).hDC
  hDCback = Picture1(1).hDC
  
  hDCmask1 = Picture2.hDC
  hDCmask2 = Picture3.hDC
  
  hDCbuffer1 = Picture4.hDC
  hDCbuffer2 = Picture5.hDC
  
  'Scrollbars vordefinieren
  HScroll1.Min = 50
  HScroll1.Max = 1000
  HScroll1.Value = 500
End Sub

Private Sub Command1_Click()
  If Running Then Exit Sub
  Running = True
  Call MovePics
End Sub

Private Sub Command2_Click()
  Running = False
End Sub

Private Sub MovePics()
  Dim Z&
  Static x&, Y&
    
    Y = 50
    Do While Running
      'Päuschen mit DoEvents
      For Z = 0 To HScroll1.Value
        DoEvents
      Next Z
    
      'Irgendeine neue Position berechnen
      x = x + 1
      If x > Picture1(0).ScaleWidth Then x = -Picture2.ScaleWidth
      Y = Sin(6 * 3.141 / Picture1(0).ScaleWidth * x) * 30
    
      'Neue Position setzen
      Call SetPicMet_1(x, Y + 32)
      Call SetPicMet_2(x, Y + 155)
    Loop
End Sub

Private Sub SetPicMet_1(pX&, pY&)
  Static OldX%, OldY%, Start As Boolean
    
    'Kopie beim ersten Start nicht sichtbar platzieren
    If Not Start Then
      Start = True
      OldX = -W
      OldY = -H
    End If
    
    'Alten Hintergrundausschnitt zurückkopieren
    BitBlt hDCfore, OldX, OldY, W, H, hDCbuffer1, 0, 0, SRCCOPY
   
    'Neuen Hintergrundausschnitt speichern
    BitBlt hDCbuffer1, 0, 0, W, H, hDCfore, pX, pY, SRCCOPY
   
    'Bild einsetzen
    BitBlt hDCfore, pX, pY, W, H, hDCmask1, 0, 0, SRCAND
    BitBlt hDCfore, pX, pY, W, H, hDCmask2, 0, 0, SRCINVERT
    
    'Alte Position speichern
    OldX = pX
    OldY = pY
End Sub

Private Sub SetPicMet_2(pX&, pY&)
  
  'Hintergrund in den Puffer (+/- 2 Pixel als Rahmen)
  BitBlt hDCbuffer2, 0, 0, W + 4, H + 4, _
         hDCback, pX - 2, pY - 2, SRCCOPY
  
  'Bild im Puffer erstellen
  BitBlt hDCbuffer2, 2, 2, W, H, hDCmask1, 0, 0, SRCAND
  BitBlt hDCbuffer2, 2, 2, W, H, hDCmask2, 0, 0, SRCINVERT
  
  'Puffer in den Vordergrund (+/-2 Pixel als Rahmen)
  BitBlt hDCfore, pX - 2, pY - 2, W + 4, H + 4, _
         hDCbuffer2, 0, 0, SRCCOPY
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von shawn am 30.07.2007 um 17:19

Für alle die sagen es würde dennoch flackern : Ich kann nur sagen ich hatte zunächst auch schwierigkeiten......jedoch wenn mann den code erst kapiert leuft datt wie geschmiert!!! ich bin auch sehr zufrieden damit

Kommentar von Lukas am 14.03.2005 um 16:23

Hallo

Also dies sollte ja Flacker frei sein, aber bei mir flackert es noch mehr als sonst irgendwie!!!!!!!!

Lukas

Kommentar von VB Newbie am 31.12.2004 um 01:20

Dieser Code ist ziemlich dumm...
Man kann den gleichen Effekt auch mit viiieel weniger Aufwand erzielen!

Kommentar von Volker am 13.04.2004 um 16:20

Das flackert wie die Sa....

Ciao

Volker

Kommentar von Peter am 29.06.2002 um 16:33

Eine Frage hab ich dann mal doch...
Muß man sich so einen langen Code einprägen? Da wird mal doch voll würstchen durch und verstehen tuh ich nichts vom dem irgendwie...

Kommentar von Björn Möller am 02.04.2002 um 09:50

Der Tip funktioniert bei mir zwar, aber gehts nicht irgendwie ne nummer einfacher ???
Ich code jetzt schon knapp 3 Jahre aber das hier ist mir ein Stück zu umständlich ;-)

Kommentar von Sven Schönberg am 21.09.2001 um 14:27

Im Prinzip funktioniert dieser Trick bei mir, aber ich weiß nicht wie der Bewegung direkt den Befehl geben kann, und wie man das ohne PictureBox macht(als einzelness Objekt)

Kommentar von - am 15.03.2001 um 16:51

Dieser Tip funktioniert nicht!

Kommentar von Mischa Völkel am 11.10.2000 um 12:23

Hallo!
Ich habe eine Frage zum flackerfreien bewegen!
Kann das Bild dann auch über ein anderes oder unter einem anderen herlaufen?