Page 1 sur 1

[resolu] - ContainerGadget event

Publié : mer. 20/mars/2013 16:39
par doudouvs
Salut,

Je n'arrive pas a crée un evenement clique sur un container
Avez vous une solution ?

Code : Tout sélectionner

Enumeration
    #Container_01
    #Button_Menu01
    #Button_Menu02
EndEnumeration


If OpenWindow(0, 0, 0, 600, 600, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(#Button_Menu01,250,WindowHeight(0)-50,150,25,"Send") 
    ContainerGadget(#Container_01, 10, 130, 500, 100, #PB_Container_Flat)
    ButtonGadget(#Button_Menu02,250,50,130,25,"Send") 
    CloseGadgetList()

  Repeat
    Event = WaitWindowEvent()
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
            
          Case #Container_01 
            Debug "Youpieeeeee ca marche"
            
          Case #Button_Menu01 
            Debug "c'est un bouton classic pourquoi tu clique" 
            
          Case #Button_Menu02 
            Debug "Aie !!! loupé - clique sur le container pas sur le bouton"
       
        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow
  
EndIf
  

Re: ContainerGadget event

Publié : mer. 20/mars/2013 17:05
par falsam
je ne me suis pas trop poser de questions sur les évènements liés aux ContainerGadget.
Apparemment Pure Basic ne gére pas les évenements du ContainerGadget.

la solution que je vois est de passer par un callback. Je ne suis pas un spécialiste du callback mais je te propose cette solution.

Code : Tout sélectionner

Enumeration
    #Container_01
    #Button_Menu01
    #Button_Menu02
EndEnumeration

Procedure ContainerCallback(hWnd, uMsg, wParam, lParam)   
  Result = #PB_ProcessPureBasicEvents
  
  If IsGadget(#Container_01)
    If hWnd = GadgetID(#Container_01) 
      Select uMsg    
        Case #WM_LBUTTONUP
          Debug "#WM_LBUTTONUP"
        
        Case #WM_LBUTTONDOWN
          Debug "#WM_LBUTTONDOWN" 
                    
      EndSelect  
    EndIf
  EndIf
 
  ProcedureReturn Result
EndProcedure


If OpenWindow(0, 0, 0, 600, 600, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(#Button_Menu01,250,WindowHeight(0)-50,150,25,"Send") 
    ContainerGadget(#Container_01, 10, 130, 500, 100, #PB_Container_Flat)
    ButtonGadget(#Button_Menu02,250,50,130,25,"Send") 
    CloseGadgetList()
    
    SetWindowCallback(@ContainerCallback())
    
    Repeat
    Event = WaitWindowEvent()
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
                        
          Case #Button_Menu01 
            Debug "c'est un bouton classic pourquoi tu clique" 
            
          Case #Button_Menu02 
            Debug "Aie !!! loupé - clique sur le container pas sur le bouton"
       
        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow
  
EndIf

Re: ContainerGadget event

Publié : mer. 20/mars/2013 17:35
par falsam
J'ai corrigé mon code précédent en ajoutant un test d’existence du container (If IsGadget(#Container_01)) afin d'éviter une erreur lors de la fermeture de la fenêtre.

Re: ContainerGadget event

Publié : mer. 20/mars/2013 17:54
par Backup
d'un autre coté un container n'est pas un gagdet comme les autres
il est la surtout pour englober les autres gadgets ...

dans le but par exemple de cacher en une seule fois plusieurs gadget ...
il suffit de cacher le container , ça va cacher ce qui se trouve dedans .. (enfin en principe :lol:)

ou bien de regrouper plusieurs Gadget dans un but x ou y

un container n'a pas pour vocation a recevoir les clique souris ..ça n'a pas vraiment de sens :)

Re: ContainerGadget event

Publié : mer. 20/mars/2013 19:08
par doudouvs
Me suis énerver, impossible de faire marche le code je me suis dit c'est pas possible
je code sous OSX je test sous windows ben la ca marche grrrr

@Dobro j'aime bien détourner les choses

Re: ContainerGadget event

Publié : mer. 20/mars/2013 19:29
par doudouvs
Il ya quand meme beaucoup de chose qui ne marche pas sous OSX et inversement
Genre pour le code plus haut les declarations

marche sous windows

Code : Tout sélectionner

Enumeration
    #Container_01
    #Button_Menu01
    #Button_Menu02
EndEnumeration
marche sous OSX pas sous windows

Code : Tout sélectionner

Enumeration
    #Container_01
    #Button_Menu01
    #Button_Menu02
    #PB_ProcessPureBasicEvents
    #WM_LBUTTONUP
    #WM_LBUTTONDOWN
EndEnumeration

un WebGadet qui na pas le même comportement avec les cibles: _blank sous windows ca marche sous OSX que nenni

Code : Tout sélectionner

WebGadget(0, 0, 0, 580, 280, "url")

et j'en passe si on continue je vais avoir une Doc des contraintes aussi grande que l'aide

Re: ContainerGadget event

Publié : mer. 20/mars/2013 22:17
par Backup
doudouvs a écrit : marche sous OSX pas sous windows

Code : Tout sélectionner

Enumeration
    #Container_01
    #Button_Menu01
    #Button_Menu02
    #PB_ProcessPureBasicEvents
    #WM_LBUTTONUP
    #WM_LBUTTONDOWN
EndEnumeration
Normal ! :roll:

#PB_ProcessPureBasicEvents ; Constante Purebasic
#WM_LBUTTONUP ; Constante API Windows
#WM_LBUTTONDOWN ; Constante API Windows
sont des constantes Reservées par le Purebasic , et par les API windows !
appelles les autrement ça marchera ..

Re: ContainerGadget event

Publié : mer. 20/mars/2013 22:42
par doudouvs
Je mis perds encore API pas API trucmuch ect...........
J'ai du prendre a la lettre
"- Code source du programme immédiatement transposable sur Windows, AmigaOS ou Linux" > transposable

C'est sur que si j'utilise des choses bizarre ca risque pas de marcher, j'ai encore du mal a comprendre le fonctionnement je tâtonne à force j'apprend

Re: ContainerGadget event

Publié : mer. 20/mars/2013 23:39
par falsam
doudouvs a écrit :J'ai du prendre a la lettre "- Code source du programme immédiatement transposable sur Windows, AmigaOS ou Linux" > transposable
Transposable à condition de ne pas utiliser les API propres aux différents systèmes d'exploitations.

Et même dans ces conditions, transposable ne veut pas dire fonctionnel à 100%. Il faut parfois par exemple modifier la disposition des gadgets quand on passe de Windows à Linux simplement à cause d'une police par défaut qui n'est pas la même sur Windows et Linux.

J'ai fini par abandonné le dev sous linux lors d'une mise à jour d'Ubuntu. Le visuel de mon application est devenu désastreux. Je n'ai pas encore eu la chance d'utiliser Pure Basic sous OSx.

Re: ContainerGadget event

Publié : jeu. 21/mars/2013 6:06
par graph100
Les callback ne sont utilisables que sur Windows (marqué dans l'aide)

Il ne faut pas confondre ce que peut faire PB et ce que peut faire l'OS sur lequel vous programmez.

Si un des objectifs de ton code est d'être multi-OS il faut impérativement que tu vérifies la compatibilité des fonctions que tu utilises dans ce code. C'est systématiquement marqué dans l'aide de PB.

Rapidement, les API de window ne fonctionneront pas sur Linux ou OS X et vice versa.

Le code ci-dessous fonctionne sur tout les OS

Code : Tout sélectionner

Macro IS_MouseOnGadget(Window, Gadget)
	Bool(GadgetX(Gadget) <= WindowMouseX(Window) And GadgetX(Gadget) + GadgetWidth(Gadget) >= WindowMouseX(Window) And	GadgetY(Gadget) <= WindowMouseY(Window) And GadgetY(Gadget) + GadgetHeight(Gadget) >= WindowMouseY(Window))
EndMacro


IDW_FenTest = OpenWindow(#PB_Any, 0, 0, 400, 300, "Test clic", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)


IDG_container = ContainerGadget(#PB_Any, 20, 20, 360, 100, #PB_Container_Double)

Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_LeftClick
		If IS_MouseOnGadget(IDW_FenTest, IDG_container)
			Debug "clic gauche sur le Container"
		Else
			Debug "clic ailleurs"
		EndIf
	EndIf
	
Until event = #PB_Event_CloseWindow

End

Re: ContainerGadget event

Publié : jeu. 21/mars/2013 9:05
par doudouvs
Merci @graph100 mais bon c'est du tout fait ca me gêne :oops:

Voila j'ai bien compris les API, c'est un raccourci éventuellement de ce que PB n'arrive pas a faire directement, la doc n'ai pas toujours explicite à ce sujet.

J'aurai trouvé cela plus concis d'avoir une doc, uniquement sur les fonctions de PB, d'avoir une doc sur les API que de tout mélanger, autrement on aurai pu rajouter dans la doc cocoa/gtk et la ce serait carrément plus lisible.

Pour finir ma pensé je trouve que l'utilisation des API sont de la ségrégation de système

Re: ContainerGadget event

Publié : jeu. 21/mars/2013 11:32
par Backup
l'API ( windows ,Linux ,OSX ) est un ensemble de Fonctions utilisable en C ou en Purebasic , ces fonctions Font partie du Systeme d'exploitation
ce sont des fonctions programmées par les Développeurs du système d'exploitation

elle permettent le traitement "Facilité" des Périphériques , et du systeme Graphique du systeme D'exploitation ..

exemple pour Windows :
http://msdn.microsoft.com/en-us/library ... 85%29.aspx



l'API existe donc aussi sur Linux , qui dispose de ses propres Fonctions (APi) , et sur OSX , et d'une certaine maniere sur tout les systemes D'exploitation Moderne !!

si tu a connu l'Atari STF ,nous avions les TRAP#xx c'etait un appel au API du GEM/TOS ..
http://www.bighole.nl/pub/mirror/homepa ... _traps.htm


pour Linux
http://www.gnugeneration.com/books/linu ... ernel-api/


pour OSX lire ici :
http://fr.wikipedia.org/wiki/Cocoa_%28Apple%29


quelques fois un développeur de Driver pour un périphérique, peut proposer une API spécifique
sous forme de DLL ...


comme tu dois le comprendre , les API N'ONT RIEN A VOIR AVEC PUREBASIC !