[exemple] déplacement de gadget avec des poignées

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

[exemple] déplacement de gadget avec des poignées

Message par Patrick88 »

extrapolé d'un exemple trouvé sur le net
;; http://www.purebasic.fr/english/viewtop ... wfrompoint
;; code de Sparkie

ce code ne fonctionne pas avec des "groupes"
containergadget / panelgadget....

Code : Tout sélectionner

Enumeration
	#FEN_MAIN
EndEnumeration

Enumeration 1
	#GDT_PgnG
	#GDT_PgnD
	#GDT_PgnH
	#GDT_PgnB
	
	#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

; ;...Our main image
; CreateImage(2, 300, 300)
; StartDrawing(ImageOutput(2))
; Circle(150, 150, 150, #Yellow)
; StopDrawing()

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 traces.s 

;...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)
	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,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2, #PB_Ignore, #PB_Ignore)
	  ResizeGadget(#GDT_PgnD,GadgetX(gdt_id)+GadgetWidth(gdt_id)-#GDT_PoigneeTaille/2,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2, #PB_Ignore, #PB_Ignore)
	  ResizeGadget(#GDT_PgnH,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2,GadgetY(gdt_id)-#GDT_PoigneeTaille/2, #PB_Ignore, #PB_Ignore)
	  ResizeGadget(#GDT_PgnB,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2,GadgetY(gdt_id)+GadgetHeight(gdt_id)-#GDT_PoigneeTaille/2, #PB_Ignore, #PB_Ignore)
	EndIf
EndProcedure


If OpenWindow(#FEN_MAIN, 0, 0, 300, 300, "Visual PB Zoub", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  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)
		ContainerGadget(#GDT_DEMO1,10,10,200,25,#PB_Container_Single)
	TextGadget(#GDT_DEMO2,5,4,80,16,"Déplace moi")
	StringGadget(#GDT_DEMO3,90,2,100,20,"Déplace moi")
	CloseGadgetList()

	;ButtonGadget(#GDT_DEMO1,10,10,100,25,"Déplace moi")
	;TextGadget(#GDT_DEMO2,10,30,100,25,"Déplace moi")
	;StringGadget(#GDT_DEMO3,10,50,100,25,"Déplace moi")
	ListIconGadget(#GDT_DEMO4,150,10,100,100,"Déplace moi",100)
	
	;Poignee_cache(#GDT_PoigneeMontre)
	
	deltax = -2: deltay = -2
 	gdt_id = #GDT_USER_GADGET+1
 	
  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	        
        Else
           gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN)| (WindowMouseY(#FEN_MAIN)<<32))) ; modifié après intervention de kwandjeen          
          
          If gdt_pgn_id > #GDT_USER_GADGET And gdt_pgn_id < #GDT_LAST_USER_GADGET
          	gdt_id = gdt_pgn_id
  					Poignee_cache(#GDT_PoigneeMontre,gdt_id)
          	SetCursor_(cursorSIZE)

          Else	          
	          Select gdt_pgn_id 
							Case #GDT_PgnG, #GDT_PgnD
								SetCursor_(cursorWE)
																
							Case #GDT_PgnH, #GDT_PgnB
								SetCursor_(cursorNS)
																
	          EndSelect
	        EndIf
	        ;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
; IDE Options = PureBasic 4.30 Beta 4 (Windows - x86)
pat
Dernière modification par Patrick88 le lun. 12/janv./2009 18:44, modifié 4 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ouuuuaahh, j'adore ce code 8)
Trop cool, un bon debut pour un futur Visual designer :D

Merci pour ton partage :wink:
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Ouais... C'était super, et Il à marché puis quand le l'ai repris pour regarder de plus près...
Il me donne : ChildWindowFromPoint_() : nombre de paramètre incorrect dans :

Code : Tout sélectionner

gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))  
De quoi cela peut venir ?
Merci.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

GeBonet a écrit :Ouais... C'était super, et Il à marché puis quand le l'ai repris pour regarder de plus près...
Il me donne : ChildWindowFromPoint_() : nombre de paramètre incorrect dans :

Code : Tout sélectionner

gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))  
De quoi cela peut venir ?
Merci.
Depuis la PB4.30, ChildWindowFromPoint_() attend un QUAD (comme WindowFromPoint_()).
Ref : http://www.purebasic.fr/english/viewtopic.php?t=34860 (voir la réponse de Fred)
Une solution proposée par Trond : http://www.purebasic.fr/english/viewtop ... 0&start=43
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

gnozal a écrit :
GeBonet a écrit :Ouais... C'était super, et Il à marché puis quand le l'ai repris pour regarder de plus près...
Il me donne : ChildWindowFromPoint_() : nombre de paramètre incorrect dans :

Code : Tout sélectionner

gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), [b]WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)[/b]))  
De quoi cela peut venir ?
Merci.
Depuis la PB4.30, ChildWindowFromPoint_() attend un QUAD (comme WindowFromPoint_()).
Ref : http://www.purebasic.fr/english/viewtopic.php?t=34860 (voir la réponse de Fred)
Une solution proposée par Trond : http://www.purebasic.fr/english/viewtop ... 0&start=43
Merci beaucoup, et j'ai compris que je dois transformer WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN) de l'expression ci dessus en une valeur unique exprimée en QUAD... J'ai vu ce que Trond explique mais je comprend pas comment transformer la position de la souris x, y, ici en une valeur QUAD... Sinon par le biais de déclaration de structure union dont je "comprend" le mécanisme (on passe à l'API les deux paramètres en une seule expression soit en une fois) mais ne sais pas trop bien comment l'appliquer ici... ? Tout ce que je sais c'est que celà devrait devenir quelque chose comme :
GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), Coord.q))
Avec Coord.Q étant la valeur répesantant X=WindowMouseX(#FEN_MAIN) et Y=WindowMouseY(#FEN_MAIN)
Du moins je pense :? ? Comme je pense que cette explication éclaircirait un peu plus mes idées et peut-être aussi celle d'autres...
Car en fait cela se résume à comment passer d'une forme de donnée dans une autre forme pour être exploitable autrement...
Déjà que à partir de cette version ci, le QUAD 8 octeds en 32 bits devient identique à un ENTIER en 64 bit.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

remplacez le code

Code : Tout sélectionner

gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))
par

Code : Tout sélectionner

If OpenLibrary(0, "USER32.DLL")
  *pointeur_vers_fonction.l = GetFunction(0, "ChildWindowFromPoint")
  If *pointeur_vers_fonction
    hwnd.l = CallFunctionFast(*pointeur_vers_fonction, WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN))
  EndIf	    
  *pointeur_vers_fonction.l = GetFunction(0, "GetDlgCtrlID")
  If *pointeur_vers_fonction
    gdt_pgn_id = CallFunctionFast(*pointeur_vers_fonction, hwnd)
  EndIf	    
  CloseLibrary(0)
