none
MinimizeBox und MaximizeBox betätigt auswerten, aber wie? RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein kleines Problem mit den Buttons oben links einer Windows Form.
    Wie frage ich ab, ob einer dieser Buttons betätigt wurde.
    Ich habe diesen Artikel gefunden:

    http://social.msdn.microsoft.com/Forums/en-US/clr/thread/68045c32-e548-49bd-91d1-f109ec657c07/

    Vorschlag von Peter Richtie: Mybase.Resize Event abfangen. Nur das funktioniert bei mir nicht.
    Hintergrund ist dieser: In der Form befindet sich eine PictureBox mit geladenem Bild.
    Wenn ich die Form verkleinere und wieder öffne, wird das Bild nicht nachgeladen.
    Kein Problem dachte ich, benutze doch ein Event. Ich finde aber kein passendes Event  in der Form-Klasse
    und Resize geht nicht. Was nun?

    Grüße
    Ellen





    Sonntag, 21. Februar 2010 17:16

Antworten

  • Hallo Ellen,

    warum soll das Resize Ereignis bei Dir nicht funktionieren?

    Alternative wäre die Auswertung der Fensternachricht WM_SYSCOMMAND durch Überschreiben der WndProc Methode:

    Public Class Form1
      Private Const WM_SYSCOMMAND As Integer = &H112
      Private Const SC_MINIMIZE As Integer = &HF020
      Private Const SC_MAXIMIZE As Integer = &HF030
      Private Const SC_RESTORE As Integer = &HF120
    
    
      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
          Case WM_SYSCOMMAND
            Select Case m.WParam.ToInt32()
              Case SC_MAXIMIZE
                Debug.Print("Maximize")
    			
              Case SC_MINIMIZE
                Debug.Print("Minimize")
    			
              Case SC_RESTORE
                Debug.Print("Restore")
            End Select
        End Select
    
        MyBase.WndProc(m)
    
      End Sub
    End Class





    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Ellen Ramcke Montag, 22. Februar 2010 13:35
    Sonntag, 21. Februar 2010 19:07
    Moderator
  • Hallo Ellen,

    alternativ zu Thorstens Antwort:
    Weise der PictureBox.Image Eigenschaft eine Bitmap zu und zeichne direkt darauf,
    siehe auch das Beispiel bei der Eigenschaft.
    Dann bleibt das "Gemalte" beim Neuzeichnen der PictureBox erhalten,
    die u. a. durch Minimieren/Wiederherstellen aber auch beim Verdecken auftritt,
    wie es auch Thorsten beschreibt.

    Gruß Elmar

    P. S.:
    Zum Event gucken http://www.codeproject.com/KB/cs/eventspy.aspx
    (allerdings C#)
    Sonntag, 21. Februar 2010 21:48
    Beantworter
  • Hallo Ellen,

    wenn Du selber in die PictureBox zeichnen möchtest verwende das Paint Ereignis, sonst wird das nie was. Das ist genau für diesen Zweck gedacht. Denn die Grafik wird nicht nur gelöscht, wenn das Form minimiert wird, sondern auch wenn andere Fenster darüber bewegt werden. Wenn Du das Neuzeichnen der PictureBox über einen Button erzwingen möchtest, rufst Du die Invalidate Methode der PictureBox auf. Dadurch wird das Paint Event dann ausgelöst.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Ellen Ramcke Montag, 22. Februar 2010 13:35
    Sonntag, 21. Februar 2010 20:39
    Moderator

Alle Antworten

  • Hallo Ellen,

    warum soll das Resize Ereignis bei Dir nicht funktionieren?

    Alternative wäre die Auswertung der Fensternachricht WM_SYSCOMMAND durch Überschreiben der WndProc Methode:

    Public Class Form1
      Private Const WM_SYSCOMMAND As Integer = &H112
      Private Const SC_MINIMIZE As Integer = &HF020
      Private Const SC_MAXIMIZE As Integer = &HF030
      Private Const SC_RESTORE As Integer = &HF120
    
    
      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
          Case WM_SYSCOMMAND
            Select Case m.WParam.ToInt32()
              Case SC_MAXIMIZE
                Debug.Print("Maximize")
    			
              Case SC_MINIMIZE
                Debug.Print("Minimize")
    			
              Case SC_RESTORE
                Debug.Print("Restore")
            End Select
        End Select
    
        MyBase.WndProc(m)
    
      End Sub
    End Class





    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Ellen Ramcke Montag, 22. Februar 2010 13:35
    Sonntag, 21. Februar 2010 19:07
    Moderator
  • Hallo Thorsten,
    bei diesem Demo tritt das Problem auf. Der Code hier:

    http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/9798630d-1c51-44da-b715-c4c8141c4b7b

    Meine Erweiterung

    Handles Button1.Click   mit , Mybase.Resize funktioniert nicht.

    Ich möchte das Problem gerne in .NET lösen. Dein Code ist ja Win API.
    Picturebox ist ein Standard Windows Element. Muss doch mit .NET gehen?

    Frage: Gibt es in Express eigentlich ein Tool mit welchem man Events mitschreiben kann?


    Gruß
    Ellen



    Sonntag, 21. Februar 2010 20:27
  • Hallo Ellen,

    wenn Du selber in die PictureBox zeichnen möchtest verwende das Paint Ereignis, sonst wird das nie was. Das ist genau für diesen Zweck gedacht. Denn die Grafik wird nicht nur gelöscht, wenn das Form minimiert wird, sondern auch wenn andere Fenster darüber bewegt werden. Wenn Du das Neuzeichnen der PictureBox über einen Button erzwingen möchtest, rufst Du die Invalidate Methode der PictureBox auf. Dadurch wird das Paint Event dann ausgelöst.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Ellen Ramcke Montag, 22. Februar 2010 13:35
    Sonntag, 21. Februar 2010 20:39
    Moderator
  • Hallo Ellen,

    alternativ zu Thorstens Antwort:
    Weise der PictureBox.Image Eigenschaft eine Bitmap zu und zeichne direkt darauf,
    siehe auch das Beispiel bei der Eigenschaft.
    Dann bleibt das "Gemalte" beim Neuzeichnen der PictureBox erhalten,
    die u. a. durch Minimieren/Wiederherstellen aber auch beim Verdecken auftritt,
    wie es auch Thorsten beschreibt.

    Gruß Elmar

    P. S.:
    Zum Event gucken http://www.codeproject.com/KB/cs/eventspy.aspx
    (allerdings C#)
    Sonntag, 21. Februar 2010 21:48
    Beantworter
  • Hallo Thorsten,

    teilweise Fortschritt. Mir dem Code wird das Bild neu gezeichnet, also wenn Du ein anderes Fenster darüber legst.
    Nur nicht Minimize und anschliessend Maximize.

    Hallo Elmar, ich guck mir das genau an und melde mich.

    Gruß
    Ellen


     Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            Dim grafic As Graphics = PictureBox1.CreateGraphics()
            'Bitmap ausgeben:
            grafic.DrawImage(meinBild, pt)
        End Sub

    Sonntag, 21. Februar 2010 22:00
  • Hallo Elmar und Thorsten,

    ihr wart mal wieder sehr hilfreich. OK.
    Auch der WinAPI Code könnte irgendwann hilfreich für mich sein. Ich merk mir das mal.
    Folgender Code funktioniert jetzt:
    Du kann'st alles mit dem Fenster alles veranstalten. Das Bild baut sich immer wieder auf.

    schöne Grüße
    Ellen




    Private Sub Button1_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) Handles Button1.Click
            'Dim grafic As Graphics = PictureBox1.CreateGraphics()
            'Bitmap ausgeben:
            'grafic.DrawImage(meinBild, pt)
            PictureBox1.Image = meinBild
        End Sub
        Private Sub masterForm_Load(ByVal sender As System.Object, _
                                    ByVal e As System.EventArgs) Handles MyBase.Load
            'Bitmap aus den Resourcen erzeugen
            meinBild = My.Resources.Bitmap01
        End Sub
    Montag, 22. Februar 2010 13:35
  • Die Grundsatzfrage: Wie wird der Event von "Form ist maximiert" - Mausclick  auf "Form wird normalisiert" verarbeitet, ist nicht beantwortet (in .net)

    Resize Event wird nicht aktiviert, SizeChanged wird nicht aktiviert

    Fehlt da nicht ein Event?

    • Bearbeitet wolfskamp Freitag, 6. August 2010 09:50
    Freitag, 6. August 2010 09:29
  • Hallo,

    Resize Event wird nicht aktiviert


    doch, das Resize Ereignis wird beim Maximieren, Minimieren und Wiederherstellen gefeuert. Nur gibt es halt keine zuverlässige Aussage, was gerade der Grund für das Resize Ereignis war, daher die Abfrage von WM_SYSCOMMAND. .NET selber bietet hier kein Ereignis an und wird es für Windows Forms auch in Zukunft nicht anbieten.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 6. August 2010 09:39
    Moderator
  • Hallo,

    Theoretisch ja, z B.: http://blogs.msdn.com/b/oldnewthing/archive/2008/01/16/7123299.aspx
    Praktisch ist Windows Forms nie mit dem Anspruch angetreten,
    alle Windows Ereignisse 1 : 1 zu reflektieren.
    Wo ein solches Ereignis fehlt, gibt es immer die Möglichkeit die WndProc zu überwachen.

    Im übrigen wäre die Anfwort auf die Grundsatzfrage (wenn man es dazu machen will):
    Ein Steuerelement muß zu jeder Zeit in der Lage sein, seinen Zustand wiederherzustellen.
    Und das ist im Windows API wie in Windows Forms dem Entwickler überlassen.

    Gruß Elmar

    P. S.: Bitte keine mehrere Monate alten Threads wiederbeleben.
    Wenn ein Thema Dich interessiert, stelle bitte eine neue Frage.

    Freitag, 6. August 2010 09:56
    Beantworter
  • Sorry, aber beim Betätigen des "Normal" -button in der maximierten Form ist dies nicht der Fall.

    Der von mir umgesetzte Weg geht über ClientSizeChanged. Dort kann der o. g. Vorgang abgefangen werden und die Wiederherstellung des Form-Inhaltes im Code bearbeitet werden.

    ClientSizeChanged wird bei Größenänderungen der Form ausgelöst, der vorliegende Status kann über Windowstate abgefragt werden.

    Freitag, 6. August 2010 15:48