Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Snorky

Frischling

  • »Snorky« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

1

28.08.2003, 19:32

tbDirect3D Fenstererstellung im Vollbildmodus mit Bug

Einen interessanten Effekt kann man beobachten, wenn man folgendes tut:
Ein Direct3D-Tribase-Programm im Vollbildmodus starten (z.B. ein Beispielprogramm wie das Alphablending aus Kapitel 2.8 ).
Sich die Maus denken und ganz nach oben bewegen, so dass sich der gedachte Mauszeiger (der immernoch existiert und im Hintergrund läuft) auf der sich zu denkenden Titelleiste des (Vollbild-)Fensters befindet.
Dann die Maustaste drücken und gedrückt gehalten nach unten bewegen.
Effekt:
Wenn die Maus den Rahmen des Fensters trifft, sieht man den Mauszeiger, der die Größe des Fensters verändern will. Trifft man die Titelleiste richtig, dann kann man das Vollbild bewegen und die darunter liegenden Fenster sehen.
Wie auch immer ist das ein sicher sehr amüsanter aber vielleicht auch unschöner Effekt in einem Spiel. ^_^

Ok, kommen wir zur Auflösung dieses kleinen Rätsels:
In der tbDirect3D in der Init() gibt es eine Stelle, wo das Fenster mit CreateWindow() erstellt wird. Dort werden für den Window-Style die Flags WS_VISIBLE | WS_OVERLAPPEDWINDOW verwendet. Das macht im Fenstermodus durchaus Sinn, nur im Vollbild kann es zum oben erwähnten Problem kommen. Irgendwo habe ich mal gelesen, dass WS_POPUP in solchen Fällen das Angebrachte sei, also ersetze ich mal den vorhanderen CreateWindow-Aufruf durch folgenden:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            // Fenstertyp je nach Vollbild/Window unterscheiden
            DWORD dwStyle = 0;
            if(pConfig->Direct3D.bWindowed)
                dwStyle = WS_VISIBLE | WS_OVERLAPPEDWINDOW;
            else
                dwStyle = WS_POPUP;
            
            // Fenster erstellen und prüfen
            m_hWindow = CreateWindow("TriBase Direct3D Window Class",
                                    pcWindowTitle,
                                    dwStyle,
                                    GetSystemMetrics(SM_CXSCREEN) / 2 - pConfig->Direct3D.VideoMode.Width / 2,
                                    GetSystemMetrics(SM_CYSCREEN) / 2 - pConfig->Direct3D.VideoMode.Height / 2,
                                    pConfig->Direct3D.VideoMode.Width,
                                    pConfig->Direct3D.VideoMode.Height,
                                    NULL,
                                    NULL,
                                    tb_g_DLLHandle,
                                    NULL);
            if(m_hWindow == NULL)
            {
                // Fehler!
                TB_ERROR("Erstellung des Fensters ist fehlgeschlagen!", TB_ERROR);
            }

Bei mir funktionierts damit sehr gut, kein Nebeneffekt mehr, Fenstermodus bleibt unangetastet, was will man mehr? ;D

2

28.08.2003, 20:43

Ich nutz immer WS_OVERLAPPED | WS_VISIBLE. Das gibt keine Probleme im Vollbildmodus und man hat einen vernünftigen Rahmen für den Window Mode. Einziger nachteil: Man kann das Fenster nett Skalieren. Dafür hat man damit dann aber auch keinen Stress :)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Snorky

Frischling

  • »Snorky« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

3

28.08.2003, 20:58

Hmm, habs mal ausprobiert, bei der WS_OVERLAPPED | WS_VISIBLE -Version kam bei mir der gleiche Bug-Effekt wie ursprünglich auch. Hinzu kommt noch, dass dann der Fenstermodus nicht mehr skalierbar ist und die Minimier/Maximier/Exit-Buttons in der Leiste fehlen. :(

4

28.08.2003, 23:02

Ja das diese Sachen fehlen, hab ich ja schon gesagt. Aber komisch. Hab mal versucht den Bug zu reproduzieren, was nicht gelang ???

[edit]Ich hab Win2k, was hast du?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Snorky

Frischling

  • »Snorky« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

5

29.08.2003, 09:51

Hab WinXP, kann natürlich sein, dass es daran liegt, wundert mich jetzt aber schon ein wenig. Du weißt aber, was ich mit dem Bug meine, dass man das (Vollbild-)Fenster mit einem Mausklick auf der Titelleiste bewegen kann, oder?
Tja, dann handelt es sich wohl um ein rechnerspezifisches Problem. Aber gut zu wissen, wenn man bei den Systemanforderungen des Spiels nicht einige Betriebssysteme ausschließen möchte. ;)

6

29.08.2003, 13:11

Ja ich weis was du meinst. Ich hab das gestern mit meinem eigenen Mouse Cursor und mit dem Systemcursor versucht. Vieleicht liegt es ja auch daran, das ich es nur mit DirectInput versucht habe.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

7

06.05.2004, 18:44

hi,
würde gerne WS_POPUP statt WS_VISIBLE | WS_OVERLAPPEDWINDOW nehmen, aber ich weis nicht, wie ich das nun einbaun soll... da ich die TriBase.dll benutz. kann ich die tbDirect3D.cpp nicht einfach abändern und die TriBase.dll neu builden?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

06.05.2004, 20:57

jop so is es. Einfach umschreiben und neu compilieren.

[edit]2nd Man kann ja einfach K eine Windowstyle angeben ;D .

Anonymous

unregistriert

9

06.05.2004, 21:59

meinst du damit, dass ich das mit den styles nachträglich ändern kann??

Werbeanzeige