VB 5/6-Tipp 0113: Grafik flackerfrei animieren und bewegen
von ActiveVB
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: | Verwendete API-Aufrufe: | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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?