vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Bitmap 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel