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

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

1

17.03.2013, 13:31

[C++] Windows Fenster schließen, ohne das DirectX Fenster zu schließen

Hi Leute

ich habe jetzt einmal mein Config Fenster, in welches ich Auflösung, Fenstermodus oder Vollbildmodus eingebe und mein DirectX9 Fenster, in welchem gerendert wird.
Nun soll nach dem ich auf Spiel starten gedrückt habe, das Fenster geschlossen werden.
Doch wenn ich
DestroyWindow(hWnd);
anwende, wird auch nach kurzer Zeit das DirectX Fenster geschlossen.

Wie bekomme ich es hin, dass ich nur das Config Fenster schließe?

So erstelle ich das Fenster:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
HWND hWndW;

HWND CreateSettingWindow ()
{
    WNDCLASSEX  windowclass;

    //Klassenname
    const char szClassName[] = "Settings";

    windowclass.cbSize = sizeof (WNDCLASSEX);
    windowclass.style = CS_GLOBALCLASS | CS_VREDRAW;
    windowclass.lpfnWndProc = SettingsWindowProc;

    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;

    windowclass.hInstance = *hInstance;

    windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);

    windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+5;
    windowclass.lpszMenuName = NULL;

    windowclass.lpszClassName = szClassName;

    if (!RegisterClassEx (&windowclass) )
        return (NULL);

    hWndW = CreateWindowEx (NULL, szClassName, "Settings",WS_EX_TOOLWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 600, 300, NULL, NULL, *hInstance, NULL);

    //Hintergrundbild
    HANDLE hImage = LoadImage( *hInstance , "background.bmp", IMAGE_BITMAP, 600, 300, LR_LOADFROMFILE);
    HWND hStatic = CreateWindow     ("STATIC", 
                                 NULL, 
                                 WS_VISIBLE | WS_CHILD | SS_BITMAP,
                                 0, -10, 
                                 200, 200, 
                                 hWndW, 
                                 (HMENU)10000, 
                                 *hInstance, 
                                 NULL);
    return (hWndW);
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »xXSlayerXx« (17.03.2013, 13:38)


2

17.03.2013, 14:20

Wie sieht denn deine WindowProc aus?

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

3

17.03.2013, 14:28

Die 2 Fenster habe jeweils 2 verschiedene WindowProc. Ichhabe schon gelesen, dass wenn sie die gleichen haben, dass es so zu dem Fehler kommt.
Was für Infos brauchst du genau?
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

4

17.03.2013, 14:50

Wie sehen denn die beiden Procs aus.
Sendest du in WM_DESTROY PostQuitMessage(0)?
Ohne Code kann ich nur raten.

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

5

17.03.2013, 14:58

Genau das war mein fehler.
Ich habe in WM_Destroy PostQuitMessage(0) gesendet.
Dadurch wurde auch das andere Fenster geschlossen.

Habe es nun rausgenommen und nun funktioniert alles wunderbar :)

vielen dank ;)
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

17.03.2013, 15:05

Wie zeigst du die beiden Fenster an, wie sieht deine Nachrichtenschleife aus?

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

7

17.03.2013, 15:18

Das ganze ist so:

erst wird das Config Fenster aufgerufen.
In diesem Fenster gibt man nun die gewünschten Werte ein.
Diese Werte werden in einer Struktur gespeichert und später benötigt um Direct3D zu initalisieren.
Nachdem Spiel starten geklickt wurde, wird nun das Fenster geschlossen.
Nun wird ein anderes Fenster mit den gewünschten Werten (Auflösung, Fenstermodus oder Vollbild und Fensterüberschrift) generiert.
Danach wird Direct3D initalisiert.

Das Problem war nun, dass ich das erste Fenster nicht schließen konnte, da sonst beide geschlossen wurden. (bzw. das eine generiert und sofort wieder geschlossen wurde).

So gibt es immer nur eine Nachrichtenschleifen

C-/C++-Quelltext

1
2
3
4
5
    while (GetMessage (&message, NULL, 0, 0) )
    {
        TranslateMessage (&message);
        DispatchMessage  (&message);
    }


nachdem das Fenster (zerstört) wurde, wird natürlich auch noch die Fensterklasse mit UnregisterClass(Classname,hInst) freigegeben.

Bei dem DirectX9 Fenster benutze ich die DoMessageLoop(); Funktion der TriBase Engine.
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Werbeanzeige