Anwendung wird nicht beendet



  • Ich habe folgende Anwendung geschrieben:

    #include <windows.h>
    #include <d3dx9.h>
    #include <mmsystem.h>
    
    LPDIRECT3D9 g_pD3D = 0;
    LPDIRECT3DDEVICE9 g_pd3dDevice = 0;
    
    HRESULT InitD3D(HWND hWnd)
    {
    	if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    		return E_FAIL;
    
    	D3DPRESENT_PARAMETERS d3dpp;
    	ZeroMemory(&d3dpp, sizeof(d3dpp));
    	d3dpp.Windowed = TRUE;
    	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    
    	if( FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
    									D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    									&d3dpp, &g_pd3dDevice)))
    		return E_FAIL;
    	return S_OK;
    }
    
    void Render()
    {
    	g_pd3dDevice->Clear(0,NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,0,0), 1.0f, 0);
    
    	if(SUCCEEDED(g_pd3dDevice->BeginScene()))
    	{
    		g_pd3dDevice->EndScene();
    	}
    
    	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
    }
    
    void CleanUp()
    {
    	if(g_pD3D != NULL)
    		g_pD3D->Release();
    	if(g_pd3dDevice != NULL)
    		g_pd3dDevice->Release();
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
    switch (message) 
    { 
    case WM_PAINT: 
        Render();
    	ValidateRect(hwnd, NULL);
        return 0; 
    
    case WM_DESTROY: 
    	CleanUp();
        PostQuitMessage (0); 
        return 0; 
    } 
    
    return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, LPSTR szCmdLine, int iCmdShow) 
    { 
    char szName[] = "Mastermind"; 
    WNDCLASS wc; 
    
    wc.style         = CS_HREDRAW | CS_VREDRAW;   // CS = "class style" 
    wc.lpfnWndProc   = WndProc; 
    wc.cbClsExtra    = 0; 
    wc.cbWndExtra    = 0; 
    wc.hInstance     = hI; 
    wc.hIcon         = LoadIcon (NULL, IDI_WINLOGO); 
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); 
    wc.lpszMenuName  = NULL; 
    wc.lpszClassName = szName; 
    
    RegisterClass (&wc); 
    
    HWND hWnd = CreateWindow (szName, "Mastermind", WS_OVERLAPPEDWINDOW,  
                              CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hI, NULL); 
    if(SUCCEEDED(InitD3D(hWnd)))
    {
    ShowWindow   (hWnd, iCmdShow); 
    UpdateWindow (hWnd); 
    // Nachrichten-Schleife 
    MSG msg;
    	while(GetMessage(&msg, hWnd, 0,0))
        { 
            TranslateMessage (&msg); 
            DispatchMessage (&msg); 
        } 
    } 
    UnregisterClass(szName, wc.hInstance);
    return 0; 
    }
    

    Und ich habe auch alle libs eingebunden(nur um dummen Fragen vorzubeugen;denn ohne libs würde es ja garnicht laufen).

    Beim klick auf das "X" zum schließen des Fensters wird jedoch wirklich nur das Fenster geschlossen nicht wie üblich das gesamte Programm beendet. Im Task Manager ist dann nämlich immernoch ein Eintrag für das Programm. Irgendwo muss ich einen Fehler gemacht haben aber ich finde ihn nicht. Kann mir jemand sagen was ich falsch gemacht habe?



  • Ich nehme an, die Message-Loop läuft weiter, dann solltest du vielleicht

    GetMessage(&msg, hWnd, 0,0)
    

    in

    GetMessage(&msg,0,0,0)
    

    umändern.



  • Ich habe es noch nicht ausprobiert aber weiß auch nicht warum es einen Unterschied machen sollte.



  • Danke, es hat geklappt, ganz entgegen meiner Erwartung. Aber kann mir jetzt auch erklärt werden wo der große Unterschied liegt?



  • Die WM_QUIT-Nachricht wird nicht an das Fenster (hWnd) geschickt, sondern an den Thread. Deswegen erfasst GetMessage(hWnd) diese Nachricht nicht und läuft weiter.


Log in to reply