public oToolbarTest oToolbarTest = createobject("clsToolbarTest") oToolbarTest.Show() DECLARE INTEGER ClipCursor IN user32.dll INTEGER * standard toolbar define class clsToolbarTest as Toolbar ShowWindow = 1 && in top level form add object cntMain as Container with height = 100, width = 200 function Init() * add object that manages the move This.cntMain.AddObject( "oMover", "clsMover",THIS,_SCREEN) This.cntMain.oMover.Move(20,20) * register this toolbar as the object to move This.cntMain.oMover.Visible = .T. ENDFUNC enddefine * custom label class that captures move request and transfers to linked object define class clsMover as Label Caption = "Click and drag me!" BackStyle = 0 AutoSize = .T. * holds reference to object being moved oLinkedObject = .Null. oForm = .NULL. oRect = .NULL. * remember mouse position at start of drag OriginalXpos = 0 OriginalYpos = 0 * remember original object being moved's position OriginalLeft = 0 OriginalTop = 0 FUNCTION Init(loLinked,loForm) THIS.oLinkedObject = loLinked THIS.oForm = loForm THIS.oRect = CREATEOBJECT('RECT') ENDFUNC * clear linked object function Destroy() This.oLinkedObject = .NULL. THIS.oForm = .NULL. THIS.oRect = .NULL. endfunc function MouseDown(nButton, nShift, nXCoord, nYCoord) if nButton = 1 with This .OriginalXPos = nXCoord .OriginalYPos = nYCoord .OriginalLeft = .oLinkedObject.Left .OriginalTop = .oLinkedObject.Top .oRect.mLeft = .oForm.Left + nXCoord + 4 .oRect.mTop = .oForm.Top + nYCoord + 19 .oRect.mRigth = nXCoord + .oForm.Left + .oForm.Width - .oLinkedObject.Width .oRect.mBottom = nYCoord + .oForm.Top + .oForm.Height - .oLinkedObject.Height ClipCursor(.oRect.Address) endwith endif endfunc function MouseMove(nButton, nShift, nXCoord, nYCoord) IF nButton = 1 WITH THIS .OriginalLeft = .OriginalLeft + nXCoord - .OriginalXPos .OriginalTop = .OriginalTop + nYCoord - .OriginalYPos .oLinkedObject.Move(.OriginalLeft,.OriginalTop) .oForm.Draw() ENDWITH ENDIF ENDFUNC FUNCTION MouseUp(nButton, nShift, nXCoord, nYCoord) IF nButton = 1 ClipCursor(0) ENDIF ENDFUNC ENDDEFINE DEFINE CLASS RECT AS Exception Address = 0 SizeOf = 16 PROTECTED Embedded Embedded = .F. mLeft = 0 mTop = 0 mRigth = 0 mBottom = 0 PROCEDURE Init(lnAddress) IF PCOUNT() = 0 THIS.Address = AllocMem(THIS.SizeOf) IF THIS.Address = 0 ERROR(43) RETURN .F. ENDIF ELSE ASSERT TYPE('lnAddress') = 'N' AND lnAddress != 0 MESSAGE 'Address of structure must be specified!' THIS.Address = lnAddress THIS.Embedded = .T. ENDIF ENDFUNC PROCEDURE Destroy IF !THIS.Embedded FreeMem(THIS.Address) ENDIF ENDPROC PROCEDURE mLeft_Access RETURN ReadInt(THIS.Address) ENDPROC PROCEDURE mLeft_Assign(lnNewVal) WriteInt(THIS.Address,lnNewVal) ENDPROC PROCEDURE mTop_Access RETURN ReadInt(THIS.Address+4) ENDPROC PROCEDURE mTop_Assign(lnNewVal) WriteInt(THIS.Address+4,lnNewVal) ENDPROC PROCEDURE mRigth_Access RETURN ReadInt(THIS.Address+8) ENDPROC PROCEDURE mRigth_Assign(lnNewVal) WriteInt(THIS.Address+8,lnNewVal) ENDPROC PROCEDURE mBottom_Access RETURN ReadInt(THIS.Address+12) ENDPROC PROCEDURE mBottom_Assign(lnNewVal) WriteInt(THIS.Address+12,lnNewVal) ENDPROC ENDDEFINERegards