Code : Tout sélectionner
#MainForm=0
#MainCanvas=0
Structure pos
X.i
Y.i
W.i
H.i
EndStructure
Structure selection Extends pos
*idObjet
EndStructure
Structure Object
myPos.pos
BgColor.i
EndStructure
; La liste des objet
Global NewList myObject.Object()
; La liste qui va retenir les sélections
Global NewMap mySelection.selection()
; L'objet survolé au début aucun d'ou -1
Global *HoverObject=-1
; La liste des ancienne postion des objet
Procedure MakeObject()
; Ici je crée quelque objets
Protected W=50
Protected X=W
With myObject()
For N=1 To 5
AddElement(myObject())
\BgColor=RGB(Random(255,0),Random(255,0),Random(255,0))
\myPos\Y=W
\myPos\X=X
\myPos\W=W
\myPos\H=W
X+60
Next
EndWith
EndProcedure
Procedure Exit()
End
EndProcedure
Procedure WhereIsMouse(X,Y)
With myObject()\myPos
; Parcours tous les objets et regarde si sur un
ForEach myObject()
If (X>=\X And X<=(\X+\W)) And (Y>=\Y And Y<=(\Y+\H))
*HoverObject=@myObject()
If FindMapElement(mySelection(),Str(@myObject()))<>0
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Arrows)
Else
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
EndIf
ProcedureReturn #True ; On est sur un objet
EndIf
Next
ProcedureReturn #False ; On est PAS sur un objet
EndWith
EndProcedure
Procedure Draw()
StartDrawing(CanvasOutput(#MainCanvas))
With myObject()
DrawingMode(#PB_2DDrawing_Default)
Box(0,0,GadgetWidth(#MainCanvas),GadgetHeight(#MainCanvas),$FFFFFF)
ForEach myObject()
DrawingMode(#PB_2DDrawing_Default)
Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,\BgColor)
; Reagarde si l'ogjet est sélectionné
If FindMapElement(mySelection(),Str(@myObject()))<>0
; Si oui j'affiche une cadre noir
DrawingMode(#PB_2DDrawing_Outlined)
Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,$000000)
Box(\myPos\X+1,\myPos\Y+1,\myPos\W-2,\myPos\H-2,$000000)
Box(\myPos\X+2,\myPos\Y+2,\myPos\W-4,\myPos\H-4,$000000)
EndIf
Next
EndWith
StopDrawing()
EndProcedure
Procedure MoveObject(DepX,DepY)
ForEach mySelection()
ChangeCurrentElement(myObject(),mySelection()\idObjet)
With myObject()\myPos
\X=mySelection()\X+DepX
\Y=mySelection()\Y+DepY
EndWith
Next
Draw()
EndProcedure
Procedure EventCanvas()
Static gMouseX,gMouseY,OldMouseX,OldMouseY,ClicOn.b=#False
Protected DepX,DepY
Select EventType()
Case #PB_EventType_MouseMove
gMouseX=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseX)
gMouseY=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseY)
; Si pas de clic gauche enfoncé
*HoverObject=-1 ;Pas sur un objet
If Not ClicOn
If Not WhereIsMouse(gMouseX,gMouseY)
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
EndIf
Else
; Si il y à des objets sélectionés
If MapSize(mySelection())>0
DepX=gMouseX-OldMouseX
DepY=gMouseY-OldMouseY
MoveObject(DepX,DepY)
EndIf
EndIf
Case #PB_EventType_LeftClick
;Si sur un objet
If *HoverObject<>-1
; Regarde si la touche ALT n'est pas enfoncée
If Not GetGadgetAttribute(#MainCanvas,#PB_Canvas_Modifiers)=#PB_Canvas_Alt
; Je supprime les sélections
ClearMap(mySelection())
EndIf
;j'atouche une sélection
AddMapElement(mySelection(),Str(*HoverObject))
mySelection()\idObjet=*HoverObject
; Pointe sur la liste de l'objet
ChangeCurrentElement(myObject(),*HoverObject)
mySelection()\X=myObject()\myPos\X
mySelection()\Y=myObject()\myPos\Y
Else ; Clique en dehors des objets je déselectionne tout
; Je supprime les sélections
ClearMap(mySelection())
EndIf
Draw()
Case #PB_EventType_LeftButtonDown
; Si le bt n'est pas enfoncé je mémorise la poisiton de la souris
If Not ClicOn
OldMouseX=gMouseX
OldMouseY=gMouseY
EndIf
ClicOn=#True
Case #PB_EventType_LeftButtonUp
ClicOn=#False
EndSelect
EndProcedure
Procedure OpenMainForm()
flag=#PB_Window_SystemMenu|#PB_Window_Maximize
OpenWindow(#MainForm,0,0,800,600,"teste",flag)
CanvasGadget(#MainCanvas,0,0,WindowWidth(#MainForm),WindowHeight(#MainForm),#PB_Canvas_Keyboard)
; Crée quelkques objet
MakeObject()
; Dessine les objets
Draw()
BindGadgetEvent(#MainCanvas,@EventCanvas())
BindEvent(#PB_Event_CloseWindow,@Exit())
EndProcedure
OpenMainForm()
Repeat:WaitWindowEvent():ForEver