Beginn und Ende von Form Resize mitbekommen
-
Hi,
gibt es eine Möglichkeit mitzubekommen, wenn ein System.Windows.Forms Objekt am Rahmen vergrößert/verkleinert wird und wenn dies wieder aufhört?
Ich habe das Problem, dass ein Event-Handler von Resize recht aufwendig ist und er das Vergrößern ausbremst. Ich könnte die kritischen Aktionen nach hinten verschieben, also erst durchführen, wenn der Benutzer den Rahmen des Fensters wieder losgelassen hat.
Hat da jemand ne Idee? Gibt es eventuell eine Windows-Message oder so? Für Hilfe jeglicher Art wäre ich dankebar
Ciao,
Felix
-
Beispiel
[Visual Basic, C#, C++] Im folgenden Beispiel wird das Resize-Ereignis eines Form behandelt. Beim Ändern der Größe des Formulars stellt der Ereignishandler sicher, dass das Formular quadratisch bleibt (Height und Width sind gleich).[Visual Basic]
[b]Private Sub[/b] Form1_Resize(ByVal sender [b]As[/b] System.Object, ByVal e [b]As[/b] System.EventArgs) [b]Handles[/b] MyBase.Resize [b]Dim[/b] myControl [b]As[/b] Control myControl = sender ' Ensure the Form remains square (Height = Width). [b]If[/b] myControl.Size.Height <> myControl.Size.Width [b]Then[/b] myControl.Size = [b]New [/b]Size(myControl.Size.Width, myControl.Size.Width) [b] End If End Sub[/b]
[C#]
private void Form1_Resize(object sender, System.EventArgs e) { Control control = (Control)sender; // Ensure the Form remains square (Height = Width). if(control.Size.Height != control.Size.Width) { control.Size = new Size(control.Size.Width, control.Size.Width); } }
Einfach mal in MSDN gucken unter:
OnResize | Size | Layout | Ändern der Größe von Steuerelementen in Windows Forms
-
FelixManke schrieb:
Hi,
gibt es eine Möglichkeit mitzubekommen, wenn ein System.Windows.Forms Objekt am Rahmen vergrößert/verkleinert wird und wenn dies wieder aufhört?
Ich habe das Problem, dass ein Event-Handler von Resize recht aufwendig ist und er das Vergrößern ausbremst. Ich könnte die kritischen Aktionen nach hinten verschieben, also erst durchführen, wenn der Benutzer den Rahmen des Fensters wieder losgelassen hat.
Hat da jemand ne Idee? Gibt es eventuell eine Windows-Message oder so? Für Hilfe jeglicher Art wäre ich dankebar
Ciao,
Felixausbremst ich weiss nicht willst Du WinAPI nutzen oder WindowsDLL-Aufruf die is doch ehe denke ich ins so von Microsoft eingefrimmelt worden so das Du nur noch das Resize überlädst! Ich habe keine Ahnung ob das überhaupt noch schneller wird wenn Du da vielleicht unmanaged Code selbstbasteln willst!
Wenn es so zeitkritisch ist für Deine Anwendung wäre die Anwendung auf Basis C/C++ ohne .NET besser (C WinAPI).
-
was ist an obige Code in Resize aufwändig tzzz.
Unmanaged Code als Ersatz für obiges is doch mit der Kirche ums Dorf
-
Zum anderen kannst Du
SizeChanged überladen
wie die Methode schon heisst kommt die erst wenn der Nutzer mit der Maus das Ding schon vergrössert hat und nicht ständig wie bei Resize-Überladung!
private void Form1_SizeChanged(object sender, System.EventArgs e) { // hier jetzt das gleich oder was anderes wie bei Resize }
Oder Du musst irgendwas mit MouseUp und MouseDown machen?!
Wenn umbedingt Beginn und Ende sein Soll speichere Dir in einer Flagvariablen
MouseDown und bring es irgendwie in Verbindung mit dem Ereigniss bei SizeChanged.
-
es wäre auch denkbar
den SizeChanged-Delegaten beim MousDown zu installieren in abhängigkeit von ein paar Bedingungen (hat Form den Focus etc.).Dann wird der SizeChanged-Delegate bei einem MouseUp deinstalliert bzw. er sollte sich bei Aufruf der Event-Methode SizeChanged gleich mit selbst deinstallieren.
Somit könntest Du Beginn im Mousdown prüfen und setzen.
Das Ende der Aktion in der SizeChanged-Methode bestimmen.
Ich hoffe ich konnte mich klar und verständlich ausdrücken.
Die Delegaten kann man ja auch zur Laufzeit ändern!
mfg sclearscreen
P.S.: Habe ich noch nicht ausprobiert vielleicht liesse sich hier auch etwas mit einem MulticastDelegaten machen. Dazu muss aber glaube ich die Funktionssignatur gleich sein (von den benutzten Event-Methoden)
dann kann man anstatt normal sowas zu machen:this.btnSaveXmlFIle.Click += new System.EventHandler(this.btnSaveXmlFIle_Click);
dann sowas draus machen
this.btnEditXmlFIle.Click += new System.EventHandler(this.btnLoadXmlFIle_Click) + new System.EventHandler(this.btnSaveXmlFIle_Click);
Auf dein Problem umgemünzt Maus und Size des Fenster fast zur gleichen Zeit mit einem Abwasch abfragen! Von den Eventmethoden müssen sich aber laut einem Buch was ich gerade zur Hand habe die Signaturen gleichen!
-
Danke für die Antworten.
Nicht der Resize-Mechanismus ansich ist zu aufwändig, sondern einer meiner Implementierungen. Ein UserControl zeichnet mit GDI+ und updated sich, wenn es in der Größe geändert wird. Und das ist aufwendig....
Ich kann leider keinen Unterschied zwischen SizeChanged und Resize erkennen. Beide kommen immer hintereinander.
Und MouseDown/Up klappt nicht. Man bekommt kein Event, wenn man den Rahmen anklickt
Ich habe einen Workaround mit einem Timer. Ich starte im OnResize den Timer jedes mal neu. Im Tick-Eventhandler wird dann das Neuzeichnen mit GDI+ ausgeführt. Das klappt, ist aber sicherlich nicht das eleganteste...