|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 25.06.2007, 15:23 Titel: Zu Kapitel 20: Screenshot im Fenstermode |
|
|
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 |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 25.06.2007, 15:47 Titel: |
|
|
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 |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 25.06.2007, 16:03 Titel: |
|
|
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 |
|
|
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 30.06.2007, 22:43 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 01.07.2007, 08:21 Titel: |
|
|
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 |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.07.2007, 11:24 Titel: |
|
|
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 |
|
|
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 02.07.2007, 11:38 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 02.07.2007, 11:54 Titel: |
|
|
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. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 02.07.2007, 17:34 Titel: |
|
|
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 |
|
|
|
|
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
|