[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

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

Message par Patrick88 »

déterreur de post, bonjour... :lol:

y'a une autre méthode pour retrouver les gadgets sans passer par les api.
il faut stocker dans une table les coordonnées,dimensions,type des objets

structure objet_graphique
cx.l : cy.l : largeur.l : hauteur.l
type.l ; = #PB_GadgetType_*
endstructure

faire une routine d'insertion de gadget qui remplit la structure

dans la boucle des événements
au moment du clique regarder la position du curseur par rapport à tout les objets dans la table
affiner la recherche au plus près (distance la plus courte entre curseur/centre-objet)
pour rejetter les objet du type container, scrollarea, onglet
peut etre voir une routine qui écarte les objets trop loin du curseur (distance curseur /centre-objet)
distance pouvant être "adaptée" au besoin.

vala,

foyeuses jêtes à tousse

pét.. euh pat :mrgreen:
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

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

Message par Patrick88 »

en gros je vois ça comme ça...
à approfondir, je n'ai pas traité les gadgets inclus dans un container ou un panel...
bon, c'est pas tout ça, j'ai des monstres à tuer moi monsieur... :mrgreen:

Code : Tout sélectionner

;{ constantes
Enumeration
	#FEN_MAIN
EndEnumeration

Enumeration 1
	#GDT_PgnG
	#GDT_PgnD
	#GDT_PgnH
	#GDT_PgnB
;----------------

EndEnumeration

#GDT_PoigneeTaille = 6
#GDT_PoigneeCouleur = $0000ff
#GDT_PoigneeCache = 1
#GDT_PoigneeMontre = 0

#WindowWidth  = 390
#WindowHeight = 350

;}
;{ structures
Structure objet_graphique
  x.l ; coordonnées d'insertion
  y.l
  cx.l ; centre du gadget
  cy.l 
  largeur.l 
  hauteur.l
  
  text.s 
  type.l ; = #PB_GadgetType_*
  handle.l ; obtenu par #pb_any
  
	group_id.l ; permet de connaitre l'id du "groupe" container / panel / scrollarea ...
	group_num.l ; pour le panel, de quelle "page", il dépend
	group_type.l ; renvoie #PB_GadgetType_Panel ,#PB_GadgetType_Container	, #PB_GadgetType_ScrollArea
EndStructure
;}
;{ variables
Global NewList lstObjet.objet_graphique()

Global Dim GROUPE_ACTIF.l(1) ; 0=groupe_id / 1=groupe_type

Global NUMERO_PANEL_ACTIF.l ; group_num
Global mx.l,my.l 

;--- initialisation des variables

GROUPE_ACTIF(0)=-1 : GROUPE_ACTIF(1)=-1 ; 0=groupe_id / 1=groupe_type
NUMERO_PANEL_ACTIF=-1 ; group_num

;}

; dans la boucle des événements
; au moment du clique regarder la position du curseur par rapport à tout les objets dans la table
; affiner la recherche au plus près (distance la plus courte entre curseur/centre-objet)
; pour rejeter les objet du type container, scrollarea, onglet
; peut être voir une routine qui écarte les objets trop loin du curseur (distance curseur /centre-objet)
; distance pouvant être "adaptée" au besoin.
Procedure CurseurInfo(px.l,py.l)
Debug "X: "+Str(px)+" - Y: "+Str(py)
EndProcedure

Procedure.l AjouteGadget(phandle.l) ;,ptype.l,px.l,py.l,plargeur.l,phauteur.l)
  AddElement(lstObjet())
  
  With lstObjet()
    \x        = GadgetX(phandle)
    \y        = GadgetY(phandle)    
    \largeur  = GadgetWidth(phandle)
    \hauteur  = GadgetHeight(phandle)
    
    \cx       = \x+(\largeur/2)
    \cy       = \y+(\hauteur/2)
    
    \text     = GetGadgetText(phandle)
    
    \type     = GadgetType(phandle)
    \handle   = phandle
    
  	\group_id   = GROUPE_ACTIF(0)
  	\group_num  = NUMERO_PANEL_ACTIF
  	\group_type = GROUPE_ACTIF(1)  	
  EndWith
  ProcedureReturn phandle
EndProcedure

