IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - Screenshots mit Direct3D (VB)



Screenshots mit Direct3D (VB)

In diesem Artikel geht es um das Speichern eines Screenshots einer Direct3D-Anwendung in eine Bitmap-Datei auf der Festplatte.


Autor: Tobias Surmann (incsoft)
Datum: 31-05-2003, 22:26:12
Referenzen: keine
Schwierigkeit: Profis
Ansichten: 6777x
Rating: 9 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Screenshots mit Direct3D (VB)

In diesem Artikel geht es um das Speichern eines Screenshots einer Direct3D-Anwendung in eine Bitmap-Datei auf der Festplatte. Laut Dokumentation stellt uns DirectX keine solche Funktion in VB zur Verfügung, allerdings gibt es eine undokumentierte Methode SaveSurfaceToFile, die zur D3DX8-Klasse gehört. Die Vorgehensweise sieht nun folgendermaßen aus:
  1. Bildschirmauflösung ermitteln
  2. Eine neue Surface in Größe der Bildschirmauflösung erstellen
  3. Den FrontBuffer in die erstellte Surface schreiben
  4. Die Surface mit Hilfe der SaveSurfaceToFile-Methode auf Festplatte sichern
Diese vier Schritte setzen wir nun in einer öffentlichen Funktion um.

Deklarationen

Public Function SaveScreenShot3D(dev As Direct3DDevice8, d3dx
As D3DX8, strFileName As String) As Boolean

	Dim Surf As Direct3DSurface8
	Dim Palette As PALETTEENTRY
	Dim r As RECT
	Dim DispMode As D3DDISPLAYMODE

	On Error Goto errOut


Soweit zu den benötigten Deklarationen für unsere Funktion. Zunächst deklarieren wir die Surface in die das Bild des FrontBuffers gespeichert werden soll (Surf). Außerdem benötigt die Methode SaveSurfaceToFile als vierten Parameter eine leer(!) übergebene Variable vom Typ PALETTEENTRY (Palette). r ist eine einfache Variable, die ein Rechteck beschreibt. Dispmode wird benötigt, um die aktuelle Bildschirmauflösung auszulesen. Zum Schluss schalten wir noch die Fehlerbehandlung ein.

Bildschirmauflösung ermitteln

Für das Ermitteln der Bildschirmauflösung müssen wir auf die GetDisplayMode-Methode des als Parameter dev übergebenen Direct3DDevice8 zurückgreifen.

dev.GetDisplayMode DispMode


Da DispMode by reference an die GetDisplayMode-Methode übergeben wird, befindet sich nach Aufruf der Funktion die aktuelle Bildschirmauflösung in dieser Variablen.

Neue Surface erstellen

Im nächsten Schritt wird die Surface erstellt, die den Screenshot des FrontBuffers aufnehmen wird. Die Surface wird in Größe der Bildschirmauflösung erzeugt.

Set Surf = dev.CreateImageSurface(DispMode.Width,
DispMode.Height, D3DFMT_A8R8G8B8)


Die Surface wird als D3DFMT_A8R8G8B8 erstellt, da, wie Sie im nächsten Schritt sehen werden, der FrontBuffer nur in diesem Format von DirectX zurückgegeben werden kann.

FrontBuffer in Surface schreiben

Der FrontBuffer beinhaltet den aktuellen Bildschirminhalt. Der Screenshot wird mit GetFrontBuffer in die zuvor angelegte Surface kopiert.

dev.GetFrontBuffer Surf


Auch hier erfolgt die Übergabe von Surf by reference, so dass nach Aufruf der Funktion in Surf der Screenshot gespeichert ist. Dieser muss nun nur noch auf Festplatte gesichert werden.

Screenshot auf Festplatte speichern

Die Methode SaveSurfaceToFile erwartet 5 Parameter. Der erste ist der Dateiname unter dem der Screenshot gespeichert werden soll. Danach wird durch die DirectX-Konstante D3DXIFF_BMP das Speicherformat festgelegt. Als dritten Parameter muss an die Funktion die Surface Surf und als vierten Parameter die leere Palette übergeben werden. Zum Schluss wird mit Hilfe der RECT-Variablen r festgelegt, welcher Ausschnitt der Surface gespeichert wird. Deshalb müssen wir diese Variable vor Aufruf der Funktion noch vorbereiten.

With r
		.Left = 0
		.Top = 0
		.Right = DispMode.Width
		.Bottom = DispMode.Height
	End With

	d3dx.SaveSurfaceToFile strFileName, D3DXIFF_BMP, Surf,
	Palette, r

	SaveScreenShot3D = True
	Exit Function

errOut:

	SaveScreenShot3D = False

End Function


Da wir den kompletten Bildschirm einfangen möchten, wird auch r mit der aktuellen Bildschirmauflösung versorgt.

Zusammenfassung

Als Zusammenfassung hier noch mal der komplette Quelltext der Funktion ohne Erklärungen zum schnellen Einfügen in das eigene Projekt.

Public Function SaveScreenShot3D(dev As Direct3DDevice8, d3dx
As D3DX8, strFileName As String) As Boolean Dim Surf As Direct3DSurface8 Dim Palette As PALETTEENTRY Dim r As RECT Dim DispMode As D3DDISPLAYMODE On Error Goto errOut dev.GetDisplayMode DispMode Set Surf = dev.CreateImageSurface(DispMode.Width,
DispMode.Height, D3DFMT_A8R8G8B8) dev.GetFrontBuffer Surf With r .Left = 0 .Top = 0 .Right = DispMode.Width .Bottom = DispMode.Height End With d3dx.SaveSurfaceToFile strFileName, D3DXIFF_BMP, Surf,
Palette, r SaveScreenShot3D = True Exit Function errOut: SaveScreenShot3D = False End Function


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06245
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1147
Comments: 0