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

Anonymous

unregistriert

1

18.03.2004, 19:47

Problem mit Nachrichtenschleife, Prog wird nicht beendet

Hallo,

ich hab ne Frage wegen dem Schliessen eines Fensters. Mit meinem Code wird das Fenster beim Klick auf das Kreuz rechts oben in der Ecke zwar geschlossen, jedoch wird das Programm nicht beendet, sodass ich es nur per TaskManager beenden kann:

Quellcode

1
2
3
4
5
6
7
8
9
10
while(WinMessage.message != WM_QUIT)
    {

        while( PeekMessage(&WinMessage, g_hWindow, 0, 0, PM_REMOVE) )
        {
            TranslateMessage(&WinMessage); 
            DispatchMessage(&WinMessage); 
        }

    }


Anscheinend ist es so, dass das Fenster geschlossen wird, das Programm jedoch nicht aus der Schleife heraus kommt.

Ich hoffe, dass die WindowProc Funktion hier nicht benötigt wird zum Verständnis des Problems - falls doch poste ich sie hier nochmal.

Ich würde mich freuen wenn mir jemand sagen könnte, wie die Schleife funktionieren kann.

P.S. Kennt jemand ein online Tutorial, dass einen etwas über diese Nachrichtenschleife, der WindowProc Funktion, oder wie man z.B. auf Windows Nachrichten reagiert (was soll bei Minimieren des Fensters passieren?...) beibringen kann?


Dank' Euch!

2

18.03.2004, 20:04

So auf den ersten Blick denke ich mal folgendes:
Du machst zwar ein DestroyWindow wenn du auf das X klickst (denke das macht Windows automatisch), aber es kommt keine QuitMessage. Um das zu tun füge deinem WndProc folgendes hinzu:

Quellcode

1
2
3
case WM_DESTROY:
PostQuitMessage(0);
break;


alternativ kannste dass auch in der WM_CLOSE oder in der WM_COMMAND Message bei ID_CANCEL(in Dialogen des gleiche wies X) unterbringen.

Mein Lieblings Tutorial:
www.winprog.org/tutorial/

3

18.03.2004, 20:06

mehr tuts:
http://www.engin.umd.umich.edu/CIS/course.des/cis577/lecture/win.htm
http://www.functionx.com/win32/

4

18.03.2004, 20:55

Ich habe das Problem auch immer. Auch mit PostQuitMessage(0). Es ist ja auch so das GetMessage und auch PeekMessage NULL liefern wenn die Message WM_QUIT abrufen. So hab ichs mal in der MSDN gelesen. Allerdings war dem nicht so trotz dessen das die Message einwandfrei gesendet wurde ;) Auch die Abfrage "WinMessage.message != WM_QUIT", hatt nie geholfen.

Mach es einfach so, Definier eine Variabel bRun und wenn dann die Message WM_DESTROY kommt oder du das Programm anders beendest, setzt du bRun einfach auf false.

Quellcode

1
2
3
4
while(bRun)
{
  ....
}

Dann springt das Programm einfach aus der Schleife.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

5

18.03.2004, 23:11

@Pirat!:

das PostQuitMessage(0); habe ich schon bei WM_DESTROY, hat leider nichts geholfen.

@DragonMaster:

nunja, dann müsste diese bRun Variable ja innerhalb der WindowProc Funktion verändert werden (und zwar bei WM_DESTROY). Müsste das nicht dann auch noch eine globale Variable sein, damit sie auch bei meiner Haupt-Schleife gültigkeit hat?

Ich steh' nicht so auf globale Vars ;-)

6

19.03.2004, 02:49

Ich steh auch nicht auf Globale Variabeln. Aber bei kleinen Progs ist das nicht so wild. Da bleibt es ja im Rahmen. Bei größeren habe ich eh alles in einer Application Class. Dann ist diese Variabel eine Member der Klasse und fertig.

Es ist schon eigenartig. Selbst wenn man in der Schleife auf die Nachricht WM_QUIT prüft und dann mit nem externen Prog (hab jetzt den Namen vergessen) nachschaut ob WM_QUIT gesendet wird, hilft es nichts. Naja...aber es gibt ja noch andere Möglichkeiten ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

7

20.03.2004, 14:27

warum so komliziert?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    BOOL        bQuit = FALSE;
    ZeroMemory(&Message, sizeof(MSG));

    // Nachrichtenschleife
    while(!bQuit)
    {
        // Nachrichten verarbeiten
        while(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&Message);
            DispatchMessage(&Message);

            if(Message.message == WM_QUIT||Message.message == WM_CLOSE)
            {
                // Schleife verlassen!
                bQuit = TRUE;
            }

        }
    }
}

:huhu:

Anonymous

unregistriert

8

23.03.2004, 23:43

Zitat von »"Nemo"«

warum so komliziert?


Das frage ich mich auch :huhu:

Quellcode

1
2
3
4
5
6
7
8
9
    while(1)
    {
        // Kommt keine Nachricht mehr an,...
        if(!::GetMessage(&msg,NULL,NULL,NULL))
            break;// ...werden wir die while-Schleife verlassen.

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

9

24.03.2004, 00:15

Zitat von »"_unreg"«

Zitat von »"Nemo"«

warum so komliziert?


Das frage ich mich auch :huhu:

Quellcode

1
2
3
4
5
6
7
8
9
    while(1)
    {
        // Kommt keine Nachricht mehr an,...
        if(!::GetMessage(&msg,NULL,NULL,NULL))
            break;// ...werden wir die while-Schleife verlassen.

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


Hmm....so was hatte ich auch schon. Allerdings hat die GetMessage Funktion nicht NULL geliefert als WM_QUIT gesendet wurde. So wie es in der MSDN steht. Darum der Umweg über eine Statusvariabel.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

20.04.2004, 15:14

hi

meine main loop:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool run = true;
MSG msg;

while( run )
{

    if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    {

        if( msg.message == WM_QUIT )
            run = false;    //auch ein einfaches break; sollte genügen

        TranslateMessage( &msg );
        DispatchMessage( &msg );

    }

    //...rendern, etc.

}


ich weis nicht, aber der ansatz mit GetMessage() blockiert ja das ganze prog bis ne nachricht kommt!?

Werbeanzeige