Obtenir la position D'un Canvas

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Jeanmarc
Messages : 46
Inscription : ven. 10/juin/2016 16:11

Obtenir la position D'un Canvas

Message par Jeanmarc »

C'est encore moi,

Peut-on récupérer la position x, y d'un Canvas après l'avoir scrollé dans ScrollAreaGadget ?

Cela ne me semble pas possible avec GetGadgetAttribute(...
Je sais récupérer la position des Scrollbars mais uniquement quand je relâche le bouton du cureur.

Merci si vous connaissez la réponse,

JM
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Obtenir la position D'un Canvas

Message par falsam »

De cette maniere par exemple

Code : Tout sélectionner

Declare ShowXY()
If OpenWindow(0, 0, 0, 800, 600, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ScrollAreaGadget(0, 0, 0, 800, 600, 2000, 2000, 30)
  CanvasGadget(1, 0, 0, 2000, 2000)
  CloseGadgetList()
  
  ;trigger
  BindGadgetEvent(1, @ShowXY(), #PB_EventType_MouseMove)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 

Procedure ShowXY()
  Protected MouseX = GetGadgetAttribute(1, #PB_Canvas_MouseX)
  Protected MouseY = GetGadgetAttribute(1, #PB_Canvas_MouseY)
  
  Debug "x/y: " + MouseX + " / " + MouseY
  
EndProcedure
Ooops mal lu !! C'est la postion du canvas que tu souhaites et non pas les coordonnées de la souris dans le canvas !!
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Jeanmarc
Messages : 46
Inscription : ven. 10/juin/2016 16:11

Re: Obtenir la position D'un Canvas

Message par Jeanmarc »

OUI falsam,

La position de la souri, je n'ai pas encore expérimenter, je verrais plus tard. Chaque chose en son temps.

Bon, alors, peut-on récupérer la position d'un Canvas déplacé dans un ScrollAreaGadget?

Voire ma question préalable plus complète.
Merci quand même, cela me sera utile un jour, demain peut-être.
Bonne soirée,
JM
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Obtenir la position D'un Canvas

Message par Zorro »

avec :
GetGadgetAttribute(): Avec une des constantes suivantes:
#PB_ScrollArea_InnerWidth : Renvoie la largeur (en pixels) de la zone interne du gadget.
#PB_ScrollArea_InnerHeight : Renvoie la hauteur (en pixels) de la zone interne du gadget.
#PB_ScrollArea_X : Renvoie la position horizontale actuelle de l'ascenseur (en pixels).
#PB_ScrollArea_Y : Renvoie la position verticale actuelle de l'ascenseur (en pixels).
lorsque tu as posé le canvas dans l'area , tu avais sa position
avec ces fonctions, tu devrai pouvoir le retrouver ...

avec ce code , tu devrai pouvoir forcer l'affichage , puisqu'il est capable de changer la position des ascenseurs

tiré de ce post :
http://www.purebasic.fr/french/viewtopi ... stpos#p169
un code probablement pompé sur le forum anglais ... mais pas sur

Code : Tout sélectionner

Declare.l getlistpos(gadget.l)
Declare.l setlistpos(gadget.l, position.l)
Declare  remplir()

Enumeration
	#win
	#list
	#bouton
EndEnumeration



If OpenWindow(#win, 0, 0, 300, 300,"Scroll ListIconGadget", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
	;If ; CreateGadgetList(WindowID(0))
	ListIconGadget(#list, 0, 0, 300, 250, "Elements", 275, #PB_ListIcon_FullRowSelect)
	ButtonGadget(#bouton, 0, 260, 300, 25, "Actualiser")
	Remplir()
	;Else
	;     End
	;EndIf
Else
	End
EndIf
Repeat
	Event = WaitWindowEvent()
	If Event = #PB_Event_Gadget
		Select EventGadget() ; boutons, zone de texte, ...
			Case #list
			
			Case #bouton
			pos = GetListPos(#list)
			Debug "Premier élément visible = " + Str(pos)
			ClearGadgetItemList(#list)
			Debug "Liste vidée"
			Remplir()
			Debug "Remplissage de la liste"
			; defini une position "d'origine" a 18
			pos=18
			SetListPos(#list, pos)
			Debug "on remet à la position d'origine :" +str(pos)
		EndSelect
	EndIf
Until Event = #PB_Event_CloseWindow 

;-Procedures Zone
Procedure.l GetListPos(gadget.l)
	ProcedureReturn SendMessage_(GadgetID(Gadget), #LVM_GETTOPINDEX, 0, 0)
EndProcedure
Procedure.l SetListPos(Gadget.l, Position.l)
	Protected Pos.point
	SendMessage_(GadgetID(Gadget), #LVM_GETITEMPOSITION, Position - 1, Pos)
	SendMessage_(GadgetID(Gadget), #LVM_SCROLL, 0, Pos\y)
EndProcedure

;- Debut du test
Procedure Remplir()
	; On rempli la liste
	For n = 0 To 50
		AddGadgetItem(1, -1, "Elément " + Str(n))
	Next
EndProcedure
; Epb

Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Obtenir la position D'un Canvas

Message par Mesa »

Comme ça:

Code : Tout sélectionner

Procedure scrollHV()
  H=GetGadgetAttribute(0,#PB_ScrollArea_X) - GadgetX(0,#PB_Gadget_ContainerCoordinate); <=====
  V=GetGadgetAttribute(0,#PB_ScrollArea_Y) - GadgetY(0,#PB_Gadget_ContainerCoordinate);<=====
  
  Debug "Pos H du canvas dans le scrollarea :" + Str(H)
  Debug "Pos V du canvas dans le scrollarea :" + Str(V)
  Debug "Pos H du canvas dans la fenêtre :" + Str(GadgetX(0,#PB_Gadget_WindowCoordinate))
  Debug "Pos H du canvas dans la fenêtre :" + Str(GadgetY(0,#PB_Gadget_WindowCoordinate))
  Debug "Pos H du canvas dans l'écran :" + Str(GadgetX(0,#PB_Gadget_ScreenCoordinate))
  Debug "Pos H du canvas dans l'écran :" + Str(GadgetY(0,#PB_Gadget_ScreenCoordinate))
  Debug ""
  
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  ScrollAreaGadget(0, 10, 10, 400,400, 1000, 1000, 30)
  CanvasGadget(1, 10, 10, 600, 600) 
  CloseGadgetList()
  
  BindGadgetEvent(0,@scrollHV()); on utilise bindxxx pour avoir un retour des messages en temps réels
  
  Repeat 
    Select WaitWindowEvent() 
      Case  #PB_Event_CloseWindow 
        End 
      Case  #PB_Event_Gadget 
        Select EventGadget()
          Case 0
            Debug("Le scrollarea a envoyé un message !")
            
            ;             Case 1
            ;               Debug("Le CANVAS a envoyé un message !")
            
        EndSelect
    EndSelect 
  ForEver 
EndIf

M.
Jeanmarc
Messages : 46
Inscription : ven. 10/juin/2016 16:11

Re: Obtenir la position D'un Canvas

Message par Jeanmarc »

Merci à vous,

Si j'avais cherché mieux, peut-être aurais-je trouvé.
L'aide est très succincte, heureusement que ce forum existe.

BindGadgetEvent est vraiment une très bonne chose. Je commence à comprendre PB. Les propriétés de VB.NET me manquent un peux au début mais je suis fâché avec. Peut-être justement trop de propriétés. Trop de fichiers annexes. Et surement trop compliqué pour moi.

Avec 700 lignes non optimisées et beaucoup de commentaires, j'ai un début d'interface qui me convient parfaitement, à l'œil en tous cas.

Je vais poster une nouvelle question,

Bon lundi au soleil,
JM
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Obtenir la position D'un Canvas

Message par microdevweb »

Bonjour Jeanmarc,

Moi je viens de Windev avec plein de possibilités et pourtant j'ai abandonné ce dernier au profit de PureBasic.

Bon il est vrai que j'ai du me créer quelques modules pour arrivé au résultat que je voulais, mais avec PureBasic j'ai plus de liberté et surtout un résultat performant.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre