MDI-Anwendung beenden



  • Hiya,

    habe ein Problem:

    Wenn ich ein MDI-Containerfenster schließen will ( z.B. über Systemmenü ), wird jeweils immer nur ein MDI-Child-Window geschlossen.
    Wie kann ich das Ereignis "Programm beenden über Systemmenü"
    oder "ALT + F4" abfangen ? Mit "Closing" oder "Close" geht das nicht, da diese anscheinend erst ausgeführt werden, wenn alle Child-Fenster geschlossen sind.
    Habe bisher das dadurch gelöst, indem ich in der WndProc auf WM_CLOSE reagiere. Das scheint mir aber eine unsaubere Lösung zu sein.

    Kennt jemand eine bessere ?



  • WndProc? WM_CLOSE? Das klingt in meinen Ohren nicht nach C#... bist Du Dir sicher, daß Du nicht C programmierst?



  • @Marc++us

    absolut.

    Meine auch, dass das unsauber ist. Aber gibt es da eine bessere Möglichkeit ?:

    protected override void WndProc( ref Message m )
    {
    switch ( m.Msg )
    {
    case 0x10: // WM_CLOSE
    {
    BeendeProgramm();
    return;
    }
    }

    base.WndProc( ref m );
    }

    "BeendeProgramm" schließt alle MDI-Child-Fenster.

    Noch was :

    seit ich ein MainMenü zu dem MDI-Container hinzugefügt habe ist der Shortcut "ALT+F4" nicht mehr verfügbar (obwohl ich diesen expliziet angegeben habe).



  • Was für eine Version hast du?



  • Das mit den Shortcut war mein Fehler. 🙄 Klappt jetzt wieder.

    Das Problem ist halt, wenn ein MDIChild-Fenster geschlossen wird, ob nur dieses Fenster geschlossen wird oder das gesamte Programm ( Weil dann beim Beenden des MDIChilds anders reagiert werden muss ).

    OnClosing scheidet aus, da zuerst die MDIChildren-Messagehandler für das Closing-Event angesprungen werden, erst dann der Handler des MDIParent.

    Daher frage ich in der WndProc-Funktion des MDIParent nach der WM_CLOSE-Message und setzt dort ein Flag, dass das gesamte Programm beendet werden soll. Auf dieses Flag (Property) greife ich dann von den MDIChildren aus zu. Denke aber, das ist unsauber, weil plattformabhängig ( auch wenn das bei diesem Programm keine Rolle spielt ).

    Meine Version ist: 1.0.3705 (Framework)
    7.0.9514 (Entwicklungsumgebung)


Anmelden zum Antworten