Weiterer Schleifendurchgang trotz WM_QUIT



  • Hallo!

    Ich versuche gerade, eine Windows Anwendung SAUBER zu beenden.

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
    	MeineKlasse::getInstance(hInstance);
    
    	MSG msg = {0};
    
    	while(msg.message != WM_QUIT)
    	{
    	    if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
            }
    
    		MeineKlasse::getInstance().Tick();
        }
    }
    
    LRESULT WINAPI MsgProc(HWND windowHandle, UINT msg, WPARAM wParam, LPARAM lParam) 
    {
    	switch(msg)
    	{
    	case WM_DESTROY:
    		MeineKlasse::getInstance().Exit();
    
    	}
    
    	return DefWindowProc(windowHandle, msg, wParam, lParam);
    }
    

    Im Konstruktor meiner Klasse wird nur das Fenster erstellt.

    void MeineKlasse::Tick()
    {
    
    	MessageBox(NULL, "Window lost!", "Error 05", MB_OK);
    
    	DestroyWindow(windowHandle);
    	PostQuitMessage(0);
    	return;
    
    	Sleep(1);
    }
    

    Kann mir nun jemand erklären, warum die MessageBox ZWEI mal erscheint, bevor das Programm beendet wird.

    Und mache ich das so generell richtig?

    MfG



  • Grml, in Exit() steht das:

    DestroyWindow(windowHandle);
    	PostQuitMessage(0);
    	return;
    

    Und wozu braucht man das return eigentlich? Steht meist hinter PostQuitMessage(0).

    MfG



  • Das return bezogen auf den Return-Typ void ist überflüssig, wenn es als letzte Anweisung im Funktiosblock steht.

    Machs mal so:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
        MeineKlasse::getInstance(hInstance);
    
        MSG msgApp;
        while(PeekMessage(&msgApp, 0, 0, 0, PM_REMOVE))
        {
            if(msgApp.message == WM_QUIT)
               break;
    
            TranslateMessage(&msgApp);
            DispatchMessage(&msgApp);
    
            MeineKlasse::getInstance().Tick();
        }
        return (msgApp.wParam);
    }
    


  • Jo, so erscheint nur eine MessageBox.

    Aber warum? Nach Tick() wurde doch WM_QUIT geworfen, somit sollte die while- Schleife kein weiteres Mal mehr durchlaufen?

    MfG



  • Achja, und bei deiner Variante beendet das Programm sofort, egal was passiert.

    MfG



  • Naja habs jetzt so gemacht:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
    	MeineKlasse::getInstance(hInstance);
    
    	MSG msg = { 0 };
    
    	while(true)
    	{
    		if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    		{ 
    			if(msg.message == WM_QUIT)
    				break; 
    
    			TranslateMessage(&msg); 
    			DispatchMessage(&msg); 
    		}
    
    		MeineKlasse::getInstance().Tick(); 
    	}
    }
    

    Geht nicht vielleicht irgendwie "eleganter"?

    MfG


Anmelden zum Antworten