2009-05-05 11 views
7

Ich verwende das OnIdle-Ereignis für einige einfache Animationen, und es funktioniert alles in Ordnung. Wenn der Benutzer jedoch beginnt, das Fenster zu verschieben oder seine Größe zu ändern, wird das OnIdle-Ereignis beendet, bis der Verschiebe-/Größenänderungsvorgang abgeschlossen ist.Delphi: Erkennen von Anfang und Ende des Fensters bewegen

Ich muss erkennen, wenn dies passiert, so dass ich alle Animationen anhalten kann. Aber wie erkenne ich die Bewegung des Fensters?

+5

Mit OnIdle ist nicht wirklich eine gute Idee, da es zu 100% CPU-Last auf dem aktiven Kern verursachen. Verwenden Sie stattdessen ein Timer-Ereignis, das zwei Vorteile hat: Es wird auch in der sekundären Nachrichtenschleife ausgelöst, so dass die Animation während der Verschiebung/Größenänderung fortgesetzt wird (was beim vollständigen Ziehen des Fensters geschehen sollte); und Sie können eine vernünftige Anzahl von Animationsschritten pro Sekunde einstellen, unabhängig von der Systemgeschwindigkeit. – mghie

+0

Timer vs Leerlauf ist ein interessantes Thema. Beide haben Vor- und Nachteile, aber für meine kleinen dekorativen Animationen wird onidle gut funktionieren. – Vegar

+0

Solche "kleinen dekorativen Animationen", wenn $ Benutzer sie nicht deaktivieren kann, können eine Menge Akkulaufzeit auf einem Laptop kosten. Außerdem stehlen Sie aktiv CPU-Zyklen von anderen Anwendungen. Probieren Sie es selbst aus, in Wirklichkeit hat OnIdle nur Nachteile. – mghie

Antwort

8

ich mit mghie Kommentar gehen würde: einen Timer für die Animation verwenden, und aktivieren/deaktivieren Sie es mit Meldungshandler.

In Ihrem Fall sollten Sie die folgende Meldung Handler hinzuzufügen:

//fired when starting/ending a "move" or "size" window 
procedure WMEnterSizeMove(var Message: TMessage) ; message WM_ENTERSIZEMOVE; 
procedure WMExitSizeMove(var Message: TMessage) ; message WM_EXITSIZEMOVE; 


    procedure TForm.WMEnterSizeMove(var msg: TMessage); 
    begin 
    AnimationTimer.Enabled := false; 
    inherited; 
    end; 

    procedure TForm.WMExitSizeMove(var msg: TMessage); 
    begin 
    AnimationTimer.Enabled := true; 
    inherited; 
    end; 
+1

Ich werde diese beiden Nachrichten später am Tag auschecken. Ich wusste vorher nichts von ihnen. Vielen Dank. – Vegar

+0

@LeGEC: Aber warum deaktivieren Sie die Animation überhaupt? Es beeinflusst nicht die Verschiebung/Größenanpassung und stimmt mit dem vollständigen Ziehen des Fensters überein, wenn es aktiviert ist. – mghie

4

Ich habe das nicht versucht, aber ich würde sagen, Sie könnten wahrscheinlich WM_WINDOWPOSCHANGING verwenden, um zu sagen, wenn das Fenster verschoben wird. http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx

Delphi-Code wäre:

TSomeForm = class(TForm) 
protected 
    ... 
    procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING; 
    ... 
end; 
Verwandte Themen