JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=dc911e82b9791e347cb6499737124104Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zu Kapitel 20: Screenshot im Fenstermode

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 25.06.2007, 15:23    Titel: Zu Kapitel 20: Screenshot im Fenstermode Antworten mit Zitat

Ich schreibe einen Moleküleditor im Fenstermodus mit Menüs. Nun will ich einen Screenshot des Client-Bereichs erstellen.

Die Funktion GetWindowRect() liefert einen Bildschirmbereich, welcher auch das Menü enthält (was unerwünscht ist).

Die Funktion GetClientRect() liefert nur die Größe des Client-Bereichs (und nicht das Rechteck des Client-Bereichs in Screenkoordinaten).

Wenn meine Fensterrahmen auf allen Plattformen die gleiche Größe hätten, könnte ich aus beiden Funktionen den entsprechenden Bereich ermitteln (was vielleicht unwahrscheinlich ist).

Gibt es hierfür keine eigene Funktion oder einen anderen empfehlenswerten Weg?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 32
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 25.06.2007, 15:47    Titel: Antworten mit Zitat

Hi
Hol die zuerst das ClientRect mit GetClientRect() und dann kannst du es mit ClientToScreen() in Bildschirmkoordinaten umwandeln.

Kannst es auch selber umrechnen, dazu kannst du die Funktion GetSystemMetrics() zur Hilfe nehmen.


Wenn du mit D3D arbeitest und dann GetFrontBufferData() aufrufst bekommst du auch nur den Client Bereich.

MfG 51m0n
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 25.06.2007, 16:03    Titel: Antworten mit Zitat

CPP:
   // Größe des Fensters berechnen
   RECT rcWnd = { 0, 0, 800, 600 };

   // Hier die gleichen WS-Flags übergeben, wie bei CreateWindow
   AdjustWindowRect(&rcWnd, WS_CAPTION, FALSE);

   // Zentrierte Position des Fensters berechnen
   const int xSize = rcWnd.right - rcWnd.left;
   const int ySize = rcWnd.bottom - rcWnd.top;

   // Fenster erstellen
   HWND hWnd = CreateWindowEx(
      0,
      _T("WindowClass"),
      _T("Molekül-Editor"),
      WS_CAPTION|WS_SYSMENU,
      (GetSystemMetrics(SM_CXSCREEN) - xSize) / 2,
      (GetSystemMetrics(SM_CYSCREEN) - ySize) / 2,
      xSize,
      ySize,
      NULL,
      NULL,
      hInstance,
      NULL);

   if(!hWnd)
   {
      MessageBox(
         NULL,
         _T("Konnte kein Hauptfenster erstellen!"),
         _T("Fehler"),
         MB_ICONERROR);

      return 1;
   }
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 30.06.2007, 22:43    Titel: Antworten mit Zitat

Danke für die Antworten!

Ich benutze folgende Funktion:

Code:
void CDirect3D::CreateScreenshot(char* Filename,HWND hWnd)
{
   // temporäre Oberfläche für den Screenshot anlegen
   LPDIRECT3DSURFACE9 lpSurface;

   HWND DesktopWindow = GetDesktopWindow();
   RECT DesktopRect;
   GetWindowRect(DesktopWindow,&DesktopRect);

   m_lpD3DDevice->CreateOffscreenPlainSurface(
                     DesktopRect.right,
                     DesktopRect.bottom,
                     D3DFMT_A8R8G8B8,
                     D3DPOOL_SYSTEMMEM,
                     &lpSurface,0);

   // Inhalt des Frontbuffer in die Oberfläche kopieren
   m_lpD3DDevice->GetFrontBufferData(0,lpSurface);

   // Client-Rect in Screenkoordinaten ermitteln:
   RECT ClientRect;
   GetClientRect(hWnd,&ClientRect);
   POINT Point1;
   POINT Point2;
   Point1.x = 0;
   Point1.y = 0;
   Point2.x = ClientRect.right;
   Point2.y = ClientRect.bottom;
   
   ClientToScreen(hWnd,&Point1);
   ClientToScreen(hWnd,&Point2);

   ClientRect.left = Point1.x;
   ClientRect.top = Point1.y;
   ClientRect.right = Point2.x;
   ClientRect.bottom = Point2.y;

   // Oberfläche in Datei speichern
   D3DXSaveSurfaceToFile(Filename,D3DXIFF_BMP,
                  lpSurface,0,&ClientRect);

   // temporäre Oberfläche wieder freigeben
   lpSurface->Release();

}