EndIf
pat
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Merci beaucoup Pat... Ce code m'intéresse justement pour la manipulation de fenêtre... Car je suis en train de penser à recréer sous PB un générateur d'application que j'avais réalisé en 1987 et que j'ai continué à développer jusqu'en 1992 et à existé jusqu'en 1995.. Puis j'ai arrêté tout à l'époque pour voyager. Ce générateur reposait sur la création d'écrans de saisies (fenêtre aujourd'hui) à partir de quoi on créait les fichiers, les liaisons, etc... Le résultat un truc genre Windev avant Windev et sous DOS, mais en plus simple et tout aussi efficace. Ca à bien marché... Ici ce serait pour m'amuser et voir si je suis encore capable d'apprendre des choses et de les appliquer, suis retraité alors !... Il faut donc partir d'une base qui serait un PureFORM ou VisualDesigner mais avec des fonctions supplémentaires mais qui ne génèrerais pas du code mais des données exploitée par un "interpréteur".

Mais à part ça, cette transformation de X, Y en QUAD aussi est intéréssante :lol:
Encore merci et à +
Ge
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

en fait je comptais écrire un truc genre windev... hem
suffit juste de glaner ça et là les codes des autres, de les mettre dans un gros chaudron, de touiller de touiller...

autant on trouve des codes pour faire des éditeurs de texte, gérer des bases de données, générer des états, autant les codes pour bouger des objets à l'écran sont rares...

