Page 1 sur 1

J'ai un probleme avec les StringGadgets et menu contextuel.

Publié : sam. 14/oct./2006 12:27
par Kwai chang caine
Bonjour à tous

J'ai des problémes pour gérer les événements clic droit sur un StringGadget en meme temps que j'appelle un menu contextuel.

Exemple :

Code : Tout sélectionner

Enumeration
 #Menu
 #MenuEffacer
 #MenuCheminRechercher
 #MenuCheminApplication
 #MenuNomChamp
 #Champ
EndEnumeration

OpenWindow(1,200,200,400,200,"",#PB_Window_SystemMenu) 
CreateGadgetList(WindowID(1))
StringGadget(#Champ,10,10,300,20,"")  

;                           MENU CONTEXTUEL
;                           ***************

CreatePopupMenu(#Menu)
MenuItem(#MenuNomChamp, "Nom du champ")


Repeat 
 
 Select WaitWindowEvent() 
 
  Case #PB_Event_CloseWindow 

   End 
 
  Case #WM_RBUTTONDOWN 

   DisplayPopupMenu(#Menu, WindowID(1))
   Debug EventGadget()
   
  Case #PB_Event_Gadget 

   If EventGadget() = #Champ
    Debug EventGadget()
   EndIf
   
 EndSelect 

ForEver
Quand je clic gauche l'id du champ remonte bien, mais qd je clic droit, c'est le menu contextuel qui s'affiche et apres pour l'ID j'obtiens 0.

Deux questions me tarabustent :

1/ Comment faire pour obtenir l'ID du gadget sur lequel on a cliqué droit ???

2/ Est il possible de remettre à 0 l'EventGadget() ou est-on obligé de passer par une variable et la remettre à 0, puisque apparement il garde la valeur du dernier gadget utilisé ???

C'est pas vraiment facile de comprendre la gestion des divers evenements et surtout dans quel ordre les utiliser. :(

J'ai bien cherché quelques aides sur les événements gentillement proposée par droopy :

http://purebasic.hmt-forum.com/viewtopi ... evenements

et

http://purebasic.hmt-forum.com/viewtopi ... evenements

Mais on y parle pas des menus contextuels et des clics droits

Merci de votre aide.

Publié : sam. 14/oct./2006 16:27
par brossden
Esssaye

Code : Tout sélectionner

Enumeration
  #Menu
  #MenuEffacer
  #MenuCheminRechercher
  #MenuCheminApplication
  #MenuNomChamp
  #Champ
EndEnumeration

OpenWindow(1,200,200,400,200,"",#PB_Window_SystemMenu)
CreateGadgetList(WindowID(1))
StringGadget(#Champ,10,10,300,20,"") 

;                           MENU CONTEXTUEL
;                           ***************

CreatePopupMenu(#Menu)

;*****************************************
For n=1 To 5
MenuItem(n, "Choix Numéro "+Str(n))
Next
;*****************************************
Repeat
  
  Select WaitWindowEvent()
    
    Case #PB_Event_CloseWindow
      
      End
      
    Case #WM_RBUTTONDOWN
    
      DisplayPopupMenu(#Menu, WindowID(1))
 
      
;******************************************      
    Case #PB_Event_Menu
      Debug EventMenu() 
;******************************************
      
  EndSelect
  
ForEver 

Les lignes changées sont entre les étoiles

Publié : sam. 14/oct./2006 16:47
par nico
Pour régler ton problème, il te faudrait un code qui te permette de savoir sur quel gadget tu es au survol.

Un code du genre MouseIn MouseOut, il y en a pleins d'autres qui font ça ou alors l'utilisation du message #WM_SETCURSOR ce qui t'obligeras à faire un callback.

Publié : sam. 14/oct./2006 17:06
par Kwai chang caine
Bonjour à vous 2

@BROSSDEN

Je te remercie de ton code qui fonctionne admirablement mieux que le miens. 8)
Par contre ce n'est pas tout à fait ce que je voulais, j'ai du mal m'exprimer :oops:

@NICO

Tu es arrivé à décoder ma question, malgres qu'elle soit mal posée.
Je crois bien que ce que tu as dit est exactement ce que je veux. :10:

Je vais chercher du coté des MouseIn MouseOut, mais si tu pouvais me donner un petit exemple pour le #WM_SETCURSOR et un callback, ça serait super sympa.

Les callbacks. ça m'interesse mortel, ce n'est pas la premiere fois que j'en entend parler, mais j'y comprend "couik", je ne sais ni comment les appeler, ni vraiment à quoi ils servent, j'ai lu des aides etc..., mais ça n'a pas encore percuté dans ma tête. :(
Je pense que c'est déja de la haute programmation et un niveau que j'aimerais toucher du doigt.
J'aimerais bien comprendre avec un exemple simple comme celui-la, un miracle est toujours possible et comme pure est le roi des miracles .... :lol:

Encore merci à tous les 2 d'aider le débutant que je suis.
Bonne journée

Publié : sam. 14/oct./2006 17:17
par nico
Comme c'est dit dans le code, ça ne marche que si le gadget n'est pas désactivé!

Code : Tout sélectionner

; Détecte le passage de la souris au dessus d'un Gadget 
; on peut ainsi récupérer son ID ou son Handle 
; il faut que l'ID du Gadget commence par 1 
; car le message renvoie null s'il n'est pas au dessus un Gadget 
; de plus si le gadget est désactivée, il ne sera pas détecté 

Global Id.l

  Procedure ProcedureCallback(WindowID, Message, wParam, lParam) 
    Resultat = #PB_ProcessPureBasicEvents 
    Select Message 
      Case #WM_SETCURSOR 
        Id=GetDlgCtrlID_(wParam)
        ;Debug "Handle= "+Str(wParam)+"   , "+"ID= "+Str(GetDlgCtrlID_(wParam)) 
        
    EndSelect 
    ProcedureReturn Resultat 
  EndProcedure 
  
  Enumeration 
    #Window 
    #String1        
    #Button    
    #CheckBox      
  EndEnumeration 
  
  Enumeration 
     #Menu
     #MenuNomChamp
  EndEnumeration 
  
  If OpenWindow(#Window,0,0,400,400,"Pure Basic",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
    CreateGadgetList(WindowID(#Window)) 
    StringGadget(#String1,20, 20,200,20,"Normal StringGadget...") 
    ButtonGadget(#Button, 20, 60, 200, 20, "Standard Button") 
    CheckBoxGadget(#CheckBox,20, 100,200,20,"CheckBox standard") 
    
    ;DisableGadget(#Button,1) 
    
    SetWindowCallback(@ProcedureCallback()) 
    
    CreatePopupMenu(#Menu) 
    MenuItem(#MenuNomChamp, "Nom du champ") 


    Repeat 
      EventID.l=WaitWindowEvent() 
      Select EventID 
        Case #WM_RBUTTONDOWN 
            Debug id
            ; A toi de faire les conditions pour ne gérer que les Gadgets souhaités
            DisplayPopupMenu(#Menu, WindowID(#Window))  
             
        Case #PB_Event_Gadget 
          Select EventGadget() 
            Case 0 

          EndSelect 
          
        Case #WM_CLOSE 
          Quit=1 
      EndSelect 
    Until Quit=1 
  EndIf   

Publié : sam. 14/oct./2006 17:40
par nico
J'aui trouvé plus simple:

Code : Tout sélectionner

  Case #WM_RBUTTONDOWN 
    GetCursorPos_(@point.POINT)
    handle=WindowFromPoint_(point\X,point\Y)
    Id=GetDlgCtrlID_(handle)
    Debug Id
    DisplayPopupMenu(#Menu, WindowID(1)) 

Publié : sam. 14/oct./2006 18:04
par Kwai chang caine
Alors la, je reste sans voix ...... :D

C'est exactement ce que je cherchais. :10:


J'etais passé par une procedure super compliqué qui donnais la position de la souris, mais alors la .......

Mille merci pour ce, petit par la taille, mais immense code par l'éfficacité, que tu viens de me donner.

Que serais le purebasic sans ce forum et ses professeurs. 8)
Passez une excelente soirée.

Petit scarabé

Publié : sam. 14/oct./2006 18:48
par Gratteur
C'est de l'api, tu ne peux pas l'inventer.
Visites un peu le site de microsoft, y'a plein de trucs utiles sur l'os.

Probleme avec les textgadget

Publié : jeu. 19/oct./2006 22:53
par barnierchristophe
J'ai essayé la petite astuce du Soldat inconnu. J'ai l'impression que cela ne marche pas pour les strings gadget....????

Publié : ven. 20/oct./2006 6:51
par Kwai chang caine
Quelle astuce du soldat inconnu ? 8O

Publié : ven. 20/oct./2006 19:08
par barnierchristophe
J'avais mal lu; Il s'agissait dun message de nico et non du soldat inconnu....

Publié : ven. 20/oct./2006 23:03
par Kwai chang caine
Bah si, c'est d'ailleurs pour ça que je l'ai utilisé il me semble.