PureBasic

Forums PureBasic
Nous sommes le Dim 31/Mai/2020 17:16

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 23 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: [exemple] déplacement de gadget avec des poignées
MessagePosté: Jeu 11/Déc/2008 20:18 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1526
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:
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


Dernière édition par Patrick88 le Lun 12/Jan/2009 18:44, édité 4 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Lun 22/Déc/2008 10:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6705
Localisation: Isere
Ouuuuaahh, j'adore ce code 8)
Trop cool, un bon debut pour un futur Visual designer :D

Merci pour ton partage :wink:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 11:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Fév/2008 16:17
Messages: 453
Localisation: Belgique
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:
gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN))) 


De quoi cela peut venir ?
Merci.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 11:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 07/Déc/2004 17:35
Messages: 832
Localisation: France
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:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 18:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Fév/2008 16:17
Messages: 453
Localisation: Belgique
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:
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 18:32 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1526
remplacez le code
Code:
gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))


par

Code:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 18:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Fév/2008 16:17
Messages: 453
Localisation: Belgique
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 19:21 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1526
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 23/Déc/2008 20:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Fév/2008 16:17
Messages: 453
Localisation: Belgique
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Lun 29/Déc/2008 12:50 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1526
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:
#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


Dernière édition par Patrick88 le Mar 30/Déc/2008 16:14, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 30/Déc/2008 12:48 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 16/Juil/2006 21:44
Messages: 201
Patrick88 a écrit:
remplacez le code
Code:
gdt_pgn_id = GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))


par

Code:
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:
GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN), WindowMouseY(#FEN_MAIN)))


par
Code:
GetDlgCtrlID_(ChildWindowFromPoint_(WindowID(#FEN_MAIN), WindowMouseX(#FEN_MAIN)| (WindowMouseY(#FEN_MAIN)<<32)))
[/code]


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 30/Déc/2008 16:12 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1526
ça marche nickel merci

pat


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [exemple] déplacement de gadget avec des poignées
MessagePosté: Mar 29/Déc/2009 18:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6705
Localisation: Isere
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:
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:
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)


_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [exemple] déplacement de gadget avec des poignées
MessagePosté: Mer 30/Déc/2009 0:40 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 29/Fév/2008 16:17
Messages: 453
Localisation: Belgique
Bonjour,
Effectivement c'est ID de ton "ScrollAreaGadget(#GadgetArea,..,..,..,.., 10000, 10000) qui empêche l'identification de la ligne :
Citation:
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+

_________________
Windows 7 et Windows 8.1 [b]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-


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [exemple] déplacement de gadget avec des poignées
MessagePosté: Mer 30/Déc/2009 6:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6705
Localisation: Isere
Merci GEBONET de chercher pour moi 8)
Citation:
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

Citation:
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:
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:
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

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 23 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye