| |
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 |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|