Seite 1 von 1

(DirectX) Screenshot vom Front- bzw. Backbuffer erstellen ?!

Verfasst: 15.10.2004 14:08
von nco2k
hi folks,

ich suche einen befehl, mit dem ich ein "screenshot" vom front- bzw. backbuffer erstellen und als datei ausgeben kann. hat zufällig jemand eine idee??

vielen dank im voraus!

c ya,
nco2k

Verfasst: 15.10.2004 14:14
von sbehrens

Code: Alles auswählen

;Bitmap anlegen 
CreateImage(0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN)) 
;auf angelegtes Bitmap zeichnen 
DC = StartDrawing(ImageOutput()) 
BitBlt_(DC,0,0,ImageWidth(),ImageHeight(),GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY ) 
StopDrawing() 

;Bitmap an Fenstergroesse anpassen 
ResizeImage(0,640,480) 

If OpenWindow(0, 10, 10, 640, 480, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "Screenshot") 
StartDrawing(WindowOutput()) 
DrawImage(ImageID(),0,0) 
StopDrawing() 
  Repeat 
    EventID.l = WaitWindowEvent() 
    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
    EndIf 
  Until Quit = 1 
EndIf 
End  

; ExecutableFormat=Windows
; EOF
(Aus dem CodeArchiv)

mfG
Basti

//Edit: Ist dann wohl immer aus dem Front-Buffer, und ob es unter DirectX funzt weiß ich nicht

//Edit: PureArea.net -> CodeArchive -> Windows_System -> Screenshots

Verfasst: 15.10.2004 14:16
von DarkDragon
@ptI:
Das ist glaube ich nicht was er wollte. Er will einfach das Back- ODER Front- Buffer kopieren, nicht das, was gerade auf dem Bildschirm ist(gut Frontbuffer ist eigentlich das, was auf dem Bildschirm ist, aber was will man tun, wenn es im Fenstermodus ist?).

Verfasst: 15.10.2004 14:22
von nco2k
ich kenne das schon aus dem alten forum und genau das ist es, was ich nicht suche. :lol:

der code macht einen direkten schnapschuss "von oben drauf" samt allen was dazwischen steht. wenn ich z.b. das selbe im windowed mode machen würde und ein fenster würde einen teil, meiner anwendung verdecken, würde diese dann auch mit aufs foto gepackt und das will ich nicht. bisher habe ich das immer so gelöst http://robsite.de/php/pureboard-archiv/ ... php?t=4116, aber das ist nur eine notlösung, die ich vermeiden möchte.

c ya,
nco2k

Re: (DirectX) Screenshot vom Front- bzw. Backbuffer erstelle

Verfasst: 15.10.2004 14:55
von Danilo
nco2k hat geschrieben:ich suche einen befehl, mit dem ich ein "screenshot" vom front- bzw. backbuffer erstellen und als datei ausgeben kann. hat zufällig jemand eine idee??
Ich mache Screenshots einfach bei einer Taste (z.B. F1):
GrabSprite, SaveSprite, FreeSprite

EDIT:
Falls Du direkt DX meinst, dann kommt es darauf an welche
Version von DX Du programmierst.
Bei DX9 schauste Dir mal IDirect3DDevice9::GetFrontBufferData() an.

IDirect3DDevice9::GetFrontBufferData():
"This method is the only way to capture an antialiased screen shot."

Verfasst: 15.10.2004 15:05
von MUDHead
MUDHead hat geschrieben:Screenshots kann man ganz einfach so machen:

Code: Alles auswählen

Procedure Screenshot(ImageNr,x,y,Width,Height) 
  hImage = CreateImage(ImageNr,Width,Height) 
  hDC    = StartDrawing(ImageOutput()) 
  DeskDC = GetDC_(GetDesktopWindow_()) 
  BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY) 
  StopDrawing() 
  ReleaseDC_(GetDesktopWindow_(),DeskDC) 
 ProcedureReturn hImage 
EndProcedure


Screenshot(0, 0, 0, 1024, 768) 
SaveImage(0, "C:\DesktopScreenshot.gif")
oder gleich im Programm mit :

Code: Alles auswählen

 SaveSprite, FreeSprite,GrabSprite
ah, hat Danilo schon gesagt.


EDIT: Code eingerückt
sry, hab nicht gesehen, dass es schon mal angeboten wurde.



Ja,

Code: Alles auswählen

GrabSprite,SaveSprite, FreeSprite

Verfasst: 15.10.2004 15:55
von nco2k
@MUDHead
das suche ich nicht, siehe weiter oben! ausserdem meinst du sicherlich "GrabSprite,SaveSprite,FreeSprite" und nicht "SaveSprite,FreeSprite,GrabSprite".

@Danilo
vielen dank für den tip! wusste nicht das es so auch geht. werd mir dennoch mal IDirect3DDevice9::GetFrontBufferData() anschauen, klingt sehr vielversprechend. :allright:

c ya,
nco2k