; Distance entre deux points
Procedure.f Distance(x1.l,y1.l,x2.l,y2.l)
; (x1|y1) = coordonnées XY du point n°1 
; (x2|y2) = coordonnées XY du point n°2 
ProcedureReturn Sqr(Pow(x1-x2,2) + Pow(y1-y2,2)) 
EndProcedure

Procedure.s ChercheGadget(px.l,py.l) ;=coordonnées du curseur souris
  Protected cdistance_centre.f,cdistance_xy.f ; c comme courant
  Protected sdistance_centre.f,sdistance_xy.f ; s comme sauver
  Protected flag.b=1 ; sert à initialiser le bazar
  Protected numero_objet = -1, text.s
  
  Debug "begin-----------------------"
  ForEach lstObjet()
    cdistance_centre = Distance(lstObjet()\cx,lstObjet()\cy,px,py)
    cdistance_xy     = Distance(lstObjet()\x,lstObjet()\y,px,py)
    If flag = 1
      sdistance_centre=cdistance_centre
      sdistance_xy=cdistance_xy
      flag = 0
    EndIf
    ; si distance_centre est inférieur à la derniere distance stockée alors elle devient la distance courante
     
    If cdistance_centre < sdistance_centre And cdistance_xy < sdistance_xy
        sdistance_centre=cdistance_centre
        sdistance_xy=cdistance_xy
        numero_objet = ListIndex(lstObjet())
        text = lstObjet()\text
    EndIf
    
    Debug "du curseur au centre = "+StrF(cdistance_centre,2)+" au coin haut gauche = "+StrF(cdistance_xy,2)
;         X: 386 - Y: 133
;     du curseur au centre = 192.26 au coin haut gauche = 395.61
;     du curseur au centre = 281.14 au coin haut gauche = 380.22
;     du curseur au centre = 156.24 au coin haut gauche = 192.82
;     du curseur au centre = 106.33 au coin haut gauche = 137.44
;     du curseur au centre = 200.88 au coin haut gauche = 372.26
;     du curseur au centre = 320.32 au coin haut gauche = 419.93
;     du curseur au centre = 200.96 au coin haut gauche = 204.88

  Next
  Debug "end----------------------"
  Debug "du curseur au centre = "+StrF(sdistance_centre,2)+" au coin haut gauche = "+StrF(sdistance_xy,2)
  ProcedureReturn text ;numero_objet
EndProcedure

Procedure Execute_FEN_MAIN()

If OpenWindow(#FEN_MAIN, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
 
 ;{ création des gadgets
 
  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)
	
  Top = 10
  GadgetHeight = 24
  
  AjouteGadget(Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...")): Top+20

  AjouteGadget(StringGadget(#PB_Any,  20, Top, 200, GadgetHeight, ""))
  AjouteGadget(ButtonGadget(#PB_Any, 223, Top,  72, GadgetHeight, "Play"))
  AjouteGadget(ButtonGadget(#PB_Any, 295, Top,  72, GadgetHeight, "Stop"))  : Top+35
  ;DisableGadget(2,1)
  
  ;GadgetToolTip(1,"Play the current song")


  GROUPE_ACTIF(0) = AjouteGadget(PanelGadget(#PB_Any, 20, Top, #WindowWidth-50, #WindowHeight-Top-60))
  GROUPE_ACTIF(1) = #PB_GadgetType_Panel
  
;     AddGadgetItem(3, 0, "MP3 PlayList")
;       ListViewGadget(4, 6, 10, 230, 148)
; 
;       For k=0 To 30
;         AddGadgetItem(4, -1, "Music Song n° "+Str(k))
;       Next
; 
;       ButtonGadget(5,  250, 10, 80, GadgetHeight, "Add")
;       ButtonGadget(6,  250, 38, 80, GadgetHeight, "Remove")
;       ButtonGadget(7,  250, 66, 80, GadgetHeight, "Select")
;       GadgetToolTip(7, "Select the current song")
;       
;       TrackBarGadget(17, 10, 168, 310, 25, 0, 100)
; 
;     AddGadgetItem(3, 1, "Options")
;       Top = 10
;       CheckBoxGadget(10, 10, Top, 250, GadgetHeight, "Enable low-pass filter") : Top+30
;       CheckBoxGadget(11, 10, Top, 250, GadgetHeight, "Enable visual plug-in")  : Top+30
;       ComboBoxGadget(12, 10, Top, 250, 21) : Top+30
;         AddGadgetItem(12, -1, "FireWorks")
;         AddGadgetItem(12, -1, "OpenGL spectrum")
;         AddGadgetItem(12, -1, "Bump bass")
;       SetGadgetState(12,0)
;       DisableGadget(12,1)
;       
;       OptionGadget(13, 10, Top, 80, GadgetHeight, "640*480") : Top+20
;       OptionGadget(14, 10, Top, 80, GadgetHeight, "800*600") : Top+20
;       OptionGadget(15, 10, Top, 80, GadgetHeight, "1024*768")
;       SetGadgetState(13, 1)
;       
;       ButtonGadget(16, 150, Top, 80, GadgetHeight, "Info")
  CloseGadgetList()
  
  GROUPE_ACTIF(0) = -1 : GROUPE_ACTIF(1) = -1

  AjouteGadget(TextGadget  (#PB_Any, 10, #WindowHeight-30, 250, 24, "PureBasic - Gadget demonstration"))
  
  AjouteGadget(ButtonGadget(#PB_Any, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit"))

  ;SetGadgetState(3, 0)
;}

  Repeat
    EventID = WaitWindowEvent()
    mx = WindowMouseX(#FEN_MAIN) : my = WindowMouseY(#FEN_MAIN) : 
    
    Select EventID
      Case #WM_MOUSEMOVE
        CurseurInfo(mx,my)
        Debug ChercheGadget(mx,my)
        
    EndSelect

  Until EventID = #PB_Event_CloseWindow

EndIf
EndProcedure

Execute_FEN_MAIN()
End 
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 »

Salut PATRIC88 :D

Content de te reparler
N'empeche que ton code y m'avait plus en ce temps, alors j'ai pris la pelle .... :lol:
Merci pour ton explication, pas mal l'idée des tableaux aussi :roll:

Bon j'suis allé faire une petite trempete dans la mer pour parler un peu americain et le gentil ARTIC FOX, y' m'a dépétré tout ça.
Il m'a donné encore mieux que sa premiere combine 8)

Alors je l'ai mis dans un sac plastique...et j'ai retraversé la mer pour vous la ramener, on sait jamais ça peut servir :roll:

Bon c'est un peu le WAï car tout le monde y rajoute sa glute...mais ça marche, reste plus qu'a nettoyer les carreaux et mettre un coup de balai 8)
Voila encore merci de ton code qui m'a drolement servi pour le depart....la route est encore longue, mais c'est un bon debut 8)
Et ça m'a fait plaisir de te reparler 8)

Code : Tout sélectionner

; Codé par Patrick88 modifié par ArticFox pour y inserer un ScrollArea

Enumeration
   #FEN_MAIN
EndEnumeration

Enumeration 1
   #GDT_PgnG
   #GDT_PgnD
   #GDT_PgnH
   #GDT_PgnB
   #GadgetArea ;<==== Add by KCC
   #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

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 mpgn.POINT
Global Dim DemoRect.RECT(#PB_Compiler_EnumerationValue)

;...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)
Protected x, y

   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 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2 + y, #PB_Ignore, #PB_Ignore)
     ResizeGadget(#GDT_PgnD,GadgetX(gdt_id)+GadgetWidth(gdt_id)-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2 + y, #PB_Ignore, #PB_Ignore)
     ResizeGadget(#GDT_PgnH,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2 + y, #PB_Ignore, #PB_Ignore)
     ResizeGadget(#GDT_PgnB,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)+GadgetHeight(gdt_id)-#GDT_PoigneeTaille/2 + y, #PB_Ignore, #PB_Ignore)
   
     GetWindowRect_(GadgetID(#GDT_PgnG), @DemoRect(#GDT_PgnG))
     GetWindowRect_(GadgetID(#GDT_PgnD), @DemoRect(#GDT_PgnD))
     GetWindowRect_(GadgetID(#GDT_PgnH), @DemoRect(#GDT_PgnH))
     GetWindowRect_(GadgetID(#GDT_PgnB), @DemoRect(#GDT_PgnB))
   EndIf
EndProcedure


If OpenWindow(#FEN_MAIN, 0, 0, 500, 500, "Visual PB Zoub", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ScrollAreaGadget(#GadgetArea, 0, 0, WindowWidth(#FEN_MAIN), WindowHeight(#FEN_MAIN), 10000, 10000)  ;<==== Add by KCC
OpenGadgetList(#GadgetArea) ;<==== Add by KCC
  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)
   TextGadget(#GDT_DEMO2,5,4,80,16,"Déplace moi")
   StringGadget(#GDT_DEMO3,90,2,100,20,"Déplace moi")
   CloseGadgetList()
   ListIconGadget(#GDT_DEMO4,150,10,100,100,"Déplace moi",100)
   
   GetWindowRect_(GadgetID(#GDT_DEMO2), @DemoRect(#GDT_DEMO2))
   GetWindowRect_(GadgetID(#GDT_DEMO3), @DemoRect(#GDT_DEMO3))
   GetWindowRect_(GadgetID(#GDT_DEMO4), @DemoRect(#GDT_DEMO4))
   GetWindowRect_(GadgetID(#GDT_PgnG), @DemoRect(#GDT_PgnG))
   GetWindowRect_(GadgetID(#GDT_PgnD), @DemoRect(#GDT_PgnD))
   GetWindowRect_(GadgetID(#GDT_PgnH), @DemoRect(#GDT_PgnH))
   GetWindowRect_(GadgetID(#GDT_PgnB), @DemoRect(#GDT_PgnB))

   
   deltax = -2: deltay = -2
   
  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           
           
           If gdt_id > #GDT_USER_GADGET And gdt_id < #GDT_LAST_USER_GADGET
       
              GetWindowRect_(GadgetID(#GDT_DEMO2), @DemoRect(#GDT_DEMO2))
              GetWindowRect_(GadgetID(#GDT_DEMO3), @DemoRect(#GDT_DEMO3))
              GetWindowRect_(GadgetID(#GDT_DEMO4), @DemoRect(#GDT_DEMO4))
           EndIf
           
        Else
          GetCursorPos_(@mpgn)
          gdt_pgn_id = -1

          If PtInRect_(@DemoRect(#GDT_DEMO4), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO4 : EndIf
          If PtInRect_(@DemoRect(#GDT_DEMO1), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO1 : EndIf
          If PtInRect_(@DemoRect(#GDT_DEMO2), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO2 : EndIf
          If PtInRect_(@DemoRect(#GDT_DEMO3), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO3 : EndIf
          If PtInRect_(@DemoRect(#GDT_PgnG), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnG : EndIf
          If PtInRect_(@DemoRect(#GDT_PgnD), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnD : EndIf
          If PtInRect_(@DemoRect(#GDT_PgnH), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnH : EndIf
          If PtInRect_(@DemoRect(#GDT_PgnB), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnB : EndIf
         
         Select gdt_pgn_id
            Case #GDT_DEMO1 To #GDT_DEMO4
                gdt_id = gdt_pgn_id
                Poignee_cache(#GDT_PoigneeMontre,gdt_id)
                SetCursor_(cursorSIZE)
         
            Case #GDT_PgnG, #GDT_PgnD
                SetCursor_(cursorWE)
                
            Case #GDT_PgnH, #GDT_PgnB
                SetCursor_(cursorNS)
                
            Default
                Poignee_cache(#GDT_PoigneeCache,0)
         
         EndSelect
           ;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
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,

Il est évident que l'on peux se passer de systèmes complexe pour créer et forcément déplacer la position
des TextGadget(..)ou InputGadget(..) voir tout autre gadget...
Il suffit pour cela de disposer soit comme Pat via une structure...

OU comme dans l'exemple ci-dessous que je joins en Demo ou tout les TextGadget(..), InputGadget(..)
sont crée automatiquement à partir d'un tableau ou sont rangés les paramètres utiles à créer les gadgets
de l'exemple !

Forcément ce système et avec la simple détection de la position de la souris en concordance avec le TexteGadget ou autre et un ou deux "Click" pour mémoriser le Gadget concerné puis le Click suivant pour déterminer sa destination va déplacer le gadget ou il sera "déposé"...
De la même manière on peux extrapoler et dire que toute une fenêtre peut être composée de la sorte et rangé dans un tableau de paramètres, rangé sur disque. Puis lue par une application (comme ci-dessous) qui exploiterait les paramètres... Cela revient à créer un "VisualDesigner" qui ne produirait pas du code, mais des tableaux de paramètres qui à leurs tour sont lus et exploités par un lecteur de paramètres... cela donne ce qui est ci-dessous !

Code : Tout sélectionner

;==================================================================== 
;  -       Saisie  dans  "Fentre Préparamétrée"    -                         PureBasic Version 4.31 & 4.40
;                                                                                                                    28-08-2009
;           OU Fenetre à champs variable...                      
;                                                                                                                      GeBonet    
;==================================================================== 
;   Le BUT ici est de disposer d'un moyen d'appeler une fenêtre qui se dimensionne SEULE 
;   en fonction dunombre d'éléments demandé... 
;
;   Et évidement qui renvois les réponses correspondantes aux points envoyés. 
; 
;    Pour lequel on donne : Un titre, une position d'affichage (x,y) la table de question, la tabe
;                                         pour les réponses et le nombre de point à montrer et à remplir.... 
; 
; SOIT comme ci-après => PointFenetre(NomEntete$ ,IniX ,IniY , Array Text.s(1), Array Rep.s(1), A_Remplir)  
;   
;   On pourrait y ajouter des exigeances comme demander la couleur de fond, des caractères, la police 
;   ou encore le type à saisir (Alpha ou Numérique, voir réponse visible ou non (mots de passe)...  
; 
;==================================================================== 
;   Mais l'intérêt PRINCIPAL ICI est de montrer l'aspect dynamique des affectation de Gadget !!! 
;   ---------============================================================== 
;   AUSSI avec l'utilisation exclusive d'instructions PureBasic... 
;==================================================================== 
;
Enumeration 
    #Fenetre_Champ       ; Constante de la fenêtre qui sera utilisé...
    #DebutChamps          ; Constante de Base pour le 1er Gadget d'affichage de la table des questions. 
    ;                                     CETTE CONSTANTE SERVIRA de BASE d'incrémentation pour fournir 
    ;                                     le n° unique des questions suivantes s'il y a lieu.
    ; 
    #Fichier=10               ; N° du premier Fichier                 
    ; 
    #AutrePoint=50         ; Constante de départ d'un AUTRE POINT de constante dynamique !!!
    ;  ***************************************************************************************
    ;#bouton_valide  ; Ne serons pas utilisé comme tels car comme les gadgets suivants seront affectés 
    ;#bouton_annule ; dynamiquement ils risquent alors de prendre une valeur de constante existante et 
                                ; donc de ne pas être affiché... d'ou !!! 
                                ;
                                ;  LA REGLE :    Lorsque l'on attribue des ID de gadget dynamiquement ils doivent   
                                ;   commencer à un point connu (ici "#DebutChamps") puis rester sous contrôle du 
                                ;   programme jusqu'a l'autre Constante identifié qui servirait de départ d'un autre point.
                                ;   Comme par exemple ICI : "#AutrePoint"
                                ;  -----------------------------------------------------------------------------------------------------------------
    #bouton_valide =70 ;   Ou alors une Affectation qui dans ce cas ci ne risque pas d'entrer en contact d'autres...
    #bouton_annule=71 ;   Idem ...
                                      ;   
EndEnumeration      
;
Define Nombre.i, IniX.i, IniY.i, Appel
Nombre=12                                                     ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...
Dim progParametreFichier.s(Nombre,3)       ; Table Texte des Questions=0, Type de saisie=1, Longueur de la saisie=2...  
Dim progReponse.s(Nombre)                     	; Table des Réponses correspondante 
Dim progParametreAffichage.i(Nombre,3)     ; Table d'affichage des données X,Y, CouleurFond,CouleurText
;
;------------------------------------------------------------------------------------------
Declare PointFenetre(NomEntete$, IniX , IniY , Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)  
Declare OuvreEtRange(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre) 
;
;------ Debut Programme ou d'endrit ou srea traité le Tableau Text(i) et les Recoir les réponses progReponse(i) >-----------------
;
; - ;  ------------ Question ? ----------- <  On pourrait aussi avec d'autres dimensions...    > -----------
    ;                         Dim 1= Libélé                                                            Dim 2 = Type de donnée                  
    progParametreFichier(0,0) = "Nom prenom"          :progParametreFichier(0,1) = "0"   ;    Type de donnée saisie 
    progParametreFichier(1,0) = "Adresse +N°"        :progParametreFichier(1,1) = "0"   ;  -----------------------------
    progParametreFichier(2,0) = "Code Postal"        :progParametreFichier(2,1) = "1"   ;  Type =0  => Alphanumérique
    progParametreFichier(3,0) = "Localitée "          :progParametreFichier(3,1) = "0"   ;  Type =1  => Numérique ENTIER Long
    progParametreFichier(4,0) = "Pays"                      :progParametreFichier(4,1) = "0"   ;  Type =2  => Numérique Quad 
    progParametreFichier(5,0) = "Telephone"            :progParametreFichier(5,1) = "0"   ;  Type =3  => Numérique Double/Flottant 
    progParametreFichier(6,0)  = "Adresse Email"   :progParametreFichier(6,1) = "0"    ;  Type =4  => PassWord 
	;
	progParametreFichier(7,0)  = "Entree Mensuel"	:progParametreFichier(7,1) = "0"    ;  Type =4  => PassWord 
	progParametreFichier(8,0)  = "Sortie Mensuel"	:progParametreFichier(8,1) = "0"    ;  Type =4  => PassWord 
	progParametreFichier(9,0)  = "Solde Mensuel" 	:progParametreFichier(9,1) = "0"    ;  Type =4  => PassWord 
	;
	progParametreFichier(10,0)  = "Entree Annuel":progParametreFichier(10,1) = "0"    ;  Type =4  => PassWord 
	progParametreFichier(11,0)  = "Sortie Annuel":progParametreFichier(11,1) = "0"    ;  Type =4  => PassWord 
	progParametreFichier(12,0)  = "Solde Annuel"  :progParametreFichier(12,1) = "0"    ;  Type =4  => PassWord 
	;                                Dim 3= Longueur du champ de saisie voir rangement  Dim 4 = 
    progParametreFichier(0,2)="30":progParametreFichier(1,2)="35":progParametreFichier(2,2)="8":progParametreFichier(3,2)="30"
    progParametreFichier(4,2)="30":progParametreFichier(5,2)="16":progParametreFichier(6,2)="40"
	progParametreFichier(7,2)="8":progParametreFichier(8,2)="8":progParametreFichier(9,2)="8"
	progParametreFichier(10,2)="8":progParametreFichier(11,2)="8":progParametreFichier(12,2)="8"
	;
    ;  ---------------------------------------------------------------------------------------------------------------
    For i=0 To Nombre:progReponse(i) = "":Next i  ; Mise à zéro de la table des réponses..
    ;  ---------------------------------------------------------------------------------------------------------------
	;
    NomEntete$="Identification"                    ; Titre de la fenetre     
    IniX=400:IniY=200                                    ; Position sur l'écran  
    Appel=12                                                  ; Nombre d'élément du tableau à utiliser...  
    If Appel>Nombre:Appel=Nombre:EndIf  ; Je m'auto-contrôle ne peut-être plus grand que le nombre d'éléments du tableau :-))
    ;  ---------------------------------------------------------------------------------------------------------------
    Resultat=PointFenetre(NomEntete$, IniX ,IniY, progParametreFichier.s() , progReponse() , Appel)  ; Appel de la procèdure....  
    ;
    Debug "Retour Procedure : "+Str(Resultat)
    ;  ---------------------------------------------------------------------------------------------------------------
    Espace$=""
    For i=0 To Nombre
        progLongueur=Val(progParametreFichier(i,2))
        Espace$+Left(progParametreFichier(i,0)+Space(progLongueur),progLongueur)
        Debug progParametreFichier(i,0)+" : "+progParametreFichier(i,1)+" : "+progParametreFichier(i,2)+" =>"+progReponse(i)
    Next i  ;                                          Affichage des données saises en fonction de "Appel"
    Debug Espace$            
    ;
    ; A partir d'ici ou ceci progReponse(n) peut être utilisée pour être classé dans liste chainée
    ; ou un Tableau deux dimensions type Table_Adresse(i,n) les progReponse(n) sont les lignes
    ; de Table_Adresse(i,n)... 
    ;
End
;
; *************************************************************************************************************
Procedure OuvreEt_Range(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre) 
   ;
   ; CreateFile(#Fichier, NomFichier$) ATTENTION création si existe.. Perdu !!! 
   ; OpenFile(#Fichier, NomFichier$)           
   ;
EndProcedure
; *************************************************************************************************************
Procedure OuvreEt_Lecture(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre) 
   ;
   ;  OpenFile(#Fichier, NomFichier$)           
   ;
EndProcedure
; **********************************************************************************************
; >>>>>>>>>>                         Fenêtre Commune de question                    <<<<<<<<<<
; **********************************************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre) 
    
    Taille=ArraySize(progParametreFichier())
    For i=0 To Nombre           ; Determination du champs le plus long 
        If Lmax<Len(progParametreFichier(i,0)):Lmax=Len(progParametreFichier(i,0)):EndIf
        If Lmax2<Val(progParametreFichier(i,2)):Lmax2=Val(progParametreFichier(i,2)):EndIf
    Next i
    ;-----------------------------  Calcul des dimensions -------------------------------------
    HauteurBouton    = 20
    Largeur_fenetre  = (160+Lmax+Lmax2)*2+20         ; Largeur de la fenêtre tenant compte des longueur des champs
    Hauteur_Fenetre= Nombre*30+HauteurBouton+50 ; Hauteur de la fenêtre (50 = 30 titre + 20 interligne avant boutons ! )
    PosYBouton       =Hauteur_Fenetre-30                     ; Position Y des boutons
    ;
    ; ---------------------------------------------------------------------------------------------------
    ; 
    WindWid=Largeur_fenetre : WindHigh=Hauteur_Fenetre :  Cas=0  
	#WinOption = #PB_Window_SystemMenu;| #PB_Window_SizeGadget;|#PB_Window_MaximizeGadget
    ;   Fenetre d'interrogation multibox ...
    If OpenWindow(#Fenetre_Champ,IniX,IniY,WindWid,WindHigh,Titre$,#WinOption);#PB_Window_BorderLess
        
        SetWindowColor(#Fenetre_Champ,$0AFAF5)    ; Colorier la fenêtre
        StickyWindow(#Fenetre_Champ, 1):Lentitre=Len(Titre$) 
        ;    
        Milieu=WindWid/2-Lentitre/2         ; Milieu de la Largeur_fenetre            
        PosYDep=35               ; Position départ
        PosY=PosYDep           ; Position Y    
        ; -------------------------------------   Titres ------------------------------------------------
        TextGadget(#DebutChamps,Milieu-(Lentitre)*6, 5, Milieu+50,25,Titre$) ;
        SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 18))
        SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
        SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
        ; ---------------------------------  Question et champs pour réponses --------------
        For j=1 To Nombre
            Texte$=Trim(progParametreFichier(j-1,0)): LenChamp=Val(progParametreFichier(j-1,2))*6
            TextGadget(#DebutChamps+j,10, PosY, Milieu-15,20,Texte$)    ; Attention ici les ID sont attribué dynamiquement ! 
            StringGadget(#AutrePoint+j, Milieu-20, PosY,LenChamp,20,"")   ; Milieu-10 Attention ici les ID sont attribué dynamiquement ! 
            ; 
            SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 12))
            SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
            SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
            PosY+30
        Next j :; SendMessage_(GadgetID(#MyListIcon), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_GRIDLINES, #LVS_EX_GRIDLINES)
        ; -----------------------------------------------------------------------------------------------
        BoutonVal=#AutrePoint+j  ; ICI j'affecte au "Bouton" une ID Dynamique pour l'exemple
        ;
        ButtonGadget(BoutonVal,10,PosYBouton,100,20,"Valider",#PB_Button_Toggle)     
        ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton,100,20,"Annuler",#PB_Button_Toggle)
        ;   Et ICI c'est "#bouton_annule" 
        ; -----------------------------------------------------------------------------------------------    
    EndIf                
;   ********************************************************************************************
    Repeat
        Select WaitWindowEvent (#Fenetre_Champ)       ; Traite les boutons....
             Case #PB_Event_Gadget
                 Select EventGadget ()                                   ; Selectionne en fonction de ....???
                    
                    
                    ; -----------------------------------------------------------------------------------
                    Case BoutonVal                                          ; VALIDE  pour MODIF ou AJOUT 
                        ;
                        For j=1 To Nombre                                 ; Récupère les données dans le tableau 
                            progReponse(j-1)=GetGadgetText (#AutrePoint+j)     
                        Next j       
                        Fermer_window1=1 :Cas=1
                        ; --------------------------------------------------------------------------------  
                    Case #bouton_annule                                   ;BoutonAnul             ; Annule l'entrée
                        Fermer_window1=1 :Cas=9
                        ; --------------------------------------------------------------------------------    
                EndSelect
            Case #PB_Event_CloseWindow                                             
                Fermer_window1=1 :Cas=9
        EndSelect
    Until Fermer_window1=1 
    StickyWindow(#Fenetre_Champ,0)                           ; 
    CloseWindow (#Fenetre_Champ)                             ; Fermeture de la fenêtre ajoute...
    ; ---------------------------------
    ProcedureReturn Cas
    ;
EndProcedure 
Voilà, voilà... s'aider des commentaires... :lol:
Pour jouer... Ligne 51... mettre le "Nombre=7 par exemple ou autre valeur <13 ici ...
nombre max de paramètres du tableau... Qui je le rappelle pourrait être lus sur disque, transmit etc...

PS: ¨Parfait le code amélioré que t'a ramené à la rame :lol:
Attention des détails à régler avec les poignée de redimensionnement
Et c'est presque tout de l'API... :wink:
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 GEBO de ta demo 8)

Mon "pseudo logigramme" simplounet, avance apres 12 heures d'acharnement dont 6 perdues pour rien :oops:
J'ai regardé aujourd'hui, mais y'a pas foule dans les giciels pour logigrammes en freewares, moi j'avais trouvé DIA, mais c'est une galere a mettre en place :(
A croire que tout ceux qui ont besoin de ce genre de giciels, ils ont des sous :lol:

Pour relier les gadgets, j'ai triché j'ai mis des images en forme de fleches :oops:
Je voulais tracer des ligner directement sur la fenetre reliant les gadgets, je crois que j'avais vu ça auparavant sur un code, je verrais si je trouve, ce serait une possibilité qui serais cool :D

Autrement je resterais avec mes fleches images :oops:

Encore merci
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

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

Message par Progi1984 »

Kwai chang caine a écrit :Merci GEBO de ta demo 8)

Mon "pseudo logigramme" simplounet, avance apres 12 heures d'acharnement dont 6 perdues pour rien :oops:
J'ai regardé aujourd'hui, mais y'a pas foule dans les giciels pour logigrammes en freewares, moi j'avais trouvé DIA, mais c'est une galere a mettre en place :(
A croire que tout ceux qui ont besoin de ce genre de giciels, ils ont des sous :lol:

Pour relier les gadgets, j'ai triché j'ai mis des images en forme de fleches :oops:
Je voulais tracer des ligner directement sur la fenetre reliant les gadgets, je crois que j'avais vu ça auparavant sur un code, je verrais si je trouve, ce serait une possibilité qui serais cool :D

Autrement je resterais avec mes fleches images :oops:

Encore merci
Montre où tu en es :)
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

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

Message par poshu »

pour tracer des flèches, pourquoi ne pas utiliser GDI+ ?
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 les copains de vos reponses 8)

@PROGI1984
Bah en fait, j'en suis la
http://www.purebasic.fr/french/viewtopi ... 38#p107438
Je viens aussi d'avoir une idée pour faire mes fleches qui tournent
Si je les met dans l'angle d'un gadget je pourrais profiter de l'angle droit :roll:

@POSHU
Bah, j'ai honte mais DENIS m'a fait la meme proposition.
Il m'a donné noir de conseil, mais c'est une usine a gaz ce truc, et je me sent pas a la hauteur :oops:
J'voudrais juste une fleche simple "Extensible", je sais c'est pas si simple, mais j'esperais ne pas faire appel a des monstres de technologie :(
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre