/* delaymov.h */ // AUTHOR: Vesa Lappalainen 9.11.1996 // OVERVIEW // ======== // Luokka, jolla voidaan tehdä viivästetty siirto mille tahansa // TWindow-luokasta peritylle ikkunalle. // cDelayMove joko peritään luokaan tai käytetään oliona. // Aikoja ei ole korjattu systeemikellosta! // Metodit: // cDelayMove(TWindow *wnd) - konstruktori, jolel kerrotaan mitä ikkunaa // siirretään // ~cDelayMove() - lopettaa mahdolisesti käynnissä ol.siirron // void Start(int ms, TPoint startpt, TPoint endpt) // - aloitetaan siirto pisteestä startpt -> endpt // ja siirron kestoksi ms (millisekunteina) // // void Stop() - lopettaa mahdollisen käynnissä oleva siirron // void Move(TPoint pt) - siirtää ikkunan paikkaan pt, ei vaikuta // siirron aikana // int Move() - suorittaa siirron seuraavn askeleen. Yleensä // tätä kutsutaan WM_TIMER (toistaiseksi aina // 1) tapahtumasta. Jos on jo saavuttu maaliin // palautetaan -1, Jos juuri saavuttiin maaliin // palautetaan 0 ja muuten 1. Kun on saavuttu // maaliin, poistetaan Timer automaattisesti #ifndef DELAYMOVE_H #define DELAYMOVE_H #define DMS 50 // Mikä on pienen käytettävissä oleva aikavali ms //------------------------------------------------------------------------------ class cDelayMove { // Viivästetty siirto, mikä siirtää minkä tahansa TWindow TWindow *Wnd; // -ikkunan annetun viiveen aikana paikasta toiseen int n; // Ikkunassa pitää käsitellä viesti WM_TIMER -> Move() double dx,dy,x,y; TPoint finalpt; public: cDelayMove(TWindow *wnd) : Wnd(wnd), n(0) { } virtual void Start(int ms, TPoint startpt, TPoint endpt) { finalpt = endpt; n = ms/DMS; if ( n < 1 ) n = 1; TPoint dp = (endpt - startpt); dx = 1.0*dp.x / n; dy = 1.0*dp.y / n; x = startpt.x; y = startpt.y; Wnd->SetTimer(1,DMS); } virtual ~cDelayMove() { Stop(); } virtual void Stop() { if ( Wnd && n > 0 ) Wnd->KillTimer(1); } virtual void Move(TPoint pt) { Wnd->SetWindowPos(NULL,pt.x,pt.y,0,0,SWP_NOSIZE | SWP_NOZORDER); } virtual int Move() { if ( n <= 0 ) return -1; if ( --n == 0 ) { Stop(); Move(finalpt); return 0; } x += dx; y += dy; Move(TPoint(int(x),int(y))); return 1; } }; #endif