|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 11.02.2004, 20:42 Titel: Kapitel 19 - DIRECTXGRAPHICS - Fenstergröße |
|
|
Hallo,
mir ist gerade ein kleiner "Fehler" im DIRECTXGRAPHICS Beispielprojekt aus Kapitel 19 im 2. Buch aufgefallen.
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 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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 12.02.2004, 08:30 Titel: |
|
|
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 |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 12.02.2004, 09:49 Titel: |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 12.02.2004, 10:21 Titel: |
|
|
fullscreen? es ging doch grade um den fenstermodus ... |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 12.02.2004, 11:54 Titel: |
|
|
=]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 |
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.
@=]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 |
|
|
|
|
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
|