Déplacer plusieurs gadgets en même temps

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Déplacer plusieurs gadgets en même temps

Message par Mesa »

Après plusieurs essais, je n'arrive pas à déplacer plusieurs gadgets en même temps.
Dans le code ci-dessous, on suppose que tous les gadgets sont déjà sélectionnés. Je clique sur n'importe quel gadget et je le déplace (cliquer-glisser) n'importe où sur la fenêtre. J'aimerais que les deux autres gadgets suivent le mouvement. Si je déplace l'un des gadgets de 10 pixels à droite et de 5 pixels en bas, j'aimerais que les deux autres se déplacent en même temps de 10 pixels à droite et de 5 pixels en bas.

Une idée ?

Code : Tout sélectionner

Structure Selected
  id.l
  hwd.l
  x.l
  y.l
  w.l
  h.l
  selected.b
EndStructure

Global NewList gadgetsSelected.Selected()

Procedure addgadget(id)
  AddElement(gadgetsSelected())
  gadgetsSelected()\hwd=GadgetID(id)
  gadgetsSelected()\id=id
  gadgetsSelected()\x=GadgetX(id)
  gadgetsSelected()\y=GadgetY(id)
  gadgetsSelected()\w=GadgetWidth(id)
  gadgetsSelected()\h=GadgetHeight(id)
  gadgetsSelected()\selected=#True
EndProcedure

