Page 1 sur 1

[Résolu] Poignées de redimentionnement

Publié : jeu. 22/nov./2012 22:07
par Micoute
Je souhaiterais faire un logiciel où on pourrait changer la taille des gadgets en cliquant sur des poignées comme par exemple dans PureForm de Gnozal, est-ce que quelqu'un pourrait me donner un petit coup de pouce pour pouvoir me lancer, je l'en remercierais grandement !

Re: Poignées de redimentionnement

Publié : ven. 23/nov./2012 0:22
par Backup
http://www.purebasic.fr/french/viewtopi ... 9e#p107245


Code : Tout sélectionner

; Codé par Patrick88 modifié par ArticFox pour y inserer un ScrollArea

Enumeration
	#FEN_MAIN
EndEnumeration

Enumeration 1
	#GDT_PgnG
	#GDT_PgnD
	#GDT_PgnH
	#GDT_PgnB
	#GadgetArea ;<==== Add by KCC
	#GDT_USER_GADGET
	#GDT_DEMO1
	#GDT_DEMO2
	#GDT_DEMO3
	#GDT_DEMO4
	#GDT_LAST_USER_GADGET
EndEnumeration

#GDT_PoigneeTaille = 10
#GDT_PoigneeCouleur = $0000ff
#GDT_PoigneeCache = 1
#GDT_PoigneeMontre = 0

