Focus des combos

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Focus des combos

Message par Chris »

Un petit code tout simple.

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window
EndEnumeration

;- Gadget Constants
Enumeration
  #Combo
  #String_1
  #String_2
  #String_3
  #String_4
  #Button
EndEnumeration

Global hCombo

Procedure Open_Window()
  If OpenWindow(#Window, 496, 78, 315, 175,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Test")
    If CreateGadgetList(WindowID())
      ComboBoxGadget(#Combo, 10, 10, 295, 200, #PB_ComboBox_Editable)
      StringGadget(#String_1, 10, 50, 295, 20, "")
      StringGadget(#String_2, 10, 75, 295, 20, "")
      StringGadget(#String_3, 10, 100, 295, 20, "")
      StringGadget(#String_4, 10, 125, 295, 20, "")
      ButtonGadget(#Button, 115, 150, 100, 20, "Bouton")
    EndIf
  EndIf
  RemoveKeyboardShortcut(#Window, #PB_Shortcut_All)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Tab, #PB_Shortcut_Tab)
EndProcedure

Procedure EnumChildProc(hwnd, lParam)
  Result = #True
  Class$ = Space(128) : GetClassName_(hwnd, @Class$, 128)
  If LCase(Class$) = "edit"
    hCombo = hwnd : Result = #False
  EndIf
  
  EnumChildWindows_ (hwnd, @EnumChildProc(), lParam) 
  ProcedureReturn Result
EndProcedure 

;/ Ouverture de la fenêtre
Open_Window()
ActivateGadget(#Combo)

;/ On va chercher le 'handle' de l'Edit qui se trouve dans la ComboBox
;/ Le handle est global, et n'est recherché qu'une fois, à l'ouverture
;/ du programme
EnumChildWindows_(GadgetID(#Combo),@EnumChildProc(),0)

Repeat
  Select WaitWindowEvent()
    Case #PB_EventMenu
      Select EventMenuID()
        Case #PB_Shortcut_Tab
          ;/ Et on a plus qu'à utiliser GetFocus_()
          Focus = GetFocus_()
          
          Select Focus
            Case hCombo              : ActivateGadget(#String_1)
            Case GadgetID(#String_1) : ActivateGadget(#String_2)
            Case GadgetID(#String_2) : ActivateGadget(#String_3)
            Case GadgetID(#String_3) : ActivateGadget(#String_4)
            Case GadgetID(#String_4) : ActivateGadget(#Combo)
          EndSelect
      EndSelect
      
    Case #PB_EventGadget
      Select EventGadgetID()
        Case #Combo
        Case #String_1
        Case #String_2
        Case #String_3
        Case #String_4
      EndSelect
    Case #PB_EventCloseWindow
      Quit = 1
  EndSelect
Until Quit
End
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Petite modification, dans le premier, je n'avais qu'un seul combo, puisque le code était basé sur un de mes programmes en cours.

Si on a plusieurs combos, le code change, car il faut récupérer le handle du 'Edit' dans chaque combo.

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window
EndEnumeration

;- Gadget Constants
Enumeration
  #Combo_1
  #Combo_2
  #String_1
  #String_2
  #String_3
  #Button
EndEnumeration

Procedure Open_Window()
  If OpenWindow(#Window, 496, 78, 315, 175,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Test")
    If CreateGadgetList(WindowID())
      ComboBoxGadget(#Combo_1, 10, 10, 295, 200, #PB_ComboBox_Editable)
      ComboBoxGadget(#Combo_2, 10, 50, 295, 200, #PB_ComboBox_Editable)
      StringGadget(#String_1, 10, 75, 295, 20, "")
      StringGadget(#String_2, 10, 100, 295, 20, "")
      StringGadget(#String_3, 10, 125, 295, 20, "")
      ButtonGadget(#Button, 115, 150, 100, 20, "Bouton")
    EndIf
  EndIf
  RemoveKeyboardShortcut(#Window, #PB_Shortcut_All)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Tab, #PB_Shortcut_Tab)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Left, #PB_Shortcut_Left)
EndProcedure

Procedure EnumChildProc(hwnd, lParam)
  Result = #True
  Class$ = Space(128) : GetClassName_(hwnd, @Class$, 128)
  If LCase(Class$) = "edit"
    Resultat = hwnd : Result = #False
  EndIf
  
  EnumChildWindows_ (hwnd, @EnumChildProc(), lParam) 
  ProcedureReturn Resultat
EndProcedure 

;/ Ouverture de la fenêtre
Open_Window()
For i = 0 To 20
  AddGadgetItem(#Combo_1, -1, "Elément "+Str(i))
  AddGadgetItem(#Combo_2, -1, "Elément "+Str(i))
Next
SetGadgetState(#Combo_1, 0)
SetGadgetState(#Combo_2, 0)

ActivateGadget(#Combo_1)

;/ On va chercher le 'handle' de l'Edit qui se trouve dans la ComboBox
;/ Le handle est global, et n'est recherché qu'une fois, à l'ouverture
;/ du programme
hCombo_1 = EnumChildWindows_(GadgetID(#Combo_1),@EnumChildProc(),0)
hCombo_2 = EnumChildWindows_(GadgetID(#Combo_2),@EnumChildProc(),0)


Repeat
  Select WaitWindowEvent()
    Case #PB_EventMenu
      Select EventMenuID()
        Case #PB_Shortcut_Tab
          ;/ Et on a plus qu'à utiliser GetFocus_()
          Focus = GetFocus_()
          
          Select Focus
            Case hCombo_1            : ActivateGadget(#Combo_2)
            Case hCombo_2            : ActivateGadget(#String_1)
            Case GadgetID(#String_1) : ActivateGadget(#String_2)
            Case GadgetID(#String_2) : ActivateGadget(#String_3)
            Case GadgetID(#String_3) : ActivateGadget(#Combo_1)
          EndSelect
          
        Case #PB_Shortcut_Left
          If GetFocus_() = hCombo_1
            SendMessage_(GadgetID(#Combo_1), #CB_SHOWDROPDOWN, #True, 0)
          EndIf
          If GetFocus_() = hCombo_2
            SendMessage_(GadgetID(#Combo_2), #CB_SHOWDROPDOWN, #True, 0)
          EndIf
          
      EndSelect
      
    Case #PB_EventGadget
      Select EventGadgetID()
        Case #Combo_1
        Case #Combo_2
        Case #String_1
        Case #String_2
        Case #String_3
      EndSelect
    Case #PB_EventCloseWindow
      Quit = 1
  EndSelect
Until Quit
End
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai essayé le code mais je vois pas très bien ce que c'est censé faire :?:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

nico a écrit :J'ai essayé le code mais je vois pas très bien ce que c'est censé faire :?:
Ben oui, mais je n'ai ni le courage ni l'envie d'expliquer. :P

Disons que c'est pour utiliser le raccourci clavier Tab pour donner le focus aux combos quand ils sont en mode "Editable"

Ce code là sera peut-être plus parlant, sinon, tant pis.

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
Enumeration
  #Combo_0
  #Combo_1
  #Combo_2
  #Combo_3
  #Button_0
  #Button_1
  #Frame3D_0
  #Radio_1
  #Radio_2
  #Radio_3
  #String_0
  #String_1
EndEnumeration

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 210, 0, 190, 295,  #PB_Window_SystemMenu | #PB_Window_ScreenCentered , "Test")
    If CreateGadgetList(WindowID())
      ComboBoxGadget(#Combo_0, 5,  5, 180, 20, #PB_ComboBox_Editable)
      ComboBoxGadget(#Combo_1, 5, 35, 180, 20, #PB_ComboBox_Editable)
      ComboBoxGadget(#Combo_2, 5, 65, 180, 20, #PB_ComboBox_Editable)
      ComboBoxGadget(#Combo_3, 5, 95, 180, 20, #PB_ComboBox_Editable)
      
      ButtonGadget(#Button_0, 5, 125, 85, 20, "Bouton 1")
      ButtonGadget(#Button_1, 100, 125, 85, 20, "Bouton 2")
      Frame3DGadget(#Frame3D_0, 5, 150, 180, 80, "Options")
      OptionGadget(#Radio_1, 10, 165, 170, 15, "Option 1")
      OptionGadget(#Radio_2, 10, 185, 170, 15, "Option 2")
      OptionGadget(#Radio_3, 10, 205, 170, 15, "Option 3")
      StringGadget(#String_0, 5, 240, 180, 20, "")
      StringGadget(#String_1, 5, 270, 180, 20, "")
    EndIf
    RemoveKeyboardShortcut(#Window_0, #PB_Shortcut_All) 
    AddKeyboardShortcut(#Window_0, #PB_Shortcut_Tab, 0) 
  EndIf
EndProcedure

Procedure EnumChildProc(hwnd, lParam) 
  Result = #True 
  Class$ = Space(128) : GetClassName_(hwnd, @Class$, 128) 
  If LCase(Class$) = "edit" 
    Resultat = hwnd : Result = #False 
  EndIf 
  
  EnumChildWindows_ (hwnd, @EnumChildProc(), lParam) 
  ProcedureReturn Resultat 
EndProcedure 

Open_Window_0()
For i = 0 To 20 
  AddGadgetItem(#Combo_0, -1, "Elément "+Str(i)) 
  AddGadgetItem(#Combo_1, -1, "Elément "+Str(i))
  AddGadgetItem(#Combo_2, -1, "Elément "+Str(i)) 
  AddGadgetItem(#Combo_3, -1, "Elément "+Str(i)) 
Next 
SetGadgetState(#Combo_0, 0) : SetGadgetState(#Combo_1, 0) 
SetGadgetState(#Combo_2, 0) : SetGadgetState(#Combo_3, 0) 

ActivateGadget(#Combo_0)

hCombo_0 = EnumChildWindows_(GadgetID(#Combo_0),@EnumChildProc(),0) 
hCombo_1 = EnumChildWindows_(GadgetID(#Combo_1),@EnumChildProc(),0) 
hCombo_2 = EnumChildWindows_(GadgetID(#Combo_2),@EnumChildProc(),0) 
hCombo_3 = EnumChildWindows_(GadgetID(#Combo_3),@EnumChildProc(),0) 

Repeat 
  Select WaitWindowEvent()
    Case #PB_EventMenu
      Select EventMenuID()
        Case 0
          Focus = GetFocus_()
          
          Select Focus 
            Case hCombo_0            : ActivateGadget(#Combo_1) 
            Case hCombo_1            : ActivateGadget(#Combo_2)
            Case hCombo_2            : ActivateGadget(#Combo_3) 
            Case hCombo_3            : ActivateGadget(#Combo_0) 
          EndSelect
          
      EndSelect
    Case #PB_EventGadget
      Select EventGadgetID()
        
      EndSelect
      
    Case #PB_EventCloseWindow
      Quit = 1
  EndSelect
Until Quit
End
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je comprend pas, chez moi le tab fonctionne avec les combos :!:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Chez moi aussi, mais uniquement si tu gardes le Tab par défaut, qui te permet d'activer chaque gadget.

Dans mon prog, d'ou j'ai tiré l'exemple, j'ai besoin de ne sélectionner QUE les combos et les StringGadget(), et rien d'autre.

Et comme les combos sont éditables, la récupération du focus ne fonctionne pas.

Par contre, avec des combos non éditables, il n'y a pas de problème
Répondre