OpenWindow(0, 0, 0, 600, 600, "Déplacer tous les boutons en même temps", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Gadg1 =ButtonGadget(1, 0, 0, 200, 40,"B1")
Gadg2 =ButtonGadget(2, 0, 50, 200, 40,"B2")
Gadg3 =ButtonGadget(3, 0, 100, 200, 40,"B3")

addgadget(1)
addgadget(2)
addgadget(3)

ForEach gadgetsSelected()
  Debug "-------------------------"
  Debug gadgetsSelected()\hwd
  Debug gadgetsSelected()\id
  Debug gadgetsSelected()\x
  Debug gadgetsSelected()\y
  Debug gadgetsSelected()\w
  Debug gadgetsSelected()\h
  Debug gadgetsSelected()\selected
Next

Repeat
  eventID = WaitWindowEvent()
  Select eventID
    Case #WM_LBUTTONDOWN
      ;wParam:Indicates whether various virtual keys are down. ctrl, shift rbutton, mbutton
      ;lParam:coordonnate x,y
      ;lParam:The low-order word specifies the x-coordinate of the cursor. 
      ;       The high-order word specifies the y-coordinate of the cursor. 
      ;       The coordinates are relative to the upper-left corner of the client area.
      
      If EventwParam() & #MK_LBUTTON
        Debug "----------"
        ; Affiche le wParam : 1=#MK_LBUTTON=bouton gauche souris enfoncé
        Debug EventwParam()
        ;Distance en x à l'intérieur du gadget
        Debug EventlParam() & $FFFF ;x
        ;Distance en y à l'intérieur du gadget
        Debug  (EventlParam()>>16) & $FFFF
      EndIf
      
      ;hwd=WindowFromPoint_(DesktopMouseX() + DesktopMouseY() <<32)
      hwd=ChildWindowFromPoint_(WindowID(0),WindowMouseX(0) + WindowMouseY(0) <<32)
      
      Select hwd
          
        Case  GadgetID(1)
          ReleaseCapture_() 
          SendMessage_(GadgetID(1), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) 
        Case  GadgetID(2)
          ReleaseCapture_() 
          SendMessage_(GadgetID(2), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) 
        Case  GadgetID(3)
          ReleaseCapture_() 
          SendMessage_(GadgetID(3), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) 
      EndSelect
  EndSelect
  
  
Until eventID = #PB_Event_CloseWindow

M.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Déplacer plusieurs gadgets en même temps

Message par PAPIPP »

Bonjour Mesa

Avec containergadget comme cela en cliquant dans la zone du containergadget on peut déplacer l'ensemble des gadgets

Code : Tout sélectionner

Structure Selected
  id.l
  hwd.l
  x.l
  y.l
  w.l
  h.l
  selected.b
EndStructure

Global NewList gadgetsSelected.Selected()

Procedure addgadget(id)
  AddElement(gadgetsSelected())
  gadgetsSelected()\hwd=GadgetID(id)
  gadgetsSelected()\id=id
  gadgetsSelected()\x=GadgetX(id)
  gadgetsSelected()\y=GadgetY(id)
  gadgetsSelected()\w=GadgetWidth(id)
  gadgetsSelected()\h=GadgetHeight(id)
  gadgetsSelected()\selected=#True
EndProcedure

OpenWindow(0,0,0,600,600,"Déplacer tous les boutons en même temps",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ContainerGadget(0, 0, 0, 200, 220 )
Gadg1=ButtonGadget(1,0,0,200,40,"B1")
Gadg2=ButtonGadget(2,0,50,200,40,"B2")
Gadg3=ButtonGadget(3,0,100,200,40,"B3")

addgadget(1)
addgadget(2)
addgadget(3)

ForEach gadgetsSelected()
  Debug "-------------------------"
  Debug gadgetsSelected()\hwd
  Debug gadgetsSelected()\id
  Debug gadgetsSelected()\x
  Debug gadgetsSelected()\y
  Debug gadgetsSelected()\w
  Debug gadgetsSelected()\h
  Debug gadgetsSelected()\selected
Next

Repeat
  eventID=WaitWindowEvent()
  Select eventID
    Case #WM_LBUTTONDOWN
      ;wParam:Indicates whether various virtual keys are down. ctrl, shift rbutton, mbutton
      ;lParam:coordonnate x,y
      ;lParam:The low-order word specifies the x-coordinate of the cursor.
      ;       The high-order word specifies the y-coordinate of the cursor.
      ;       The coordinates are relative to the upper-left corner of the client area.
      
      If EventwParam() & #MK_LBUTTON
        Debug "----------"
        ; Affiche le wParam : 1=#MK_LBUTTON=bouton gauche souris enfoncé
        Debug EventwParam()
        ;Distance en x à l'intérieur du gadget
        Debug EventlParam() & $FFFF ;x
        ;Distance en y à l'intérieur du gadget
        Debug (EventlParam()>>16) & $FFFF
      EndIf
      
      ;hwd=WindowFromPoint_(DesktopMouseX() + DesktopMouseY() <<32)
      hwd=ChildWindowFromPoint_(WindowID(0),WindowMouseX(0)+WindowMouseY(0)<<32)
      
      Select hwd
        Case GadgetID(0)
          ReleaseCapture_()
          SendMessage_(GadgetID(0),#WM_NCLBUTTONDOWN,#HTCAPTION,0)

        Case GadgetID(1)
          ReleaseCapture_()
          SendMessage_(GadgetID(1),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
        Case GadgetID(2)
          ReleaseCapture_()
          SendMessage_(GadgetID(2),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
        Case GadgetID(3)
          ReleaseCapture_()
          SendMessage_(GadgetID(3),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
      EndSelect
  EndSelect
    
Until eventID=#PB_Event_CloseWindow
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Déplacer plusieurs gadgets en même temps

Message par Mesa »

Merci, mais mes gadgets ne seront pas dans un container au départ et il ne sera pas possible d'en ajouter un en cours de route.

Je pense qu'on peut utiliser la fonction resizegadget().

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

Re: Déplacer plusieurs gadgets en même temps

Message par Mesa »

J'ai trouvé cette solution mais si quelqu'un peut faire mieux, je prends :wink:

Code : Tout sélectionner

Structure Selected
  id.l
  hwd.l
  x.l
  y.l
  w.l
  h.l
  selected.b
EndStructure

Global NewList gadgetsSelected.Selected()
Global x,y

Procedure addgadget(id)
  AddElement(gadgetsSelected())
  gadgetsSelected()\hwd=GadgetID(id)
  gadgetsSelected()\id=id
  gadgetsSelected()\x=GadgetX(id)
  gadgetsSelected()\y=GadgetY(id)
  gadgetsSelected()\w=GadgetWidth(id)
  gadgetsSelected()\h=GadgetHeight(id)
  gadgetsSelected()\selected=#True
EndProcedure
Procedure movegadgets(id,xi,yi)
  ReleaseCapture_() 
  SendMessage_(GadgetID(id), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
  
  ForEach gadgetsSelected()
    If gadgetsSelected()\selected=#True
      deltax=GadgetX(id)-xi
      deltay=GadgetY(id)-yi
      gadgetsSelected()\x=gadgetsSelected()\x+deltax
      gadgetsSelected()\y=gadgetsSelected()\y+deltay
      ResizeGadget(gadgetsSelected()\id,gadgetsSelected()\x,gadgetsSelected()\y,#PB_Ignore, #PB_Ignore)

    EndIf  
  Next
  
EndProcedure

OpenWindow(0, 0, 0, 600, 600, "Déplacer tous les boutons en même temps", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Gadg1 =ButtonGadget(1, 50, 0, 100, 40,"B1")
Gadg2 =ButtonGadget(2, 0, 50, 200, 40,"B2")
Gadg3 =ButtonGadget(3, 100, 100, 60, 40,"B3")

addgadget(1)
addgadget(2)
addgadget(3)

Repeat
  eventID = WaitWindowEvent()
  Select eventID
        
    Case #WM_LBUTTONDOWN
         hwd=ChildWindowFromPoint_(WindowID(0),WindowMouseX(0) + WindowMouseY(0) <<32)
      ForEach gadgetsSelected()
        If gadgetsSelected()\hWd = hWd
          SetCursor_(LoadCursor_(0,#IDC_SIZEALL))
          Break
        EndIf
      Next
      
      xi=GadgetX(gadgetsSelected()\id)
      yi=GadgetY(gadgetsSelected()\id)

      
      If EventwParam() & #MK_LBUTTON
         hwd=ChildWindowFromPoint_(WindowID(0),WindowMouseX(0) + WindowMouseY(0) <<32)
        
        Select hwd
            
          Case  GadgetID(1)
            movegadgets(1,xi,yi)
            
          Case  GadgetID(2)
            movegadgets(2,xi,yi)
            
          Case  GadgetID(3)
            movegadgets(3,xi,yi)
            
        EndSelect
  
      EndIf
  EndSelect
  
  
Until eventID = #PB_Event_CloseWindow

M.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Déplacer plusieurs gadgets en même temps

Message par Ar-S »

Salut Mesa, c'est déjà bien comme ça.
Peut-être qu'en threadant le déplacement des boutons enfants ou en utilisant un timer ce serait plus choupinou. (les autres gadgets se déplaceraient en temps "presque" réel.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Déplacer plusieurs gadgets en même temps

Message par majikeyric »

Ar-S a écrit :Peut-être qu'en threadant le déplacement des boutons...
J'ai découvert une nouvelle expression; merci Ar-S :D
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Déplacer plusieurs gadgets en même temps

Message par falsam »

J'ai cette proposition de code à te faire

Code : Tout sélectionner

Structure Selected
  id.l
  hwd.l
  x.l
  y.l
  w.l
  h.l
  selected.b
EndStructure

Global NewList gadgetsSelected.Selected()
Global MouseX, MouseY, SelectGadget.b, SelectAtX, SelectAtY

Procedure addgadget(id)
  AddElement(gadgetsSelected())
  gadgetsSelected()\hwd=GadgetID(id)
  gadgetsSelected()\id=id
  gadgetsSelected()\x=GadgetX(id)
  gadgetsSelected()\y=GadgetY(id)
  gadgetsSelected()\w=GadgetWidth(id)
  gadgetsSelected()\h=GadgetHeight(id)
  gadgetsSelected()\selected=#True
EndProcedure

Procedure IsGadgetSelect(CurrentHwd)  
  ForEach gadgetsSelected()
    With gadgetsSelected()
      If \hwd = CurrentHwd
        
        ;Un gadget est sélectionné
        SelectGadget = #True
        
        ;Mémorisation du point (x,y) de sélection initial
        SelectAtX = MouseX 
        SelectAtY = MouseY
       
        Break
      Else
        SelectGadget = #False
      EndIf    
    EndWith
  Next
EndProcedure

OpenWindow(0, 0, 0, 600, 600, "Déplacer tous les boutons en même temps", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

;La série de GadgX ne sert pas à grand chose

Gadg1 =ButtonGadget(1, 0, 0, 200, 40,"B1")
Gadg2 =ButtonGadget(2, 100, 50, 200, 40,"B2")
Gadg3 =ButtonGadget(3, 50, 100, 200, 40,"B3")
TextGadget(4, 20, 150, 100, 22, "Juste pour voir")

addgadget(1)
addgadget(2)
addgadget(3)
addgadget(4)

ForEach gadgetsSelected()
  Debug "-------------------------"
  Debug gadgetsSelected()\hwd
  Debug gadgetsSelected()\id
  Debug gadgetsSelected()\x
  Debug gadgetsSelected()\y
  Debug gadgetsSelected()\w
  Debug gadgetsSelected()\h
  Debug gadgetsSelected()\selected
Next

Repeat
  
  MouseX = WindowMouseX(0)
  MouseY = WindowMouseY(0)
  
  Select WaitWindowEvent()  
    Case #WM_MOUSEMOVE
      If SelectGadget = #True
        ForEach gadgetsSelected()
          With gadgetsSelected()
            If \selected = #True
              ResizeGadget(\id, \x + (MouseX-SelectAtX) , \y + (MouseY-SelectAtY), #PB_Ignore, #PB_Ignore)
            EndIf
          EndWith 
        Next
      EndIf
      
    Case #WM_LBUTTONDOWN
      hwd=ChildWindowFromPoint_(WindowID(0),WindowMouseX(0) + WindowMouseY(0) <<32)
      IsGadgetSelect(hwd)
      
    Case #WM_LBUTTONUP
      ForEach gadgetsSelected()
        With gadgetsSelected()
          \x = GadgetX(\id)
          \y = GadgetY(\id)
        EndWith
      Next
      SelectGadget=#False
       
    Case #PB_Event_CloseWindow
      Break
          
  EndSelect
ForEver
Un designer ? :mrgreen:
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%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Déplacer plusieurs gadgets en même temps

Message par falsam »

Mesa a écrit :mes gadgets ne seront pas dans un container au départ et il ne sera pas possible d'en ajouter un en cours de route.
Mais si c'est possible en ouvrant de nouveau le container puis de mettre en place le nouveau gadget et enfin refermer le container.

Un petit exemple :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 322, 150, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
    ButtonGadget(1, 10, 15, 80, 24, "Button 1")
    ButtonGadget(2, 95, 15, 80, 24, "Button 2")
  CloseGadgetList()
  
  OpenGadgetList(0) ;0 est le container. Pas la fenêtre.
  ButtonGadget(3, 10, 45, 80, 24, "Button 3")
  CloseGadgetList()
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow  
EndIf
Ceci est valable aussi pour le PanelGadget() et le ScrollAreaGadget()
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%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Déplacer plusieurs gadgets en même temps

Message par Mesa »

Merci, ça va bien m'aider pour mon clone de KODA Form Designer pour purebasic.
http://www.koda.darkhost.ru
Image

Il sera adapté à PureBasic, notamment pour l'utilisation de la bibliothèque Dialog.

Est-ce que ça intéresse des purebasiciens de participer à ce projet ?
Dans ce cas, la semaine prochaine, je publierai tous ce que j'ai déjà fait (pas grand choses en fait, déplacement et redimensionnement des gadgets à la volée , sélection de plusieurs gadgets et leur déplacement et pour Windows seulement, pour l'instant).
Il y en aura pour tous les niveaux, du débutant au crack des apis.

M.
Répondre