Page 1 sur 1

Déplacer plusieurs gadgets en même temps

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

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

Publié : jeu. 18/déc./2014 12:43
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+

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

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

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

Publié : jeu. 18/déc./2014 16:04
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.

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

Publié : jeu. 18/déc./2014 16:58
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.

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

Publié : jeu. 18/déc./2014 19:33
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

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

Publié : ven. 19/déc./2014 1:09
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:

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

Publié : ven. 19/déc./2014 23:07
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()

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

Publié : sam. 20/déc./2014 11:35
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.