[resolu] - ContainerGadget event

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

[resolu] - ContainerGadget event

Message 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
  
Dernière modification par doudouvs le jeu. 21/mars/2013 14:46, modifié 1 fois.
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ContainerGadget event

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ContainerGadget event

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ContainerGadget event

Message 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 :)
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: ContainerGadget event

Message 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
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: ContainerGadget event

Message 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
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ContainerGadget event

Message 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 ..
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: ContainerGadget event

Message 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
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: ContainerGadget event

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: ContainerGadget event

Message 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
Dernière modification par graph100 le sam. 23/mars/2013 21:39, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: ContainerGadget event

Message 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
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ContainerGadget event

Message 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 !
Répondre