bindevent

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

bindevent

Message par lule »

J'ai déjà posé la question sur le forum anglais. je n'ai pas eu de réponse concluante.
je voudrais utiliser la commande BindEvent() avec l'argument en option Object, qui est soit l'id d'un gadget ou d'un menu.

Dans l'exemple ci-dessous, je voudrais redimensionner la fenêtre pour que le Gadget 1 se redimensionne en même temps.

Avec la première ligne BindEvent j'arrive bien a intercepter l’événement de la fenêtre, mais la deuxième ne fonctionne pas.

Je n'ai pas trouvé d'exemple de la command Bindevent avec les arguments optionnels.

Si quelqu'un peut m'aider.

Code : Tout sélectionner


Procedure Resize0()
	Debug "Resize0"
	Debug EventGadget()
	Debug EventType()
EndProcedure

Procedure Resize1(pl, pi)
	Debug "Resize1"
	Debug EventGadget()
	Debug EventType()
	Debug pl
	Debug pi
EndProcedure

; Shows possible flags of StringGadget in action...
If OpenWindow(0, 0, 0, 322, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
	StringGadget(0, 8,  10, 306, 20, "Normal StringGadget...")
	StringGadget(1, 8,  35, 306, 20, "1234567", #PB_String_Numeric)
	StringGadget(2, 8,  60, 306, 20, "Read-only StringGadget", #PB_String_ReadOnly)
	StringGadget(3, 8,  85, 306, 20, "lowercase...", #PB_String_LowerCase)
	StringGadget(4, 8, 110, 306, 20, "uppercase...", #PB_String_UpperCase)
	StringGadget(5, 8, 140, 306, 20, "Borderless StringGadget", #PB_String_BorderLess)
	StringGadget(6, 8, 170, 306, 20, "Password", #PB_String_Password)

	BindEvent(#PB_Event_SizeWindow, @Resize0(), 0)	;-This one work fine
	BindEvent(#PB_Event_SizeWindow, @Resize1(), 0, 1);not this one
	
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: bindevent

Message par Micoute »

Bonjour lule, tu peux t'amuser à le transformer pour que ça fonctionne avec BindEventGadget(), mais il fonctionne déjà bien comme ça !

FaireRequerir.pbi

Code : Tout sélectionner

; 
;  Calcule la taille nécessaire pour afficher un gadget correctement.
;
;  Gadgets pris en charge:
;    Button, Checkbox, Option, Text, String, ComboBox, Image 
;
;   Note: 
; Pour Gadgets à contenu variable (String, ComboBox), seule la hauteur 
; est utile, alors que la largeur ne sera qu'une valeur minimale absolue
;
;  Les paramètres 'Options' donne les drapeaux gadget à inclure dans le calcul.
;  Actuellement seulement #PB_Text_Border fait une différence.   
;

CompilerIf Defined(Max, #PB_Procedure) = 0
  Procedure Max(a, b)
    If a > b
      ProcedureReturn a
    Else
      ProcedureReturn b
    EndIf
  EndProcedure
CompilerEndIf

; Stocke le résultat dans *Largeur\l et *Hauteur\l
;
Procedure FaireRequerirTaille(Gadget, *Largeur.LONG, *Hauteur.LONG, Drapeaux = 0)
  DC = GetDC_(GadgetID(Gadget))
  AncPolice = SelectObject_(DC, GetGadgetFont(Gadget)) 
  Taille.SIZE
  
  Select GadgetType(Gadget)
      
    Case #PB_GadgetType_Text
      Texte$ = RemoveString(GetGadgetText(Gadget), #LF$)
      Compte = CountString(Texte$, #CR$) + 1
      Vide = 0
      HauteurMaxi = 0 
      For index = 1 To Compte 
        Ligne$ = StringField(Texte$, index, #CR$)
        If Ligne$ = ""
          Vide + 1
        Else 
          GetTextExtentPoint32_(DC, @Ligne$, Len(Ligne$), @TailleLigne.SIZE)
          Taille\cx = Max(Taille\cx, TailleLigne\cx)
          Taille\cy + TailleLigne\cy
          HauteurMaxi = Max(HauteurMaxi, TailleLigne\cy)
        EndIf
      Next index            
      Taille\cy + Vide * HauteurMaxi  
      
      If Drapeaux & #PB_Text_Border
        Taille\cx + GetSystemMetrics_(#SM_CXEDGE) * 2
        Taille\cy + GetSystemMetrics_(#SM_CYEDGE) * 2
      Else           
        Taille\cx + 2
        Taille\cy + 2
      EndIf
      
    Case #PB_GadgetType_CheckBox, #PB_GadgetType_Option
      Texte$ = GetGadgetText(Gadget)
      GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
      Taille\cx + 20
      Taille\cy = Max(Taille\cy+2, 20)
      
    Case #PB_GadgetType_Button
      Texte$ = GetGadgetText(Gadget)
      GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
      Taille\cx + GetSystemMetrics_(#SM_CXEDGE)*2
      Taille\cy = Max(Taille\cy+GetSystemMetrics_(#SM_CYEDGE)*2, 24)
      Taille\cx + 10
      
    Case #PB_GadgetType_String
      Texte$ = GetGadgetText(Gadget) + "Hg" 
      GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
      Taille\cx = GetSystemMetrics_(#SM_CXEDGE)*2 
      Taille\cy = Max(Taille\cy+GetSystemMetrics_(#SM_CXEDGE)*2, 20)
      
    Case #PB_GadgetType_ComboBox
      GetTextExtentPoint32_(DC, @"Hg", 2, @Taille.SIZE)
      Taille\cy = Max(Taille\cy + 8, 21)
      Taille\cx = Taille\cy  
      
    Case #PB_GadgetType_Image
      Taille\cx = GadgetWidth(Gadget)
      Taille\cy = GadgetHeight(Gadget)
      
  EndSelect
  
  SelectObject_(DC, AncPolice)
  ReleaseDC_(GadgetID(Gadget), DC)
  *Largeur\l  = Taille\cx
  *Hauteur\l = Taille\cy
  
  If Type = #PB_GadgetType_String Or Type  = #PB_GadgetType_ComboBox        
    *Largeur\l = 30 
  EndIf
  EndProcedure

; enveloppes de commodité si une seule taille est requise
;
Procedure FaireRequerirLargeur(Gadget, Drapeaux = 0)
  Protected Largeur.l, Hauteur.l
  FaireRequerirTaille(Gadget, @Largeur, @Hauteur, Drapeaux)
  ProcedureReturn Largeur
EndProcedure 

Procedure FaireRequerirHauteur(Gadget, Drapeaux = 0)
  Protected Largeur.l, Hauteur.l
  FaireRequerirTaille(Gadget, @Largeur, @Hauteur, Drapeaux)
  ProcedureReturn Hauteur
EndProcedure
EssaiFaireRequerir.pb

Code : Tout sélectionner

XIncludeFile "FaireRequerir.pbi"
Enumeration Fenetre
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Btn_1
  #Btn_2
  #Btn_3
  #BtnChangPol
  #Chkbox_1
  #Chkbox_2
  #Chkbox_3  
  #Str
  #CmbBox
  #Police
EndEnumeration

Procedure Retailler()
  FaireRequerirTaille(#Btn_1, @LargeurBtn1.i, @HauteurBtn1.i)
  FaireRequerirTaille(#Btn_2, @LargeurBtn2.i, @HauteurBtn2.i)
  FaireRequerirTaille(#Btn_3, @LargeurBtn3.i, @HauteurBtn3.i)
  
  Hauteur = Max(HauteurBtn1, Max(HauteurBtn2, HauteurBtn3))
  x = 10
  y = 10
  ResizeGadget(#Btn_1, x, y, LargeurBtn1, Hauteur): x + LargeurBtn1 + 5
  ResizeGadget(#Btn_2, x, y, LargeurBtn2, Hauteur): x + LargeurBtn2 + 5
  ResizeGadget(#Btn_3, x, y, LargeurBtn3, Hauteur): x + LargeurBtn3 + 5
  
  y + Hauteur + 10  
  HauteurFen = x
  
  FaireRequerirTaille(#Chkbox_1, @LargeurChkBox1.i, @HauteurChkBox1.i)
  FaireRequerirTaille(#Chkbox_2, @LargeurChkBox2.i, @HauteurChkBox2.i)
  FaireRequerirTaille(#Chkbox_3, @LargeurChkBox3.i, @HauteurChkBox3.i)
  
  Largeur = Max(LargeurChkBox1, Max(LargeurChkBox2, LargeurChkBox3))
  ResizeGadget(#Chkbox_1, 10, y, Largeur, HauteurChkBox1): y + HauteurChkBox1 + 5
  ResizeGadget(#Chkbox_2, 10, y, Largeur, HauteurChkBox2): y + HauteurChkBox2 + 5
  ResizeGadget(#Chkbox_3, 10, y, Largeur, HauteurChkBox3): y + HauteurChkBox3 + 5
  
  y + 5
  HauteurFen = Max(HauteurFen, Largeur+20)
  
  Hauteur = FaireRequerirHauteur(#Str)
  ResizeGadget(#Str, 10, y, HauteurFen-20, Hauteur)
  y + Hauteur + 5

  Hauteur = FaireRequerirHauteur(#CmbBox)
  ResizeGadget(#CmbBox, 10, y, HauteurFen-20, Hauteur)
  y + Hauteur + 10
  
  FaireRequerirTaille(#BtnChangPol, @LargeurBtn.i, @HauteurBtn.i)
  ResizeGadget(#BtnChangPol, (HauteurFen-LargeurBtn)/2, y, LargeurBtn, HauteurBtn)
  y + HauteurBtn + 10
  
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, HauteurFen, y)
EndProcedure

If OpenWindow(#Fenetre_principale, 100, 100, 0, 0, "Test taille", #PB_Window_SystemMenu|#PB_Window_Invisible)
  ButtonGadget(#Btn_1, 0, 0, 0, 0, "Court")
  ButtonGadget(#Btn_2, 0, 0, 0, 0, "-- Long --")
  ButtonGadget(#Btn_3, 0, 0, 0, 0, "------- Très long ------")
  CheckBoxGadget(#Chkbox_1, 0, 0, 0, 0, "Salut monde cruel !")
  CheckBoxGadget(#Chkbox_2, 0, 0, 0, 0, "Voyez le brick géant que j'examine près du wharf.")
  CheckBoxGadget(#Chkbox_3, 0, 0, 0, 0, "Une autre boîte à cocher")
  StringGadget(#Str, 0, 0, 0, 0, "String")
  ComboBoxGadget(#CmbBox, 0, 0, 0, 0)
  AddGadgetItem(#CmbBox, 0, "ComboBox")
  SetGadgetState(#CmbBox, 0)
  ButtonGadget(#BtnChangPol, 0, 0, 0, 0, "Changer police")

  Retailler()
  HideWindow(#Fenetre_principale, 0)
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget And EventGadget() = #BtnChangPol
      If FontRequester("Arial", 20, 0)
        If LoadFont(#Police, SelectedFontName(), SelectedFontSize(), SelectedFontStyle())
          For Gadget = #Btn_1 To #CmbBox
            SetGadgetFont(Gadget, FontID(#Police))
          Next Gadget
          Retailler()
        EndIf
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: bindevent

Message par majikeyric »

ça vient peut être du fait que dans:

Code : Tout sélectionner

BindEvent(#PB_Event_SizeWindow, @Resize1(), 0, 1);not this one
Tu attends un evènement de redimensionnement de fenêtre sur le gadget 1, ce qui ne se produira jamais.
Le type d'evénement et l'objet sont incompatibles.

On ne redimensionne pas les gadgets de cette manière, il faut utiliser ResizeGadget().
Je te renvoie à ce code de falsam : http://www.purebasic.fr/french/viewtopi ... =6&t=13161
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

Re: bindevent

Message par lule »

en fait j'attend pas que le gadget renvoi un evenement mais que la fenetre renvoi l'evenement avec l'id d'un gadget quelconque.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: bindevent

Message par Ar-S »

Salut.
J'ai pas compris grand chose à ce que tu veux faire concrètement.
En tout cas voilà une modif qui fait en sorte que lorsque tu redimensionnes ta fenêtre, le gadgetstring actif est redimensionné aussi.
Et tu as bien son ID dans le debug...

Si c'est pas ça que tu veux, soit plus claire. :wink:

Code : Tout sélectionner


Procedure Resize0()
   Debug "Resize0"
	Lfenetre = WindowWidth(0)
	LastGadget = GetActiveGadget()
	If LastGadget >0 And LastGadget < 8
		Debug "Dernier gadget actif : " + LastGadget
		ResizeGadget(LastGadget, #PB_Ignore, #PB_Ignore, Lfenetre-16,#PB_Ignore)
	EndIf
		
EndProcedure



Global.i Lfenetre, Lgadget

Lfenetre = 322
Lgadget = Lfenetre-16


; Shows possible flags of StringGadget in action...
If OpenWindow(0, 0, 0, Lfenetre, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
   StringGadget(1, 8,  10, Lgadget, 20, "Normal StringGadget...")
   StringGadget(2, 8,  35, Lgadget, 20, "1234567", #PB_String_Numeric)
   StringGadget(3, 8,  60, Lgadget, 20, "Read-only StringGadget", #PB_String_ReadOnly)
   StringGadget(4, 8,  85, Lgadget, 20, "lowercase...", #PB_String_LowerCase)
   StringGadget(5, 8, 110, Lgadget, 20, "uppercase...", #PB_String_UpperCase)
   StringGadget(6, 8, 140, Lgadget, 20, "Borderless StringGadget", #PB_String_BorderLess)
   StringGadget(7, 8, 170, Lgadget, 20, "Password", #PB_String_Password)

   BindEvent(#PB_Event_SizeWindow, @Resize0(), 0)   ;-This one work fine
   
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

Re: bindevent

Message par lule »

voila ce que je voudrais faire :

Code : Tout sélectionner

Structure tagGADGETAMOI
	hTypeID.i
	hWindow.i
	hGadget.i
EndStructure

Procedure __GadgetAMoi_Resize()
	
	Protected *pGadget.tagGADGETAMOI
	
	If IsGadget(EventGadget())
		*pGadget.tagGADGETAMOI = GetGadgetData(EventGadget())
		If *pGadget
			ResizeGadget(*pGadget\hGadget, -1, -1, WindowWidth(*pGadget\hWindow) * 0.9, WindowHeight(*pGadget\hWindow) * 0.9)
		EndIf
	Else
		
	EndIf
	
EndProcedure

Procedure GadgetAMoi(hID, x, y, Width, Height, Value.s)
	
	Protected *pGadget.tagGADGETAMOI = AllocateMemory(SizeOf(tagGADGETAMOI))
	
	If hID = #PB_Any
		*pGadget\hGadget = StringGadget(#PB_Any, x, y, Width, Height, Value)
	Else
		StringGadget(hID, x, y, Width, Height, Value)
		*pGadget\hGadget = hID
	EndIf
	
	SetGadgetData(*pGadget\hGadget, *pGadget)
		
	*pGadget\hWindow = GetActiveWindow()
	
	;Ici je veux que ce type de gadget réagisse à un redimensionnement de sa fenêtre
	BindEvent(#PB_Event_SizeWindow, @__GadgetAMoi_Resize(), *pGadget\hWindow, *pGadget\hGadget)
      
EndProcedure



Global.i Lfenetre, Lgadget

Lfenetre = 322
Lgadget = Lfenetre-16


; Shows possible flags of StringGadget in action...
If OpenWindow(0, 0, 0, Lfenetre, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
   StringGadget(1, 8,  10, Lgadget, 20, "Normal StringGadget...")
   GadgetAMoi(2, 8,  35, Lgadget, 20, "1234567")
   StringGadget(3, 8,  60, Lgadget, 20, "Read-only StringGadget", #PB_String_ReadOnly)
   StringGadget(4, 8,  85, Lgadget, 20, "lowercase...", #PB_String_LowerCase)
   StringGadget(5, 8, 110, Lgadget, 20, "uppercase...", #PB_String_UpperCase)
   StringGadget(6, 8, 140, Lgadget, 20, "Borderless StringGadget", #PB_String_BorderLess)
   StringGadget(7, 8, 170, Lgadget, 20, "Password", #PB_String_Password)
   
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: bindevent

Message par TazNormand »

Code : Tout sélectionner

BindEvent(#PB_Event_SizeWindow, @__GadgetAMoi_Resize(), *pGadget\hWindow, *pGadget\hGadget) 
D'après la Doc :
Objet (optionnel) Le numéro de l'objet à utiliser.
Ce peut être un gadget, un élément d'un menu ou un systray.
Avec #PB_All tous les gadgets sont susceptibles d'être à l'origine de l'évènement.
TypeEvenement (optionnel) Le type d'événement à ajouter. Pour une liste complète des types pris en charge, voir EventType().
Avec #PB_All tous les types d'évènements sont susceptibles d'être à l'origine de l'évènement.
Donc, comme l'évènement n'est pas produit par le gadget mais par le redimensionnement de la fenêtre, ton BindEvent n'est jamais "appelé"

Il te faut binder le Window_Resize.
Image
Image
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

Re: bindevent

Message par lule »

Merci à tous pour cet éclairage.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: bindevent

Message par Mesa »

J'ai modifié l'aide en français qui n'était pas très claire. Si on ajoute l'option objet dans bindevent, ça concerne l'objet uniquement.
Comme ça a été dit plus haut, dans BindEvent(#PB_Event_SizeWindow, @Resize1(), 0, 1, #PB_All ),
ici on cherche à intercepter le Event_SizeWindow pour l'objet n°1 de la fenêtre n°0, ce qui n'arrive jamais car seule la fenêtre est redimensionnée à la souris.

Si ce que tu cherches à faire, c'est ça :

Code : Tout sélectionner

Procedure choosegadgetresize(gadget)
  ResizeGadget(gadget,#PB_Ignore,#PB_Ignore,WindowWidth(0, #PB_Window_InnerCoordinate)-30 ,#PB_Ignore)
EndProcedure


If OpenWindow(0, 0, 0, 230, 90, "Exemple de gestion des évènements...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

   ButtonGadget  (1, 10, 10, 200, 20, "Cliquez moi")
   CheckBoxGadget(2, 10, 40, 200, 20, "Cochez  moi")

   If CreateMenu(0, WindowID(0))
     MenuTitle("Menu")
     MenuItem(1, "Item 1")
     MenuItem(2, "Item 2")
     MenuItem(3, "Item 3")
   EndIf

   Repeat
     Event = WaitWindowEvent()
     
     Select Event
         
       Case #PB_Event_SizeWindow   ; si fenêtre en cours de redim   
         choosegadgetresize(1)    ; alors faire ceci
         
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Bouton cliqué !"
           Case 2 : Debug "Case à cocher cliquée !"
         EndSelect
       
       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : Debug "Menu item 1 cliqué !"
           Case 2 : Debug "Menu item 2 cliqué !"
           Case 3 : Debug "Menu item 3 cliqué !"
         EndSelect
     
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf

alors, je ne pense pas que tu puisses le faire avec bindevent pour le redimensionnement, ni même avec BindGadgetEvent().

M.
Répondre