JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Kapitel 19 - DIRECTXGRAPHICS - Fenstergröße

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


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

BeitragVerfasst am: 11.02.2004, 20:42    Titel: Kapitel 19 - DIRECTXGRAPHICS - Fenstergröße Antworten mit Zitat

Hallo,

mir ist gerade ein kleiner "Fehler" im DIRECTXGRAPHICS Beispielprojekt aus Kapitel 19 im 2. Buch aufgefallen. Shocked
Es ist das erste Projekt in dem Direct3D zum Einsatz kommt.

Und zwar wird die Fenstergröße mit 800 * 600 initialisiert.
Die Größe des Backbuffers beträgt allerdings auch 800 * 600.

Auf den ersten Blick hört sich das nicht schlecht an, aber der Bereich des Fensters in den der BackBuffer gezeichnet wird, beträgt bei mir in Wirklichkeit 792 * 566 Pixel.

Das liegt daran, dass das Fenster noch einen Rahmen und eine CaptionBar besitzt.

Ich weiß, dass das Projekt im Grunde nur klar machen soll, wie man Direct3D initialisiert und anschließend ordnungsgemäß beendet, doch finde ich den Hinweis auf diesen Größenunterschied nicht unwichtig.

Man kann das Problem beheben Cool indem man in
Code:
// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)


diesen Abschnitt
Code:
    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "DirectX Graphics",     // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          0, 0, 800, 600,    // Anfangsposition und Größe
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt


durch diesen ersetzt
Code:
    RegisterClassEx(&wndClass);

   RECT rc;
   SetRect(&rc, 0, 0, 800, 600);

   AdjustWindowRectEx(&rc, WS_OVERLAPPEDWINDOW | WS_VISIBLE ,FALSE, 0);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "DirectX Graphics",     // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          0 ,                     // Anfangsposition und Größe
                          0 ,                     // -
                          (rc.right - rc.left),   // -
                          (rc.bottom - rc.top),   // -
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt


Es wird ein RECT erzeugt mit den Maßen [0, 0, 800, 600] und an die Funktion AdjustWindowRectEx übergeben.
Die API-Funktion rechnet nun die benötigte Größe des Fensters aus, damit der Zeichenbereich 800*600 beträgt.

MSDN


Zuletzt bearbeitet von KI am 12.02.2004, 11:40, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 12.02.2004, 08:30    Titel: Antworten mit Zitat

Hey, das ist echt gut zu wissen! Ich hab mich schon oft gefragt, wie man das macht. Es gibt ja so Funktionen um die Höhe der Titelleiste und die Breite von den anderen Rahmen herauszufinden... aber so geht das ja viel einfacher Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 12.02.2004, 09:49    Titel: Antworten mit Zitat

is echt gut zu wissen, danke.

alternativ könnte man gleich die titelleiste und rahmen weglassen, da das in fullscreen zu problemen führen kann...:

CreateWindowEx(NULL, "WindowClass", "Titel", WS_POPUP | WS_VISIBLE, ...);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 12.02.2004, 10:21    Titel: Antworten mit Zitat

fullscreen? es ging doch grade um den fenstermodus ... Rolling Eyes
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: 12.02.2004, 11:54    Titel: Antworten mit Zitat

=]Mid[=]Night[= hat Folgendes geschrieben:
Hey, das ist echt gut zu wissen! Ich hab mich schon oft gefragt, wie man das macht. Es gibt ja so Funktionen um die Höhe der Titelleiste und die Breite von den anderen Rahmen herauszufinden... aber so geht das ja viel einfacher Smile

Ja stimmt, das ist echt praktisch.
Ich hab in der MSDN allerdings gelesen, dass die AdjustWindowRectEx-Funktion das RECT nicht zusätzlich vergrößert, wenn eine Menüleiste über eine oder mehrere Reihen hinausgeht.
Außerdem stand dort, dass die Window Styles WS_VSCROLL und WS_HSCROLL nicht berücksichtig werden. (Scrollbars)
Stattdessen muss man die GetSystemMetrics-Funktion benutzen mit den Parametern SM_CXVSCROLL und SM_CYHSCROLL.

@Chewie
Gute Idee, die Titelleiste wegzulassen, wenn man in den Fullscreenmodus geht. Wink

@=]Mid[=]Night[=
Ja, in diesem Fall ging es um den Fenstermodus.
Im Fenstermodus muss man übrigens die Breite, Höhe und Farbtiefe des Backbuffers nicht angeben, weil DirectX die entsprechenden Werte automatisch ermittelt!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
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