Page 1 sur 2

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

Publié : jeu. 11/déc./2008 20:18
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

Publié : lun. 22/déc./2008 10:24
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:

Publié : mar. 23/déc./2008 11:07
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.

Publié : mar. 23/déc./2008 11:19
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

Publié : mar. 23/déc./2008 18:00
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.

Publié : mar. 23/déc./2008 18:32
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

Publié : mar. 23/déc./2008 18:54
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

Publié : mar. 23/déc./2008 19:21
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

Publié : mar. 23/déc./2008 20:32
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

Publié : lun. 29/déc./2008 12:50
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

Publié : mar. 30/déc./2008 12:48
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]

Publié : mar. 30/déc./2008 16:12
par Patrick88
ça marche nickel merci

pat

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

Publié : mar. 29/déc./2009 18:54
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)


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

Publié : mer. 30/déc./2009 0:40
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+

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

Publié : mer. 30/déc./2009 6:33
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