| |
Fortgeschrittene ProgrammierungBitmap zwischenspeichern in vb6 | | | Autor: Protolus | Datum: 17.03.20 12:17 |
| Hallo, ich habe einen Graphik-Editor programmiert. Dazu müssen natürlich Objekte auf dem Screen "bewegt" werden können. Wenn sich ein Objekt bewegt, muss der alte Hintergrund wieder hergestellt werden, der neue Hintergrund gespeichert und schliesslich das Objekt gezeichnet werden.
Ich speichere den Hintergrund Pixel für Pixel in einem ganz normalen Array und zeichne das Objekt ebenfals Pixel für Pixel aus einem Array heraus. Dazu benutze ich For/Next-Schleifen und die Graphik-API-Functions "Getpixel" bzw "Setpixel".
Das ganze funktioniert ganz gut, solange die Objekt-Graphiken relativ klein sind. Je grösser die Objektgraphiken werden, um so "ruckeliger" wird die Bewegung der Objekte. Das hin- und her- kopieren mit For/Next-Schleifen ist einfach zu langsam.
"Bitblt" ist viel viel schneller aber wie speichere ich den Hintergrund in einer Art Objektarray, so dass ich "bitblt" oder GDItransparentblt" nutzen könnte? Komme mit Kompatiblen oder "DeviceContext" bzw Kompatibler oder Bitmap nicht zurecht. Mir fehlt einfach das Hintergrundwissen. | |
Re: Bitmap zwischenspeichern in vb6 | | | Autor: Zardoz | Datum: 17.03.20 18:45 |
| Hallo Protolus,
du kannst eine zusätzliche Picturebox, die zur Entwurfszeit mit
einem Index versehen wurde, als Bildspeicher verwenden. Es ist zwar
möglich mit Api-Funktionen Bitmaps im Speicher zu erstellen. Das
erfordert aber einige Vorkenntnisse.
Hier ein Beispiel mit Pictureboxen:
Controls: 1 * Button, 2 * Picturebox
Picturebox2 mit Index = 0
Option Explicit
Private Declare Function 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) _
As Long
Private SW&, SH&, N&
Private Sub Form_Load()
Dim i&
Me.ScaleMode = vbPixels
SW = 600
SH = 400
N = 0
With Picture1
.BorderStyle = vbBSNone
.ScaleMode = vbPixels
.Move 8, 16 + Command1.Height, SW, SH
.ForeColor = vbWhite
.FontSize = 24
.FontBold = True
.BackColor = vbBlack
.AutoRedraw = True
For i = 1 To 10
.Cls
.FillStyle = vbFSSolid
.FillColor = QBColor(i)
Picture1.Circle (SW / 2, SH / 2), 200 - i * 10, vbWhite
.CurrentX = 10
.CurrentY = 10
Picture1.Print "Grafik" & Str$(i)
If N > 0 Then Load Picture2(N)
With Picture2(N)
.Visible = False
.BorderStyle = vbBSNone
.ScaleMode = vbPixels
.Move 0, 0, SW, SH
.AutoRedraw = True
Call BitBlt(.hDC, 0, 0, SW, SH, _
Picture1.hDC, 0, 0, vbSrcCopy)
End With
N = N + 1
.Cls
Next i
.FillStyle = vbFSTransparent
End With
Command1.Move 8, 8
Command1.ZOrder vbBringToFront
N = 0
End Sub
Private Sub Command1_Click()
Call BitBlt(Picture1.hDC, 0, 0, SW, SH, _
Picture2(N).hDC, 0, 0, vbSrcCopy)
Picture1.Refresh
N = (N + 1) Mod 10
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim i&
For i = 1 To Picture2.UBound
Unload Picture2(i)
Next i
End Sub Gruss,
Zardoz | |
Re: Bitmap zwischenspeichern in vb6 | | | Autor: Protolus | Datum: 17.03.20 20:13 |
| Hallo Zardoz, vielen Dank für die Antwort.
Dass ich mit indizierten "PictureBox'en" arbeiten könnte, ist mir schon klar.
Will ich aber irgendwie nicht. Scheint mir unelegant und "Resourcenvergeudung" zu sein.
Hab das mit "Device Context", "Compatibler Bitmap" usw mir genau angeschaut und glaub ich jetzt soweit verstanden. (Try and error and think)!!!
Wäre aber schön, wenn ich das irgendwo genau nachlesen könnte oder erklärt bekommen würde.
Meine Lösung:
hCDC = CreateCompatibleDC(Bild.hdc)
hBackground = CreateCompatibleBitmap(Bild.hdc, br, hö)
SelectObject hCDC, hBackground
'Background von Objektposiition (xp, yp, br, hö) sichern.
ret = BitBlt(hCDC, 0, 0, br, hö, Bild.hdc, xp, yp, SRCCOPY)
Muss nur die handles in einem array verwalten. Geht ganz gut. Kein ruckeln mehr.
Danke nochmal für die Antwort und für die Mühe die Du Dir gemacht hast. | |
Re: Bitmap zwischenspeichern in vb6 | | | Autor: Souffleurlos | Datum: 18.03.20 17:45 |
| Hallo Protolus,
double Buffering ist die Antwort. Die Antworten findest du hier oder auch im Internet. Es geht darum, dass im Speicher ein Devicekontext erzeugt wird und daraus und in dein Zielkontext mittels Blitter des Betriebssystems ruchelfrei Graphikdaten hin und hergeschoben werden. Wie Zardoz scheibt sind gewisse Kenntnisse über die WinAPI, insbesondere GDI, erforderlich, aber das Thema ist nicht so prickelnd schwer. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|