{Dear Gayle, you make a very good job with SWAG. Let it grow...it's wonderful! As a little contribution a small program for mouse-support is added. If interested in more, I have a lot of graphic stuff in my bag. Happy christmas and a bug-free new 1996! Shortdescription: Positioning under mouse-control needs calculation of relative mouse-movement. Here's a small object (MouseSnap) that does this. The function SnapMove returns True if mouse-position exceeds the snap value. the var parameter holds the values for DeltaX and DeltaY. With a snap value of 1 normal delta-movement is returned. Dec. 11, 1995, Udo Juerss, 57078 Siegen, Germany, CompuServe [101364,526]} uses Graph; {---------------------------------------------------------------------------} type Point = record X : Integer; Y : Integer; end; TRect = object {Rechteckobjekt} A : Point; {Startpunkt (oben links) X- und Y-Koordinate} B : Point; {Endpunkt (unten rechts) X- und Y-Koordinate} procedure Init(X1,Y1,X2,Y2:Integer); {Koordinatenzuweisung} procedure Move(Dx,Dy:Integer); {Verschieben} procedure Draw(Color:Byte); end; TMouseSnap = object Snap : Integer; {Fangwert f|r X/Y-Position} DeltaX : Integer; {Differenz von aktueller zur letzen X-Position} DeltaY : Integer; {Differenz von aktueller zur letzen Y-Position} LastX : Integer; {Restbetrag von letzter X-Berechnung} LastY : Integer; {Restbetrag von letzter Y-Berechnung} Position : Point; {Aktuelle Mausposition} OldPosition : Point; {Letzte Mausposition} procedure Init(ASnap:Integer); function SnapMove(var Delta:Point):Boolean; end; {---------------------------------------------------------------------------} var Gd,Gm : Integer; P : Point; Rect : TRect; MouseSnap : TMouseSnap; IsSnap : Boolean; Snap : Integer; {---------------------------------------------------------------------------} procedure CursorOn; assembler; asm mov ax,1 int 33h end; {---------------------------------------------------------------------------} procedure CursorOff; assembler; asm mov ax,2 int 33h end; {---------------------------------------------------------------------------} function LeftButton:Boolean; assembler; asm mov ax,3 int 33h mov al,bl and al,1 end; {---------------------------------------------------------------------------} function RightButton:Boolean; assembler; asm mov ax,3 int 33h mov al,bl and al,2 end; {---------------------------------------------------------------------------} procedure GetMousePosition(var P:Point); assembler; asm les di,P mov ax,3 int 33h mov ax,cx stosw mov ax,dx stosw end; {---------------------------------------------------------------------------} procedure TRect.Init(X1,Y1,X2,Y2:Integer); begin A.X:=X1; A.Y:=Y1; B.X:=X2; B.Y:=Y2; end; {---------------------------------------------------------------------------} procedure TRect.Move(Dx,Dy:Integer); begin A.X:=A.X + Dx; A.Y:=A.Y + Dy; B.X:=B.X + Dx; B.Y:=B.Y + Dy; end; {---------------------------------------------------------------------------} procedure TRect.Draw(Color:Byte); begin SetColor(Color); CursorOff; Line(A.X,A.Y,B.X,A.Y); Line(A.X,B.Y,B.X,B.Y); Line(A.X,A.Y,A.X,B.Y); Line(B.X,A.Y,B.X,B.Y); CursorOn; end; {---------------------------------------------------------------------------} procedure TMouseSnap.Init(ASnap:Integer); {Initialisierung TMouseSnap} begin Snap:=ASnap; {Parameter f|r X/Y-Fangraster |bernehmen} if Snap <= 0 then Snap:=1; {Division durch Null verhindern} DeltaX:=0; {Variable initialisieren} DeltaY:=0; {Variable initialisieren} LastX:=0; {Variable initialisieren} LastY:=0; {Variable initialisieren} GetMousePosition(Position); {Mausposition lesen, damit Position definieren} OldPosition:=Position; {OldPosition definieren} end; {---------------------------------------------------------------------------} function TMouseSnap.SnapMove(var Delta:Point):Boolean; begin SnapMove:=False; {Funtionsergebnis voreinstellen} GetMousePosition(Position); {Aktuelle Mausposition holen} if (Position.X <> OldPosition.X) or (Position.Y <> OldPosition.Y) then begin {Wenn aktuelle Position ungleich der vorherigen, dann} DeltaX:=Position.X - OldPosition.X; {Delta der X-Position berechnen} DeltaY:=Position.Y - OldPosition.Y; {Delta der Y-Position berechnen} Inc(DeltaX,LastX);{Delta um den Restbetrag der letzen Berechnung erhvhen} Inc(DeltaY,LastY);{Delta um den Restbetrag der letzen Berechnung erhvhen} LastX:=DeltaX mod Snap; {Neuen Restbetrag in LastX sichern} LastY:=DeltaY mod Snap; {Neuen Restbetrag in LastY sichern} DeltaX:=DeltaX div Snap; {DeltaX durch Fangwert teilen} DeltaY:=DeltaY div Snap; {DeltaY durch Fangwert teilen} DeltaX:=DeltaX * Snap; {DeltaX = 0/Fangwert/Vielfaches des Fangwerts} DeltaY:=DeltaY * Snap; {DeltaY = 0/Fangwert/Vielfaches des Fangwerts} if (Word(DeltaX) >= Snap) or (Word(DeltaY) >= Snap) then begin {Wenn DeltaX oder DeltaY gleich oder grv_er als Fangwert ist, dann} Delta.X:=DeltaX; {R|ckgabewert X von Punkt setzen} Delta.Y:=DeltaY; {R|ckgabewert Y von Punkt setzen} SnapMove:=True; {Funktionsergebnis setzen} end; end; OldPosition:=Position; {Aktuelle Position f|r ndchsten Vergleich sichern} end; {---------------------------------------------------------------------------} begin Gd:=Detect; InitGraph(Gd,Gm,'c:\tp\system'); {Change to your BGI driver path} CursorOn; Rect.Init(0,0,50,50); IsSnap:=True; Snap:=25; {Change this value for other snap} MouseSnap.Init(Snap); Rect.Draw(White); repeat if LeftButton then {Press LeftButton to toggle snap} begin repeat until not LeftButton; IsSnap:=IsSnap xor True; if IsSnap then MouseSnap.Init(Snap) else MouseSnap.Init(1); end; if MouseSnap.SnapMove(P) then begin Rect.Draw(Black); Rect.Move(P.X,P.Y); Rect.Draw(White); end; until RightButton; {Press RightButton to quit program} CloseGraph; end.