2009-05-05 13 views
7

Bazı basit animasyonlar için OnIdle olayını kullanıyorum ve her şey yolunda. Sorun, kullanıcı pencereyi hareket ettirmeye veya yeniden boyutlandırmaya başladığında, OnIdle olayı, taşıma/yeniden boyutlandırma işlemi tamamlanana kadar çalışmayı durdurur.Delphi: Pencerenin başlangıcını ve sonunu sapta hareket edin

Bunun ne zaman olduğunu algılamalıyım, böylece tüm animasyonları duraklatabilirim. Ama pencerenin hareketini nasıl tespit edebilirim?

+5

ONIDLE kullanarak, gerçekten iyi bir fikir değildir. Bunun yerine iki avantajı olan bir zamanlayıcı olayı kullanın: İkincil ileti döngüsünde de yanacaktır, böylece animasyon hareket/yeniden boyutlandırma sırasında devam eder (tam pencere sürükleme etkin olduğunda gerekir); ve sistem hızından bağımsız olarak saniyede makul sayıda animasyon adımı ayarlayabileceksiniz. – mghie

+0

Timer vs idle ilginç bir konu. Her ikisinin de artıları ve eksileri var, ama benim küçük dekoratif animasyonlar için onidle gayet iyi. – Vegar

+0

Böyle bir "küçük dekoratif animasyonlar", eğer kullanıcı bunları devre dışı bırakamazsa, bir dizüstü bilgisayarda çok fazla pil harcanabilir. Ayrıca, diğer uygulamalardan cpu döngülerini aktif olarak çalıyorsunuz. Kendiniz için deneyin, gerçekte OnIdle sadece eksileri vardır. – mghie

cevap

8

Ben mghie yorum ile gitmek istiyorum: animasyon için bir zamanlayıcı kullanın ve etkinleştirmek/ileti işleyicileri ile devre dışı bırakın. Senin durumunda

, aşağıdaki ileti işleyicileri eklemek isteyebilirsiniz: aktif çekirdek üzerinde% 100 cpu yükü neden olacağından

//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

Bu iki mesajı güne sonra kontrol edeceğim. Onları daha önce bilmiyordum. Teşekkürler. – Vegar

+0

@LeGEC: Ama neden animasyonu hiç devre dışı bırakıyorsunuz? Hareketli/boyutlandırmayı etkilemez ve etkinse tam pencereyi sürükleme ile eşleşir. – mghie

4

Bunu denemedim, ancak pencerenin ne zaman taşındığını söylemek için WM_WINDOWPOSCHANGING değerini kullanabileceğinizi söyleyebilirim. http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx

Delphi kodu olacaktır:

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