Minimieren nicht modaler Enkel-Dialoge

    • Allgemein

      Minimieren nicht modaler Enkel-Dialoge

      Moin Leute.
      Ich bastel an einer kleinen Bildverarbeitung.
      Im Hauptfenster werden die geladenen Dateien aufgelistet.
      In je einem nicht-modalen Child-Dialog wird der das Bild dargestellt.
      Die eigentliche Bildverarbeitung (Filter usw.) wird von wiederum nicht-modalen Enkel-Dialogen aufgerufen.

      Wir haben also ein Hauptfenster (mit der Liste der Bilder),
      wir haben Child-Dialoge mit den Bildern und
      wir haben Enkel-Dialoge mit den Filter-Parametern.

      Zum Binden der Childs an ihre Parents werden die Childs mit .Show(this) aufgerufen;
      beim Aufruf mit .Show() reagieren alle Fenster unabhängig voneinander.

      Dabei fiel mir folgender dem Framework innewohnender Effekt auf:
      Sind Dialoge aller drei Generationen aktiv, wird die Enkel-Generation beim Minimieren des Hauptfensters nicht mit minimiert.
      Wird das Enkel-Fenster nachträglich minimiert, werden in der TaskBar Icons von Parent und Enkel angezeigt.

      Unabhängig, ob dieses Verhalten nun spezifiziert ist oder nicht, ist es nicht steuerbar durch den Aufruf .Show() bzw. .Show(this) und damit in meinen Augen nicht in Ordnung.
      Das "Gesamtsystem" müsste sich so verhalten, als ob zuerst das Child und danach das Parent minimiert würde.
      Zur Auflösung dieses Effekts müssen wir in der WndProc-Prozedur die Minimize-Message abfangen, bevor sie vom Hauptfenster bearbeitet wird, um zum richtigen Zeitpunkt das Child und damit das Enkel zu minimieren:
      Spoiler anzeigen

      C#-Quellcode

      1. protected override void WndProc(ref Message m)
      2. {
      3. const int WM_SYSCOMMAND = 0x0112;
      4. const int SC_MINIMIZE = 0xF020;
      5. if (m.Msg == WM_SYSCOMMAND)
      6. {
      7. if (m.WParam.ToInt32() == SC_MINIMIZE)
      8. {
      9. this.Dlg.WindowState = FormWindowState.Minimized;
      10. }
      11. }
      12. base.WndProc(ref m);
      13. }
      Im Anhang ein keeines Testprojekt zur Demonstration des Verhaltens:
      TestMinimize.zip
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!