/* liikuva.hh */ // AUTHOR: Vesa Lappalainen 9.11.1996 // OVERVIEW // ======== // Luokka, joka perimällä ikkunan kanssa toiseksi luokaksi, saadaan // ikkunan muutettua hiirellä raahattavaksi luokaksi. // cDelayMove joko peritään luokaan tai käytetään oliona. // Metodit: // ks. alla, aika kuvaavia. // Erityistä: // Moniperi tämä ikkunan kaveriksi. Lisämäärittele tarvittaessa // metrodit: // virtual void Drop(TPoint pt) - kun vasen nappi päästetään ylös // virtual void Arrive(TPoint pt) - kun saavutaan viivästetyn siirron maaliin // // Jos et halua laittaa projektiin liikkuva.cpp:ta, niin laita makro // LIIKKUVATBL johonkin kohti koodia #ifndef LIIKKUVA_H #define LIIKKUVA_H #include #include "owl/delaymov.h" //------------------------------------------------------------------------------ class cLiikkuva : virtual public TEventHandler, public cDelayMove { // Minkä tahansa TWindow-ikkunan kanssa perittävä luokka TWindow *Wnd; // joka tekee ikkunasta hiirellä liikutettavan bool MouseDown; TPoint DragPoint; TPoint originalpt; int AutoReturnTime; public: cLiikkuva(TWindow *wnd) : Wnd(wnd), cDelayMove(wnd), MouseDown(false), originalpt(wnd->Attr.X,wnd->Attr.Y) { AutoReturnTime = -1; } virtual ~cLiikkuva() { } virtual TPoint pt() const { return TPoint(Wnd->Attr.X,Wnd->Attr.Y);} virtual void AddPos(TPoint dpt) { Move(pt()+dpt); } virtual void RestorePosDelay(int ms) { Start(ms,pt(),originalpt); } virtual void SetOriginalPt(TPoint pt){ originalpt = pt; Move(pt); } virtual void SetOriginalPt(int x, int y){ SetOriginalPt(TPoint(x,y)); } virtual void SetAutoReturn(int ms) { AutoReturnTime = ms; } virtual void EvLButtonDown(uint modKeys, TPoint& point) { if ( MouseDown ) return; Stop(); Wnd->SetCapture(); MouseDown = true; DragPoint = point; } virtual void EvMouseMove(uint modKeys, TPoint& point) { if ( MouseDown ) AddPos(point - DragPoint); } virtual void EvLButtonUp(uint modKeys, TPoint& point) { if ( !MouseDown ) return; Wnd->ReleaseCapture(); MouseDown = false; Drop(pt()); } virtual void Drop(TPoint pt) { // Tämä on tarkoitus kirjoittaa uudelleen if ( AutoReturnTime >= 0 ) // perityssä luokassa RestorePosDelay(AutoReturnTime); } virtual void Arrive(TPoint pt) {} // Tämänkin voi määritellä uudestaan virtual void EvTimer(uint id) { if ( Move() == 0 ) Arrive(pt()); } DECLARE_RESPONSE_TABLE(cLiikkuva); }; #define LIIKKUVATBL \ DEFINE_RESPONSE_TABLE(cLiikkuva) \ EV_WM_LBUTTONDOWN, \ EV_WM_MOUSEMOVE, \ EV_WM_LBUTTONUP, \ EV_WM_TIMER, \ END_RESPONSE_TABLE; #endif