Tipp 0194 Fenster im DD-Fullscreen anzeigen
Autor/Einsender:
Datum:
  Alexander Csadek
04.02.2002
Entwicklungsumgebung:
DirectX-Version:
  VB 6
DirectX 7
Wer würde nicht gerne in seinem Spiel ein Fenster einblenden, in dem der Anwender z.B. den Spielstand speichern oder die Optionen des Spieles verändern kann.
Nun, dies ist nicht ganz so einfach. Läuft DirectDraw im Vollbild-Modus, dann übernimmt es die Kontrolle des Displays. Die über die GDI erzeugten Fenster werden dann nicht mehr normal dargestellt. Sie sind zwar vorhanden, aber eben nicht sichtbar.
Im Dokument DDraw.doc aus der DX-SDK findet man zwar einen Hinweis, dass dies mit der Funktion FlipToGDISurface möglich ist, aber nur wenn die Grafikkarte CanRenderWindowed unterstützt. Der Trick liegt in den API-Funktionen.
Zunächst wird mit der Funktion GetWindowRect die Position und Größe des Fensters ermittelt. Ein Device für den Screen und für einen Speicherbereich, sowie ein Speicherbereich für ein Bitmap werden angelegt. Danach wird das Fenster als Bitmap in den Speicher kopiert und kann dann einfach weiter auf z.B. den BackBuffer kopiert werden.
Der abgebildete Code bezieht sich auf die neuen Funktionen CreateBMPFromWindow und CreateDibBMP. Da der Code für die Initialisierung von DirectX meist immer gleich bleibt, wird dieser hier nicht mehr gesondert abgebildet.
 
Option Explicit

Public Type RGBQUAD
  rgbBlue As Byte
  rgbGreen As Byte
  rgbRed As Byte
  rgbReserved As Byte
End Type

Public Type BITMAPINFOHEADER
  biSize As Long
  biWidth As Long
  biHeight As Long
  biPlanes As Integer
  biBitCount As Integer
  biCompression As Long
  biSizeImage As Long
  biXPelsPerMeter As Long
  biYPelsPerMeter As Long
  biClrUsed As Long
  biClrImportant As Long
End Type

Public Type BITMAPINFO
  bmiHeader As BITMAPINFOHEADER
  bmiColors As RGBQUAD
End Type

Public Declare Function CreateDIBSection Lib "gdi32" ( _
      ByVal hdc As Long, pBitmapInfo As BITMAPINFO, _
      ByVal un As Long, ByVal lplpVoid As Long, _
      ByVal handle As Long, ByVal dw As Long) As Long

Public Declare Function GetWindowRect Lib "user32" ( _
      ByVal hwnd As Long, lpRect As RECT) As Long

Public Declare Function GetDC Lib "user32" ( _
      ByVal hwnd As Long) As Long
      
Public Declare Function ReleaseDC Lib "user32" ( _
      ByVal hwnd As Long, ByVal hdc As Long) As Long

Public 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

Public Declare Function CreateCompatibleDC Lib "gdi32" ( _
      ByVal hdc As Long) As Long

Public Declare Function DeleteDC Lib "gdi32" ( _
      ByVal hdc As Long) As Long

Public Declare Function SelectObject Lib "gdi32" ( _
      ByVal hdc As Long, ByVal hObject As Long) As Long

Function CreateBMPFromWindow(Form_hwnd As Long) As Long
  Dim rc As RECT
  Dim X As Integer
  Dim Y As Integer
  Dim cx As Integer
  Dim cy As Integer
  Dim hdcScreen As Long
  Dim hdcMemory As Long
  Dim Bitmap As Long

  GetWindowRect Form_hwnd, rc
  X = rc.Left
  Y = rc.Top
  cx = rc.Right - rc.Left
  cy = rc.Bottom - rc.Top

  hdcScreen = GetDC(0)

  hdcMemory = CreateCompatibleDC(0)

  Bitmap = CreateDibBMP(hdcScreen, cx, cy, 16)

  SelectObject hdcMemory, Bitmap

  BitBlt hdcMemory, 0, 0, cx, cy, hdcScreen, X, Y, vbSrcCopy

  DeleteDC hdcMemory
  ReleaseDC 0, hdcScreen
    
  CreateBMPFromWindow = Bitmap
End Function

Function CreateDibBMP(hdc As Long, _
      ByVal w As Long, ByVal h As Long, _
      bpp As Integer) As Long

  Dim bih As BITMAPINFO

  bih.bmiHeader.biSize = 40
  bih.bmiHeader.biWidth = w
  bih.bmiHeader.biHeight = h
  bih.bmiHeader.biBitCount = bpp
  bih.bmiHeader.biPlanes = 1
  bih.bmiHeader.biCompression = 0
  bih.bmiHeader.biSizeImage = 0
  bih.bmiHeader.biClrUsed = 0

  CreateDibBMP = CreateDIBSection(hdc, bih, 0, 0, 0, 0)
End Function
 
Weitere Links zum Thema
Vollbild (FullScreen)
Hinweis
Um dieses Beispiel ausführen zu können, wird die DirectX 7 for Visual Basic Type Library benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (17,6 kB) Downloads bisher: [ 2110 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Mittwoch, 28. September 2011