Ich versuche MFC nicht zu verwenden (deshalb wird POINT verwendet).

Später werde ich die Funktion neu schreiben und versuchen, direkt auf den Backbufferinhalt zuzugreifen, da dessen Inhalt auf das jeweilige Fenster gemappt wird, wobei die Grafik schlechter werden kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 01.07.2007, 08:21    Titel: Antworten mit Zitat

User_User hat Folgendes geschrieben:
Später werde ich die Funktion neu schreiben und versuchen, direkt auf den Backbufferinhalt zuzugreifen, da dessen Inhalt auf das jeweilige Fenster gemappt wird, wobei die Grafik schlechter werden kann.


Jop, so mach ichs auch immer, aber die Graphik wird danei net unbedingt schlechter. Du musst bei dieser Variante nur darauf achten wann du einen Screenshot vom Backbuffer holst. Den solltest du logischerweiße immer nach allen render und draw methoden holen und nicht nachdem du ihn gerade frisch gecleart hastt Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.07.2007, 11:24    Titel: Antworten mit Zitat

Weshalb genau sollte die Grafik des Screenshots denn schlechter werden? Immerhin holst du dir die Orignalfassung des Bildes ab ungestreckt etc genau das was man doch eigentlich haben möchte.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 02.07.2007, 11:38    Titel: Antworten mit Zitat

Fallen hat geschrieben:
Zitat:
Weshalb genau sollte die Grafik des Screenshots denn schlechter werden?


Angenommen, dass ich bei der CreateDevice-Methode die Werte von der Struktur (D3DPRESENT_PARAMETERS) auf folgende Werte setze:

PParams.BackBufferWidth = 800;
PParams.BackBufferHeight = 600;

Nun maximiere ich mein Fenster auf 1024 x 768 Pixel.

Dann wird doch (wenn ich mich nicht irre) die Grafik mit 800x600 Pixel auf das größere Fenster kopiert und gleichzeitig entsprechend vergrößert. Bei z.B. Linien, Strecken, usw. welche leicht pixelig dargestellt wurden, erscheinen bei Vergrößerung jetzt viel deutlicher pixelig.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 02.07.2007, 11:54    Titel: Antworten mit Zitat

Wenn der Backbuffer auf ein Frontbuffer skliert werden muss wird die Qualität sehr schnell schlechter, was ich gestern leider erfahren musste siehe hier Fallen hat schon recht wenn er dir rät die Orginalfassung für den Screenshot zu holen. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 02.07.2007, 17:34    Titel: Antworten mit Zitat

User_User hat Folgendes geschrieben:
Fallen hat geschrieben:
Zitat:
Weshalb genau sollte die Grafik des Screenshots denn schlechter werden?


Angenommen, dass ich bei der CreateDevice-Methode die Werte von der Struktur (D3DPRESENT_PARAMETERS) auf folgende Werte setze:

PParams.BackBufferWidth = 800;
PParams.BackBufferHeight = 600;

Nun maximiere ich mein Fenster auf 1024 x 768 Pixel.

Dann wird doch (wenn ich mich nicht irre) die Grafik mit 800x600 Pixel auf das größere Fenster kopiert und gleichzeitig entsprechend vergrößert. Bei z.B. Linien, Strecken, usw. welche leicht pixelig dargestellt wurden, erscheinen bei Vergrößerung jetzt viel deutlicher pixelig.


Verzeih, ich habe überlesen das du mit schlechter werden das gestreckte selbst meintest und nicht den Inhalt des Backbuffers.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum