Partie 7
Dessinons des poignées
Pour suivre cette partie, ils faut différencier le mode de dessin d'objet et le mode de sélection. Je ne vais pas dans le cadre de ce tuto créer un menu mais je vais ajouter deux raccourcis clavier
A je serais en mode
dessin d'objet
E je serais en mode
édition
Ajouter ceci à
OpenMainForm()
Code : Tout sélectionner
; Ajout de raccourcis clavier,/Add keyboard shorcut
AddKeyboardShortcut(#MainForm,#PB_Shortcut_A,0)
AddKeyboardShortcut(#MainForm,#PB_Shortcut_E,1)
BindEvent(#PB_Event_Menu,@ChangeModeDraw(),#MainForm)
Et on ajoute également cette procédure avant
OpenMainForm()
Code : Tout sélectionner
Procedure ChangeModeDraw()
Select EventMenu()
Case 0 ;Mode ajout d'objet/Add object mode
gDrawMode=#DrawBox
Case 1 ;Mode édition / Edit mode
gDrawMode=#Select
EndSelect
EndProcedure
Et pour le signaler à l'utilisateur je vais légèrement modifier mon code
EventCanvas()
Code : Tout sélectionner
Procedure EventCanvas()
Select EventType()
Case #PB_EventType_MouseMove
; Savoir ou l'on est ?
; Je mémorise les position de la souris sur le canvas
gMouseX=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseX)
gMouseY=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseY)
If Not gClicOn And gDrawMode=#Select
If WhereIsMouse():ProcedureReturn :EndIf
ElseIf gClicOn And gDrawMode<>#Select
ManageDraw()
EndIf
Case #PB_EventType_LeftButtonDown
If Not gClicOn
; On mémorise la position de la souris pour le calcul du déplacement
gOldMouse\X=gMouseX
gOldMouse\Y=gMouseY
EndIf
gClicOn=#True ; Signale que l'on clique sur le bt gauche
Case #PB_EventType_LeftButtonUp
If gNewDraw
Select gDrawMode
Case #DrawBox
AddNewBox()
EndSelect
EndIf
gNewDraw=#False
gClicOn=#False ;Le bt gauche est relaché
EndSelect
Select gDrawMode
Case #DrawBox
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
Case #Select
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
EndSelect
EndProcedure
Nous modifierons aussi
WhereIsMouse()
Code : Tout sélectionner
Procedure WhereIsMouse()
; On est sur un objet / we are under object
If ItsHoverObject()
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
On va maintenant attaquer le dessin des poignée, et pour leur gestion future on va ajouter une Enumeration
Code : Tout sélectionner
Enumeration Handles
#LU ;Gauche en haut /Left Up
#RU ;Droite en haut /Rigth Up
#MU ;Milieur en haut /midle Up
#LD ;Gauche en bas /Left Down
#RD ;Droite en bas /Rigth Down
#MD ;Milieur en bas /midle Down
#LM ; Gauche milieu /Left midle
#RM ; Droite milieu /Right midle
EndEnumeration
Ainsi que cette map
Code : Tout sélectionner
Global NewMap myHandle.Pos()
; On crée les map
Define N
For N=0 To #RM
AddMapElement(myHandle(),Str(N))
Next
Pour savoir quel objet est sélectionner on va ajouté cette variable
On modifie également
EventCanvas() (ben oui c'est ça la programmation on teste on réfléchi, on modifie)
Code : Tout sélectionner
Case #PB_EventType_LeftButtonDown
If Not gClicOn
; On mémorise la position de la souris pour le calcul du déplacement
gOldMouse\X=gMouseX
gOldMouse\Y=gMouseY
; Aucun objet sélectionner/No object selected
*gObjectSelected=-1
EndIf
gClicOn=#True ; Signale que l'on clique sur le bt gauche
Case #PB_EventType_LeftButtonUp
If gNewDraw
Select gDrawMode
Case #DrawBox
AddNewBox()
EndSelect
ElseIf gDrawMode=#Select And *gCurrentObjet<>-1
*gObjectSelected=*gCurrentObjet
DrawCanvas()
EndIf
gNewDraw=#False
gClicOn=#False ;Le bt gauche est relaché
EndSelect
On ajoute ces 2 variables
On ajoute maintenant cette procédure avant
DrawOblect()
Code : Tout sélectionner
Procedure DrawHandles()
Protected X,Y
If @myDraw()\myBox()<>*gObjectSelected
ProcedureReturn
EndIf
With myDraw()\myBox()
Y=\Y-(gHandleSize/2)
; Poignée/Handle LU
X=\X-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#LU))\X=X
myHandle(Str(#LU))\Y=Y
; Poignée/Handle RU
X=(\X+\W)-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#RU))\X=X
myHandle(Str(#RU))\Y=Y
; Poignée/Handle MU
X=(\X+(\W/2))-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#MU))\X=X
myHandle(Str(#MU))\Y=Y
Y=(\Y+\H)-(gHandleSize/2)
; Poignée/Handle LD
X=\X-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#LD))\X=X
myHandle(Str(#LD))\Y=Y
; Poignée/Handle RD
X=(\X+\W)-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#RD))\X=X
myHandle(Str(#RD))\Y=Y
; Poignée/Handle MD
X=(\X+(\W/2))-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#MD))\X=X
myHandle(Str(#MD))\Y=Y
Y=(\Y+(\H/2))-(gHandleSize/2)
X=\X-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#LM))\X=X
myHandle(Str(#LM))\Y=Y
X=(\X+\W)-(gHandleSize/2)
Box(X,Y,gHandleSize,gHandleSize,gHandleColor)
myHandle(Str(#RM))\X=X
myHandle(Str(#RM))\Y=Y
EndWith
EndProcedure
Et on modifie
DrawOblect()
Code : Tout sélectionner
Procedure DrawOblect()
ForEach myDraw()
With myDraw()
ForEach \myBox()
DrawBox()
DrawHandles()
Next
EndWith
Next
EndProcedure
Voila testez, dessinez des rectangle tapez
E pour passer en mode édition et cliquer sur un rectangle