Global mx.w, my.w, deltax.w , deltay.w , gdt_x.w,gdt_y.w, gdt_id.l, gdt_pgn_id.l
Global Pas_Grille.b = 10
Global mpgn.POINT
Global Dim DemoRect.RECT(#PB_Compiler_EnumerationValue)

;...Load cursors
cursorNS = LoadCursor_(0, #IDC_SIZENS)
cursorWE = LoadCursor_(0, #IDC_SIZEWE)
cursorSIZE = LoadCursor_(0, #IDC_SIZEALL)   

Procedure Poignee_cache(etat.b,gdt_id.l)
	Protected x, y
	
	HideGadget(#GDT_PgnG,etat)
	HideGadget(#GDT_PgnD,etat)
	HideGadget(#GDT_PgnH,etat)
	HideGadget(#GDT_PgnB,etat)
	
	If gdt_id > 0
		ResizeGadget(#GDT_PgnG,GadgetX(gdt_id)-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2 + y, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#GDT_PgnD,GadgetX(gdt_id)+GadgetWidth(gdt_id)-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2 + y, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#GDT_PgnH,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2 + y, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#GDT_PgnB,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)+GadgetHeight(gdt_id)-#GDT_PoigneeTaille/2 + y, #PB_Ignore, #PB_Ignore)
		
		GetWindowRect_(GadgetID(#GDT_PgnG), @DemoRect(#GDT_PgnG))
		GetWindowRect_(GadgetID(#GDT_PgnD), @DemoRect(#GDT_PgnD))
		GetWindowRect_(GadgetID(#GDT_PgnH), @DemoRect(#GDT_PgnH))
		GetWindowRect_(GadgetID(#GDT_PgnB), @DemoRect(#GDT_PgnB))
	EndIf
EndProcedure


If OpenWindow(#FEN_MAIN, 0, 0, 500, 500, "Visual PB Zoub", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	ScrollAreaGadget(#GadgetArea, 0, 0, WindowWidth(#FEN_MAIN), WindowHeight(#FEN_MAIN), 10000, 10000)  ;<==== Add by KCC
	OpenGadgetList(#GadgetArea) ;<==== Add by KCC
	TextGadget(#GDT_PgnG,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnG,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
	TextGadget(#GDT_PgnD,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnD,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
	TextGadget(#GDT_PgnH,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnH,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
	TextGadget(#GDT_PgnB,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnB,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
	TextGadget(#GDT_DEMO2,5,4,80,16,"Déplace moi")
	StringGadget(#GDT_DEMO3,90,2,100,20,"Déplace moi")
	CloseGadgetList()
	ListIconGadget(#GDT_DEMO4,150,10,100,100,"Déplace moi",100)
	
	GetWindowRect_(GadgetID(#GDT_DEMO2), @DemoRect(#GDT_DEMO2))
	GetWindowRect_(GadgetID(#GDT_DEMO3), @DemoRect(#GDT_DEMO3))
	GetWindowRect_(GadgetID(#GDT_DEMO4), @DemoRect(#GDT_DEMO4))
	GetWindowRect_(GadgetID(#GDT_PgnG), @DemoRect(#GDT_PgnG))
	GetWindowRect_(GadgetID(#GDT_PgnD), @DemoRect(#GDT_PgnD))
	GetWindowRect_(GadgetID(#GDT_PgnH), @DemoRect(#GDT_PgnH))
	GetWindowRect_(GadgetID(#GDT_PgnB), @DemoRect(#GDT_PgnB))
	
	
	deltax = -2: deltay = -2
	
	Repeat
		event = WaitWindowEvent()
		;
		Select event
			Case #WM_LBUTTONUP
			gdt_id = 0
			Poignee_cache(#GDT_PoigneeMontre,0)
			deltax = -2: deltay = -2
			
			Case #WM_MOUSEMOVE
			mx = WindowMouseX(#FEN_MAIN) ; coordonnées curseur souris
			my = WindowMouseY(#FEN_MAIN)
			
			If GetAsyncKeyState_(#VK_LBUTTON)           
				If gdt_id > #GDT_USER_GADGET And gdt_id < #GDT_LAST_USER_GADGET And gdt_id = gdt_pgn_id
					Poignee_cache(#GDT_PoigneeCache,gdt_id)
					
					; sauvegarde la distance coin haut gauche gadget aux coordonnées curseur souris
					If deltax < -1 And deltay < -1
						deltax = mx-GadgetX(gdt_id)
						deltay = my-GadgetY(gdt_id)
					EndIf
					
					gdt_x = mx-deltax
					gdt_y = my-deltay
					
					If Pas_Grille>0
						gdt_x = (gdt_x / Pas_Grille)*Pas_Grille
						gdt_y = (gdt_y / Pas_Grille)*Pas_Grille
					EndIf
					ResizeGadget(gdt_id, gdt_x, gdt_y, #PB_Ignore, #PB_Ignore)
					
					Else
					
					If Pas_Grille>0
						mx = (mx / Pas_Grille)*Pas_Grille
						my = (my / Pas_Grille)*Pas_Grille
					EndIf
					
					If gdt_pgn_id = #GDT_PgnG
						ResizeGadget(#GDT_PgnG,mx,#PB_Ignore, #PB_Ignore, #PB_Ignore)
						largeur_gadget.w = GadgetWidth(gdt_id)+(GadgetX(gdt_id)-mx)
						ResizeGadget(gdt_id, mx, #PB_Ignore, largeur_gadget, #PB_Ignore)
						Else
						If gdt_pgn_id = #GDT_PgnD
							ResizeGadget(#GDT_PgnD,mx-#GDT_PoigneeTaille,#PB_Ignore, #PB_Ignore, #PB_Ignore)
							largeur_gadget.w = mx-GadgetX(gdt_id)
							ResizeGadget(gdt_id, #PB_Ignore, #PB_Ignore, largeur_gadget, #PB_Ignore)
							Else
							If gdt_pgn_id = #GDT_PgnH
								ResizeGadget(#GDT_PgnH,#PB_Ignore,my, #PB_Ignore, #PB_Ignore)
								hauteur_gadget.w = GadgetHeight(gdt_id)+(GadgetY(gdt_id)-GadgetY(#GDT_PgnH))
								ResizeGadget(gdt_id, #PB_Ignore, GadgetY(#GDT_PgnH), #PB_Ignore, hauteur_gadget)
								Else
								If gdt_pgn_id = #GDT_PgnB
									ResizeGadget(#GDT_PgnB,#PB_Ignore,my-#GDT_PoigneeTaille, #PB_Ignore, #PB_Ignore)
									hauteur_gadget.w = my-GadgetY(gdt_id)
									ResizeGadget(gdt_id, #PB_Ignore, #PB_Ignore, #PB_Ignore, hauteur_gadget)
								EndIf         
							EndIf
						EndIf
					EndIf
				EndIf           
				
				If gdt_id > #GDT_USER_GADGET And gdt_id < #GDT_LAST_USER_GADGET
					
					GetWindowRect_(GadgetID(#GDT_DEMO2), @DemoRect(#GDT_DEMO2))
					GetWindowRect_(GadgetID(#GDT_DEMO3), @DemoRect(#GDT_DEMO3))
					GetWindowRect_(GadgetID(#GDT_DEMO4), @DemoRect(#GDT_DEMO4))
				EndIf
				
				Else
				GetCursorPos_(@mpgn)
				gdt_pgn_id = -1
				
				If PtInRect_(@DemoRect(#GDT_DEMO4), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO4 : EndIf
				If PtInRect_(@DemoRect(#GDT_DEMO1), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO1 : EndIf
				If PtInRect_(@DemoRect(#GDT_DEMO2), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO2 : EndIf
				If PtInRect_(@DemoRect(#GDT_DEMO3), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO3 : EndIf
				If PtInRect_(@DemoRect(#GDT_PgnG), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnG : EndIf
				If PtInRect_(@DemoRect(#GDT_PgnD), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnD : EndIf
				If PtInRect_(@DemoRect(#GDT_PgnH), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnH : EndIf
				If PtInRect_(@DemoRect(#GDT_PgnB), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnB : EndIf
				
				Select gdt_pgn_id
					Case #GDT_DEMO1 To #GDT_DEMO4
					gdt_id = gdt_pgn_id
					Poignee_cache(#GDT_PoigneeMontre,gdt_id)
					SetCursor_(cursorSIZE)
					
					Case #GDT_PgnG, #GDT_PgnD
					SetCursor_(cursorWE)
					
					Case #GDT_PgnH, #GDT_PgnB
					SetCursor_(cursorNS)
					
					Default
					Poignee_cache(#GDT_PoigneeCache,0)
					
				EndSelect
				;Debug "gdt_id: "+Str(gdt_id)+" - gdt_pgn_id: "+Str(gdt_pgn_id)
			EndIf
			
			
			Case #PB_Event_Gadget
			If EventGadget() > #GDT_USER_GADGET And EventGadget() < #GDT_LAST_USER_GADGET
				gdt_id = EventGadget()
				
			EndIf
		EndSelect
	Until event = #PB_Event_CloseWindow
EndIf
End; EPB

Re: Poignées de redimentionnement

Publié : ven. 23/nov./2012 1:32
par falsam
Un autre exemple

Code : Tout sélectionner

EnableExplicit

Enumeration
  #MainForm ;Fenetre en cours de création 

  ;Points d'ancrage d'un gadget selectionné
  #AnchorN ;Nord
  #AnchorE ;Est
  #AnchorS ;Sud
  #AnchorW ; Ouest
  #AnchorSize ;Taille de chaque point d'ancrage
EndEnumeration

Define.l Event, EventWindow, EventGadget, EventType, EventMenu

;Un gadget est il survolé ?
Macro GadgetHoverCheck(x, y, Gadget)
  (((Not x<GadgetX(Gadget)) & (Not y<GadgetY(Gadget))) &(Not x>=(GadgetX(Gadget)+GadgetWidth(Gadget))) & (Not y>=(GadgetY(Gadget)+GadgetHeight(gadget))))
EndMacro

;Structure d'un gadget 
Structure StructureGadget
  Idgadget.i       ;Identifiant gadget lors de la création   
EndStructure
Global Dim Gadgets.StructureGadget(1), IdGadget.i, CountGadgets.i

;Coordonnées X,Y de création d'un gadget
Global X.i, Y.i, X1.i, Y1.i, Width.i, Height.i, Width1.i, Height1.i, DeltaX.i, DeltaY.i

;Les Poignées : Couleur, Taille, Cachées (Oui/Non), actif (Aucune=0,  N=1, E=2, S=3, W=4)
Global AnchorColor.i=$0000ff, AnchorSize.i=7, AnchorHide=#True, AnchorActif.i

;Cureurs
Global cursorNS.i, cursorWE.i, cursorSIZE.i  

;Gadget sélectionné, gadget en cours de déplacement ou de redimentionnement
Global GadgetCheck.b, GadgetDraw.b

Procedure EventMouse()
;Evenement Souris (0: Rien, 1 :Clique Gauche, 2 : Clique central, 3 : Clique droitProcedure EventMouse()
  ProcedureReturn Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*3 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000
EndProcedure

;Création des points d'ancrage
Procedure AnchorCreate()
  TextGadget(#AnchorN, 0, 0, AnchorSize, AnchorSize,"") 
  TextGadget(#AnchorE, 0, 0, AnchorSize, AnchorSize,"")
  TextGadget(#AnchorS, 0, 0, AnchorSize, AnchorSize,"")
  TextGadget(#AnchorW, 0, 0, AnchorSize, AnchorSize,"")
    
  SetGadgetColor(#AnchorN, #PB_Gadget_BackColor, AnchorColor)
  SetGadgetColor(#AnchorE, #PB_Gadget_BackColor, AnchorColor)
  SetGadgetColor(#AnchorS, #PB_Gadget_BackColor, AnchorColor)
  SetGadgetColor(#AnchorW, #PB_Gadget_BackColor, AnchorColor)
EndProcedure

;Cache les points d'ancrage
Procedure AnchorHide(Value.b)
  HideGadget(#AnchorN, Value)
  HideGadget(#AnchorE, Value)
  HideGadget(#AnchorS, Value) 
  HideGadget(#AnchorW, Value)
  AnchorHide=Value
EndProcedure

;Positionne les point d'ancrage
Procedure AnchorMove(IdGadget)
  Protected Left.i, Top.i, Width.i, Height.i
  Left=GadgetX(IdGadget)
  Top=GadgetY(IdGadget)
  Width=GadgetWidth(IdGadget)
  Height=GadgetHeight(IdGadget)
  If AnchorHide=#True
    AnchorHide(#False)
  EndIf
    
  ResizeGadget(#AnchorN, (Left+Width/2), Top-AnchorSize, AnchorSize, AnchorSize)
  ResizeGadget(#AnchorS, Left+Width/2, Top+Height+AnchorSize/4, AnchorSize,AnchorSize)
  ResizeGadget(#AnchorE, Left+AnchorSize/2+Width, Top+(Height-AnchorSize)/2, AnchorSize, AnchorSize)
  ResizeGadget(#AnchorW, Left-AnchorSize, Top+(Height-AnchorSize)/2, AnchorSize, AnchorSize)
EndProcedure

;Quel est le point d'ancrage actif
Procedure GetAnchorCheck()
  If GadgetDraw=#False
    AnchorActif=#False

    If GadgetHoverCheck(x,y,#AnchorN)
     AnchorActif=1
    EndIf
  
    If GadgetHoverCheck(x,y,#AnchorS)
      AnchorActif=2
    EndIf  
  
    If GadgetHoverCheck(x,y,#AnchorE)
      AnchorActif=3
    EndIf
  
    If GadgetHoverCheck(x,y,#AnchorW)
      AnchorActif=4
    EndIf 
  
    ProcedureReturn AnchorActif
  EndIf
EndProcedure

;Repositionne le gadget 
Procedure GadgetDraw(KbdValue.i, Idgadget.i)
  
  ;Un gadget est il toujours selectionné ?
  If IdGadget<>0
    Width=GadgetWidth(Idgadget) 
    Height=GadgetHeight(IdGadget)
    
    If AnchorActif>0
      DeltaX=0 : DeltaY=0
      Select AnchorActif
        Case 1 ;Nord
          SetCursor_(cursorNS)
          X=GadgetX(IdGadget)
          Height=Height+(GadgetY(IdGadget)-Y)
          
        Case 2 ;Sud
          SetCursor_(cursorNS)
          X=GadgetX(IdGadget)
          Height=Y-GadgetY(IdGadget)
          Y=GadgetY(IdGadget)
          
        Case 3 ;Est
          SetCursor_(cursorWE)
          Y=GadgetY(IdGadget)
          Width=X-GadgetX(IdGadget)
          X=GadgetX(IdGadget)
          
        Case 4 ;Ouest
          SetCursor_(cursorWE)
          Y=GadgetY(IdGadget)
          Width=Width+(GadgetX(IdGadget)-X)

      EndSelect 
    Else
      SetCursor_(cursorSIZE)
    EndIf

    ;Quelques chose est il modifié dans les dimensions ?
    If (X1<>X) Or (Y1<>Y) Or (Width1<>Width) Or (Height1<>Height) ;And AnchorActif=0
      ResizeGadget(Idgadget, X-DeltaX, Y-DeltaY, Width, Height) 
      AnchorMove(Idgadget)
    EndIf    
    X1=X : Y1=Y : Width1=Width : Height1=Height  
  EndIf
EndProcedure


;Un gadget est il selectionné
Procedure GetGadgetCheck()
  Protected i.i
  If GadgetDraw=#False
    GadgetCheck=#False   
    For i=0 To CountGadgets-1      
      If GadgetHoverCheck(X, Y, Gadgets(i)\Idgadget) 
        IdGadget=Gadgets(i)\Idgadget
 
        ;Delta entre la position de la souris et les bords haut/gauche du gadget     
        DeltaX=X-GadgetX(IdGadget)
        DeltaY=Y-GadgetY(Idgadget)
        GadgetCheck=#True
        AnchorHide(#False)
      Else
        AnchorHide(#True)
      EndIf  
    Next
  EndIf
  ProcedureReturn GadgetCheck
EndProcedure

;Fenetre en cours de création
Procedure MainFormShow()
  OpenWindow(#MainForm,320,100,500,400,"Nouvelle Fenetre",#PB_Window_SizeGadget | #PB_Window_SystemMenu)
  
  CountGadgets = 5
  ReDim Gadgets(CountGadgets)
    
  Gadgets(0)\IdGadget = TextGadget(#PB_Any, 10, 10, 80, 20, "Nom") 
  Gadgets(1)\IdGadget = StringGadget(#PB_Any, 100, 10, 200, 22, "")
  Gadgets(2)\IdGadget = ButtonGadget(#PB_Any, 310, 10, 80, 22, "Ajouter")
  Gadgets(3)\IdGadget = TextGadget(#PB_Any, 10, 35, 80, 20, "Adresse") 
  Gadgets(4)\IdGadget = EditorGadget(#PB_Any, 100, 35, 200, 50)
      
  ;Initialisation des points d'ancrage 
  AnchorCreate()
  AnchorHide(#True)
  
  ;Initialisation des curseurs 
  cursorNS = LoadCursor_(0, #IDC_SIZENS)
  cursorWE = LoadCursor_(0, #IDC_SIZEWE)
  cursorSIZE = LoadCursor_(0, #IDC_SIZEALL)   
  
EndProcedure

;-Affichage de la fenetre
MainFormShow()

;-Boucle evenementielle
Repeat 
  Event=WaitWindowEvent() 
  If GetActiveWindow()=#MainForm
    Select EventMouse()  
      Case 0 ;Bouton gauche/droit de la souris relaché
        If GadgetDraw=#True
          GadgetDraw=#False ;Le gadget n'est plus en cours de déplacement
          AnchorActif=#False ;Les point d'ancrages ne sont plus actifs (Mais restent visibles)
        EndIf
                         
      Case 1 ;Clic bouton gauche de la souris
        ;Quels sont les coordonnées de la souris ?
        X=WindowMouseX(#MainForm)
        Y=WindowMouseY(#Mainform)
          
        ;Un gadget ou un point d'ancrage est il selectionné ?
        If GetAnchorCheck()>0 Or GetGadgetCheck() Or AnchorActif>0
          GadgetDraw=#True ; Le gadget selectionné est susceptible d'etre déplacer            
          GadGetDraw(0, IdGadget)
        EndIf  
      Case 2 ;Clic bouton central de la souris

      Case 3 ;Clic bouton droit de la souris
        
    EndSelect     
  EndIf
       
  Select Event      
    Case #PB_Event_CloseWindow     
        End
  EndSelect
ForEver

Re: Poignées de redimentionnement

Publié : ven. 23/nov./2012 9:31
par Micoute
Je vous remercie tous pour votre contribution, bien que l'exemple fourni par Dobro soit très bon, mais il plante si on modifie la taille du gadget et je sais que ce n'est pas sa création, mais ma préférence va à falsam.

Et encore grand merci à tous les deux !