je suis pas une flèche en programmation, j'ai appris sur le tas, alors utiliser des quads, des macros... gné ? dans un premier temps, faisons simple, après il sera toujours temps d'optimiser...

je posterai prochainement une ébauche, avec un environnement multi-fenêtre...

je me base sur la version 7.5 de windev

pat
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Il me semblait bien que j'avais vu passer un jours cette intention... C'est d'ailleurs pour cela que je t'ai parler du générateur...

Pour ne pas encombré en discutions "particulière" je t'envois un Post en "PM"...

A+
Ge
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

autre code, plus simple.
en fait dès que l'on cherche "ChildWindowFromPoint" et "GetDlgCtrlID" sur le forum anglais, on trouve plein d'exemple...

j'ai ajouté les descriptions des appels aux api, je voulais savoir à quoi servait le "releasecapture"... pas bien compris vu que ça marche en le supprimant...
par contre, si on enleve les containergadget, impossible de bouger les textes....

Code : Tout sélectionner

#FEN_MAIN = 0

Procedure.l MouseOverGadget(num_fenetre.l)
  ; The GetCursorPos function retrieves the cursor's position, in screen coordinates. 
  GetCursorPos_(@cursor_pos.POINT)
  
  ;The ScreenToClient function converts the screen coordinates of a specified point on the screen to client coordinates. 
  ScreenToClient_(WindowID(0),@cursor_pos)

; The ChildWindowFromPoint function determines which, if any, of the child windows belonging to a parent window contains the specified point. 
; The GetDlgCtrlID function returns the identifier of the specified control.

; modifié après intervention de kwandjeen
  hChild = ChildWindowFromPoint_(WindowID(0), cursor_pos\x | cursor_pos\y<<32)
  ProcedureReturn GetDlgCtrlID_(hChild)
EndProcedure

