Noob-Frage : 2 Fenster und nur eins löschen???



  • also ich hab da mal ne anfänger-frage...

    wenn ich 2 Fenster erstelle wie z.B. hier :

    #include <windows.h> 
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) 
    { 
    char szName[] = "Fensterklasse"; 
    WNDCLASS wc; 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    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 (LTGRAY_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = szName; 
    RegisterClass (&wc); 
    
    HWND hwnd = CreateWindow          // Fenster 1 
    ( 
        szName, 
        "Dies ist unser erstes kleines Fenster", 
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
        NULL, // Handle des Elternfensters nicht vorhanden 
        NULL, 
        hI, 
        NULL 
    ); 
    
    ShowWindow   (hwnd, iCmdShow); 
    UpdateWindow (hwnd); 
    
    HWND hwnd2 = CreateWindow        // Fenster 2 
    ( 
        szName, 
        "Dies ist unser zweites kleines Fenster", 
        WS_OVERLAPPEDWINDOW, 
        200, 200, 200, 50, 
        hwnd, // Handle des Elternfensters 
        NULL, 
        NULL, 
        NULL 
    ); 
    
    ShowWindow   (hwnd2, SW_SHOWNORMAL); 
    UpdateWindow (hwnd2); 
    
    //----------------------------------------------------------------------------------- 
    
      MSG msg; 
      while (GetMessage (&msg, NULL, 0, 0)) 
      { 
        TranslateMessage (&msg); 
        DispatchMessage (&msg); 
      } 
    return msg.wParam; 
    } 
    
    //----------------------------------------------------------------------------------- 
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
    
        switch (message) 
        { 
        case WM_PAINT: 
            hdc = BeginPaint (hwnd, &ps); 
                TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20); 
            EndPaint (hwnd, &ps); 
        return 0; 
    
        case WM_DESTROY: 
            PostQuitMessage (0); 
        return 0; 
        } 
    
    return DefWindowProc (hwnd, message, wParam, lParam); 
    }
    

    und wenn ich dann das 2. Fenster schließe, schließt sich die gesamte anwendung...
    wie kann ich das machen, dass wenn er die WM_DESTROY Nachricht aufruft wirklich nur das Fenster löscht.

    Früher hab ich das Problem immer so gelöst, dass ich alle Fenster am Anfang geöffnet habe, nur nicht alle angezeigt...aber das ist ja keine dauerhafte lösung...



  • Ich weiß natürlich, das die beiden Fenster in dem Beispiel nur eine Fensterprozedur haben, aber auch wenn ich für beide eine habe, kommt das selbe raus...



  • Mach nen Counter rein, immer wenn nen Fenster erstellt wird wird der Counter um eines hoch gemacht, wenn eins gelsöcht wird, um eines Runter. Wenn der Coutner 0 ist, rufste PostQuitMessage auf^^



  • ging das net mit sendmessage wm_close?



  • Vorweg: Korrigiert mich, falls ich falsch liegen sollte. 🙂

    Soweit ich weiß sendet Windows zuerst ein WM_CLOSE, wenn das Fenster geschlossen wird und dann ein WM_DESTROY für das gleiche Fenster hinterher. Bei WM_CLOSE gibt es das Fenster noch, da könnte man z.B. ein schließen des Fensters noch verhindern, bei WM_DESTROY gibt es das Fenster afaik nicht mehr. Wenn Du jetzt nur eine WndProc für beide Fenster nimmst und bei WM_DESTROY die Funktion PostQuitMessage aufrufst, dann ist es egal welches Fenster Du schließt, die Funktion beendet Deine Nachrichtenschleife und die main-Funktion wird beendet.

    Entweder Du speicherst in einer globalen Variablen das Handle des "Hauptfensters", welches, wenn es geschlossen wird dafür sorgen soll, dass auch die Anwendung beendet wird, oder Du nimmst 2 WndProcs. Die zweite für das Hauptfenster könnte z.B. nur die Nachricht WM_DESTROY mit PostQuitMessage bearbeiten und danach alle Nachrichten per CallWindowProc(...) an die andere WindowProc weiterleiten. Wäre, denke ich besser, da Du zwar eine weitere Funktion brauchst, aber keine globale Variable.



  • Wenn man WM_CLOSE nicht abfängt, wird von DefWindowProc() eine WM_DESTROY-Message erzeugt 😉

    Ich vote für die Counter-Lösung 😉



  • Ja, dann war das ja soweit richtig.

    Zum Counter: Hatte ich ganz vergessen, wenn man natürlich will, dass immer das letzte Fenster, welches geöffnet ist dafür sorgt, dass die Anwendung beendet wird, dann hast Du mit dem Counter natürlich völlig recht. Aber häufig ist es ja so, dass man ein Hauptfenster hat, welches durch das schließen dafür sorgt, dass die Anwendung beendet wird.
    Egal, ich denke es sind genügend Lösungen vorhanden, kann man sich jetzt die für sich schönste oder evtl. für den jew. Anwendungsfall bessere raussuchen. 🙂



  • Super, danke. ich denk das hilft weiter...


Anmelden zum Antworten