If OpenWindow(#FEN_MAIN,0,0,640,300,"egrids test program.",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered) ; And CreateGadgetList(WindowID(0))
  ;ShowWindow_(WindowID(#FEN_MAIN), #SW_MAXIMIZE)

  ContainerGadget(1,20,50,100,40,#PB_Container_Raised)
    TextGadget(10, 10,10,80, 15, "Click and drag")
  CloseGadgetList()
  ContainerGadget(2,20,100,100,40,#PB_Container_Raised)
    TextGadget(11, 10,10,80, 15, "Click and drag")
  CloseGadgetList()
  ContainerGadget(3,20,150,100,40,#PB_Container_Raised)
    TextGadget(12, 10,10,80, 15, "Click and drag")
  CloseGadgetList()
  ContainerGadget(4,20,200,100,40,#PB_Container_Raised)
    TextGadget(13, 10,10,80, 15, "Click and drag")
  CloseGadgetList()
  ContainerGadget(5,20,250,100,40,#PB_Container_Raised)
    TextGadget(14, 10,10,80, 15, "Click and drag")
  CloseGadgetList()

Repeat
  EventID = WaitWindowEvent()
 
  Select EventID
 
    Case #WM_LBUTTONDOWN
      gad = MouseOverGadget(#FEN_MAIN)
      If gad > 0
      	; The ReleaseCapture function releases the mouse capture from a window in the current thread 
      	; And restores normal mouse input processing. A window that has captured the mouse receives all mouse input, 
      	; regardless of the position of the cursor, except when a mouse button is clicked 
      	; While the cursor hot spot is in the window of another thread. 
        ReleaseCapture_()
        
        ; The WM_NCLBUTTONDOWN message is posted when the user presses 
        ; the left mouse button While the cursor is within the nonclient area of a window. 
        ; This message is posted To the window that contains the cursor. 
        ; If a window has captured the mouse, this message is Not posted. 
        SendMessage_(GadgetID(gad), #WM_NCLBUTTONDOWN, #HTCAPTION, NULL)
      EndIf
   
  EndSelect

Until EventID = #PB_Event_CloseWindow

EndIf
Dernière modification par Patrick88 le mar. 30/déc./2008 16:14, modifié 2 fois.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Message par kwandjeen »

Patrick88 a écrit :remplacez le code

Code : Tout sélectionner

gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))
par

Code : Tout sélectionner

If OpenLibrary(0, "USER32.DLL")
  *pointeur_vers_fonction.l = GetFunction(0, "ChildWindowFromPoint")
  If *pointeur_vers_fonction
    hwnd.l = CallFunctionFast(*pointeur_vers_fonction, WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN))
  EndIf	    
  *pointeur_vers_fonction.l = GetFunction(0, "GetDlgCtrlID")
  If *pointeur_vers_fonction
    gdt_pgn_id = CallFunctionFast(*pointeur_vers_fonction, hwnd)
  EndIf	    
  CloseLibrary(0)
EndIf
pat
plus simple il suffit de remplacer

Code : Tout sélectionner

GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))
par

Code : Tout sélectionner

GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN)| (WindowMouseY(#FEN_MAIN)<<32)))
[/code]
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

ça marche nickel merci

pat
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [exemple] déplacement de gadget avec des poignées

Message par Kwai chang caine »

Comme je l'avais dit y'a pile un an....ce code il est trop cool 8)

Mais voila KCC il a essayé de le modifier et il l'a cassé :oops:
Il voulait rajouter un scrollarea gadget pour pouvoir encore agrandir le champ de la fenetre :roll:

Et ça marche plus...je suppose que c'est parce que l'ID detecté est toujours celui du scrollArea :roll:
car la detection de l'id survolé est toujour celui du scroll :(

Code : Tout sélectionner

 Pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN)|(WindowMouseY(#FEN_MAIN)<<32)))
Ca fait trois heures que je tourne en rond, si quelqu'un voit ce qu'il faut changer sur cette ligne ou ce code pour que non seulement le scrollarea marche, mais avec la possibilité de modifier les gadgets comme avant :D

Merci

Code : Tout sélectionner

Enumeration
   #FEN_MAIN
EndEnumeration

Enumeration 1
   #GDT_PgnG
   #GDT_PgnD
   #GDT_PgnH
   #GDT_PgnB
   #GadgetArea
   #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

; ;...Our main image
; CreateImage(2, 300, 300)
; StartDrawing(ImageOutput(2))
; Circle(150, 150, 150, #Yellow)
; StopDrawing()

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 traces.s 

;...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)
   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,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2, #PB_Ignore, #PB_Ignore)
     ResizeGadget(#GDT_PgnD,GadgetX(gdt_id)+GadgetWidth(gdt_id)-#GDT_PoigneeTaille/2,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2, #PB_Ignore, #PB_Ignore)
     ResizeGadget(#GDT_PgnH,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2,GadgetY(gdt_id)-#GDT_PoigneeTaille/2, #PB_Ignore, #PB_Ignore)
     ResizeGadget(#GDT_PgnB,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2,GadgetY(gdt_id)+GadgetHeight(gdt_id)-#GDT_PoigneeTaille/2, #PB_Ignore, #PB_Ignore)
   EndIf
EndProcedure


If OpenWindow(#FEN_MAIN, 0, 0, 300, 300, "Visual PB Zoub", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
 ScrollAreaGadget(#GadgetArea, 0, 0, WindowWidth(#FEN_MAIN), WindowHeight(#FEN_MAIN), 10000, 10000) 
 OpenGadgetList(#GadgetArea)
  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)
      ContainerGadget(#GDT_DEMO1,10,10,200,25,#PB_Container_Single)
   TextGadget(#GDT_DEMO2,5,4,80,16,"Déplace moi")
   StringGadget(#GDT_DEMO3,90,2,100,20,"Déplace moi")
   CloseGadgetList()

   ;ButtonGadget(#GDT_DEMO1,10,10,100,25,"Déplace moi")
   ;TextGadget(#GDT_DEMO2,10,30,100,25,"Déplace moi")
   ;StringGadget(#GDT_DEMO3,10,50,100,25,"Déplace moi")
   ListIconGadget(#GDT_DEMO4,150,10,100,100,"Déplace moi",100)
   
   ;Poignee_cache(#GDT_PoigneeMontre)
   
   deltax = -2: deltay = -2
   gdt_id = #GDT_USER_GADGET+1
   
  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           
        Else
           gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN)| (WindowMouseY(#FEN_MAIN)<<32))) ; modifié après intervention de kwandjeen          
          
          If gdt_pgn_id > #GDT_USER_GADGET And gdt_pgn_id < #GDT_LAST_USER_GADGET
             gdt_id = gdt_pgn_id
                 Poignee_cache(#GDT_PoigneeMontre,gdt_id)
             SetCursor_(cursorSIZE)

          Else             
             Select gdt_pgn_id 
                     Case #GDT_PgnG, #GDT_PgnD
                        SetCursor_(cursorWE)
                                                
                     Case #GDT_PgnH, #GDT_PgnB
                        SetCursor_(cursorNS)
                                                
             EndSelect
           EndIf
           ;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
; IDE Options = PureBasic 4.30 Beta 4 (Windows - x86)

ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: [exemple] déplacement de gadget avec des poignées

Message par GeBonet »

Bonjour,
Effectivement c'est ID de ton "ScrollAreaGadget(#GadgetArea,..,..,..,.., 10000, 10000) qui empêche l'identification de la ligne :
gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN)| (WindowMouseY(#FEN_MAIN)<<32)))
Et le fait de passer par l'API qui elle travaille en dessous mais n'est pas vue. Il faut trouver les instructions natives pour faire la même chose :wink:
Ou une autre Api ou forme d'appeler pour que soit reconnus les ID des gadgets au lieu de celui du ScrollAreaGadget() !!!
Car d'après la doc, ScrollAreaGadget(...) devrait faire défiler tout ce qui est compris dans son aire de travail.
Mais pourquoi pas utiliser le : #PB_Window_SizeGadget dans : OpenWindows(....) ? Je ne vois pas tellement d'intérêt au scroll dans ce cas ?
Mais, je vais voir si je trouve quelques chose...
A+
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [exemple] déplacement de gadget avec des poignées

Message par Kwai chang caine »

Merci GEBONET de chercher pour moi 8)
Mais pourquoi pas utiliser le : #PB_Window_SizeGadget dans : OpenWindows(....) ? Je ne vois pas tellement d'intérêt au scroll dans ce cas
En fait je veux faire une espece de logigramme, mais en immense, c'est a dire que l'ecran ne sera qu'une petite partie du logigramme :D
Mais, je vais voir si je trouve quelques chose...
Sur le forum us ARTIC FOX, a modifié la ligne pour moi, car j'avoue que je la comprend pas :oops:

La ligne modifiée sur un gadget donne ça :

Code : Tout sélectionner

gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(GadgetID(#GDT_DEMO1), (WindowMouseX(#FEN_MAIN) - GadgetX(#GDT_DEMO1)) | ((WindowMouseY(#FEN_MAIN) - GadgetY(#GDT_DEMO1))<<32)))
A mon tour, j'ai fait une boucle sur tous les gagdets, et ça marche 8O
A mon avis y'a surement une methode plus propre que ça avec un subclassement, un callback enfin des trucs qui me depassent :oops:
Si un MAITRE de ce forum passe par la, je suis preneur d'une nouvelle idée...ça me vexera pas :lol:

Code : Tout sélectionner

For i = 1 To 4
     Select i
      Case 1
       Pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(GadgetID(#DEMO1), (WindowMouseX(#FEN_MAIN) - GadgetX(#DEMO1))|((WindowMouseY(#FEN_MAIN) - GadgetY(#DEMO1))<<32)))
      Case 2
       Pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(GadgetID(#DEMO2), (WindowMouseX(#FEN_MAIN) - GadgetX(#DEMO2))|((WindowMouseY(#FEN_MAIN) - GadgetY(#DEMO2))<<32)))
      Case 3
       Pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(GadgetID(#DEMO3), (WindowMouseX(#FEN_MAIN) - GadgetX(#DEMO3))|((WindowMouseY(#FEN_MAIN) - GadgetY(#DEMO3))<<32)))
      Case 4 
       Pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(GadgetID(#DEMO4), (WindowMouseX(#FEN_MAIN) - GadgetX(#DEMO4))|((WindowMouseY(#FEN_MAIN) - GadgetY(#DEMO4))<<32)))
     EndSelect
     
     If Pgn_id <> 0
      Break
     EndIf
      
    Next
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre