Récupérer l'evenement clavier dans un listicongadget ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Récupérer l'evenement clavier dans un listicongadget ?

Message par Lukky »

Bonjour, j'ai un listicongadget et je dois effectuer une action à chaque changement de ligne par les touches haut et bas lorsque ce gadget est actif, mais seulement dans ce cas.

J'arrive à détecter l'appui d'une touche lorsque mon prog tourne sauf quand ma liste est active, les touches font monter et descendre la sélection mais c'est tout, je me doute qu'un callback va s'avérer necessaire mais je vois pas trop comment le tourner.

La soluce est sans doute toute simple voir même évidente mais bon elle m'échappe !

JL
Quand on me gonfle trop j'éclate, sinon ça va !
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

T'aurais pas un petit bout de code d'exemple, parce que normalement, tu as EventType() qui permet de savoir ce que tu as fait dans le gadget, cliqué, selectionné avec un bouton, etc..., et GetGadgetItemState() qui te renvoie l'état de l'élément, sélectionné ou non, etc... mais il faudrait savoir ce que tu veux faire exactement.

Chris :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Récupérer l'evenement clavier dans un listicongadget ?

Message par nico »

Courage, tu vas finir par trouver !!! :)
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Sais pas si ça répond bien à la question, je peux éventuellement ajouter qq trucs sur les ListIcon si nécessaire ...

Code : Tout sélectionner

#Window_Main = 0
#Gadget_ListIcon = 1

;
;
;
  Quit = #FALSE
  WindowXSize = 320
  WindowYSize = 240
  If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "MyWindow")
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      If CreateGadgetList(WindowID())
          ListIconGadget(#Gadget_ListIcon, 10, 10, WindowXSize - 20, WindowYSize - 35, "Col1", 120, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop | #PB_ListIcon_AlwaysShowSelection)
          AddGadgetColumn(#Gadget_ListIcon, 1, "Col2", 120)
          AddGadgetColumn(#Gadget_ListIcon, 2, "Col3", 120)
          AddGadgetColumn(#Gadget_ListIcon, 3, "Col4", 120)
      EndIf
      For i = 1 To 20
        Text.s = ""
        For j = 0 To 4
          For k = 1 To Random(5) + 3
            Text = Text + Chr(Random(25) + 65)
          Next
          Text + Chr(10)
        Next
        AddGadgetItem(#Gadget_ListIcon, -1, Text)
      Next
      If CreateStatusBar(#Window_Main, WindowID())
      EndIf
      SetWindowCallback(@MyWindowCallBack())
      Repeat
        Wevent = WaitWindowEvent()
        Select WEvent
          Case #PB_Event_CloseWindow
            Quit = #TRUE
          Case #PB_Event_Menu
            Select EventMenuID()
              Case #PB_Shortcut_Escape
                Quit = #TRUE
            EndSelect
          Case #PB_EventGadget
            Select EventGadgetID()
              Case #Gadget_ListIcon
                If Item <> GetGadgetState(#Gadget_ListIcon)
                    If Abs(Item - GetGadgetState(#Gadget_ListIcon)) <> Item - GetGadgetState(#Gadget_ListIcon)
                        Debug "vers le bas"
                      Else
                        Debug "vers le haut"
                    EndIf
                    Debug "ListIcon state=" + Str(GetGadgetState(#Gadget_ListIcon))
                    Debug "ListIcon text=" + GetGadgetText(#Gadget_ListIcon)
                    Debug "ListIcon ItemState=" + Str(GetGadgetItemState(#Gadget_ListIcon, GetGadgetState(#Gadget_ListIcon)))
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 0)
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 1)
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 2)
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 3)
                    Item = GetGadgetState(#Gadget_ListIcon)
                EndIf
                Select EventType()
                  Case #PB_EventType_LeftClick
                  Case #PB_EventType_RightClick
                  Case #PB_EventType_LeftDoubleClick
                  Case #PB_EventType_RightDoubleClick
                EndSelect
            EndSelect
          Case #WM_LBUTTONDOWN
            Debug "#WM_LBUTTONDOWN"
            ReleaseCapture_()
            SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
        EndSelect
      Until Quit
  EndIf
  TerminateProcess_(GetCurrentProcess_(), 0)
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Bon et puis zut ... je vais me faire un café, c'est l'heure de ma récré. Voila un snip + complet avec gestion des colonnes, des couleurs de lignes, et possibilité de tri des lignes du ListIcon.

A partir de là, si besoin est encore, la gestion des entrées clavier peut se faire de 2 façons :

- soit par récupération de #WM_CHAR dans le callback ColumnClickCallback()
- soit par ajout de KeyboardShortcut() dans le prog principal

Je stoppe là pour l'instant.

Code : Tout sélectionner

#Window_Main = 0
#Gadget_ListIcon = 1

Global hListIconGadget.l 

#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55
#ListIconTextColor1 = $5F0000
#ListIconBackgroundColor1 = $D0FFFF
#ListIconTextColor2 = $D0FFFF
#ListIconBackgroundColor2 = $5F0000

#NM_CUSTOMDRAW = #NM_FIRST - 12

#CDDS_ITEM = $10000 
#CDDS_PREPAINT = $1 
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT 
#CDRF_DODEFAULT = $0 
#CDRF_NOTIFYITEMDRAW = $20 

#PB_Shortcut_CTRL_F = $6

Global Buffer1.l, Buffer2.l, lvi.LV_ITEM, updown.l, lastcol.l

Buffer1 = AllocateMemory(128)
Buffer2 = AllocateMemory(128)

Procedure CompareFunc(item1, item2, lParamSort)
  result = 0
  lvi\iSubItem = lParamSort
  lvi\pszText = Buffer1
  lvi\cchTextMax = 128
  lvi\mask = #LVIF_TEXT
  SendMessage_(hListIconGadget, #LVM_GETITEMTEXT, item1, @lvi)
  lvi\pszText = Buffer2
  SendMessage_(hListIconGadget, #LVM_GETITEMTEXT, item2, @lvi)
  Seeker1 = Buffer1
  Seeker2 = Buffer2
  done = #FALSE
  Repeat
    char1 = Asc(UCase(Chr(PeekB(Seeker1))))
    char2 = Asc(UCase(Chr(PeekB(Seeker2))))
    result = (char1 - char2) * updown
    If result <> 0 Or (Seeker1 - Buffer1) > 127
        done = #TRUE
    EndIf
    Seeker1 + 1
    Seeker2 + 1
  Until Done
  ProcedureReturn result
EndProcedure

Procedure UpdatelParam()
  ItemCount = SendMessage_(hListIconGadget, #LVM_GETITEMCOUNT, 0, 0)
  lvi\mask = #LVIF_PARAM
  lvi\iItem = 0
  While ItemCount > 0
    lvi\lParam = lvi\iItem
    For SubItem = 0 To 3
      lvi\iSubItem = SubItem 
      SendMessage_(hListIconGadget, #LVM_SETITEM, 0, @lvi)
    Next SubItem
    lvi\iItem = lvi\iItem + 1
    ItemCount = ItemCount - 1
  Wend
EndProcedure

Procedure ColumnClickCallback(Handle, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_NOTIFY
      *msg.NMHDR = lParam
      If *msg\hwndFrom = hListIconGadget And *msg\code = #LVN_COLUMNCLICK
          *pnmv.NM_LISTVIEW = lParam
          If lastcol <> *pnmv\iSubItem
              updown = 1
          EndIf
          SendMessage_(hListIconGadget, #LVM_SORTITEMS, *pnmv\iSubItem, @CompareFunc())
          UpdatelParam()
          UpdateWindow_(hListIconGadget)
          lastcol = *pnmv\iSubItem
          updown = -updown
      EndIf
      *LVCDHeader.NMLVCUSTOMDRAW = lParam
      If *LVCDHeader\nmcd\hdr\hWndFrom = hListIconGadget And *LVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
          Select *LVCDHeader\nmcd\dwDrawStage
            Case #CDDS_PREPAINT
              ProcedureReturn #CDRF_NOTIFYITEMDRAW
            Case #CDDS_ITEMPREPAINT
              Row.l = *LVCDHeader\nmcd\dwItemSpec
              If (Row / 2) * 2 = Row
                  *LVCDHeader\clrText = #ListIconTextColor1
                  *LVCDHeader\clrTextBk = #ListIconBackgroundColor1
                Else
                  *LVCDHeader\clrText = #ListIconTextColor2
                  *LVCDHeader\clrTextBk = #ListIconBackgroundColor2
              EndIf
              ProcedureReturn #CDRF_DODEFAULT
          EndSelect
      EndIf
    Case #WM_LBUTTONDOWN
      ReleaseCapture_()
      SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, #NULL)
    Case #WM_PAINT
      HideWindow(#Window_Main, 1)
      HideWindow(#Window_Main, 0)
    Case #WM_SIZE
      If Handle = WindowID() And IsIconic_(Handle) = 0
          WindowWidth = lParam & $ffff
          WindowHeight = lParam >> 16
          ResizeGadget(#Gadget_ListIcon, 25, 25, WindowWidth - 50, WindowHeight - 50)
          Result = 1
      EndIf
  EndSelect
  ProcedureReturn Result
EndProcedure

;
;
;
  Quit = #FALSE
  WindowXSize = 320
  WindowYSize = 240
  If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "MyWindow")
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      If CreateGadgetList(WindowID())
          hListIconGadget = ListIconGadget(#Gadget_ListIcon, 10, 10, WindowXSize - 20, WindowYSize - 35, "Col1", 120, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop | #PB_ListIcon_AlwaysShowSelection)
          AddGadgetColumn(#Gadget_ListIcon, 1, "Col2", 120)
          AddGadgetColumn(#Gadget_ListIcon, 2, "Col3", 120)
          AddGadgetColumn(#Gadget_ListIcon, 3, "Col4", 120)
      EndIf
      For i = 1 To 20
        Text.s = ""
        For j = 0 To 4
          For k = 1 To Random(5) + 3
            Text = Text + Chr(Random(25) + 65)
          Next
          Text + Chr(10)
        Next
        AddGadgetItem(#Gadget_ListIcon, -1, Text)
      Next
      If CreateStatusBar(#Window_Main, WindowID())
      EndIf

      updown = 1
      lastcol = 0
      UpdatelParam()
      SetWindowCallback(@ColumnClickCallback())
      
      Repeat
        Wevent = WaitWindowEvent()
        Select WEvent
          Case #PB_Event_CloseWindow
            Quit = #TRUE
          Case #PB_Event_Menu
            Select EventMenuID()
              Case #PB_Shortcut_Escape
                Quit = #TRUE
            EndSelect
          Case #PB_EventGadget
            Select EventGadgetID()
              Case #Gadget_ListIcon
                If Item <> GetGadgetState(#Gadget_ListIcon)
                    If Abs(Item - GetGadgetState(#Gadget_ListIcon)) <> Item - GetGadgetState(#Gadget_ListIcon)
                        Debug "vers le bas"
                      Else
                        Debug "vers le haut"
                    EndIf
                    Debug "ListIcon state=" + Str(GetGadgetState(#Gadget_ListIcon))
                    Debug "ListIcon text=" + GetGadgetText(#Gadget_ListIcon)
                    Debug "ListIcon ItemState=" + Str(GetGadgetItemState(#Gadget_ListIcon, GetGadgetState(#Gadget_ListIcon)))
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 0)
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 1)
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 2)
                    Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 3)
                    Item = GetGadgetState(#Gadget_ListIcon)
                EndIf
                Select EventType()
                  Case #PB_EventType_LeftClick
                  Case #PB_EventType_RightClick
                  Case #PB_EventType_LeftDoubleClick
                  Case #PB_EventType_RightDoubleClick
                EndSelect
            EndSelect
        EndSelect
      Until Quit
  EndIf
  TerminateProcess_(GetCurrentProcess_(), 0)
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'avais fait mon petit bout de code aussi, alors je le poste, parce que j'aime pas quand je bosse pour rien.

Mais en fait, c'est le même principe que celui au dessus :lol:

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Btn_Quit
  #List
EndEnumeration

If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu, "Fenêtre 1",0)
  If CreateGadgetList(WindowID(#Window_0))
    ListIconGadget(#List,0,0,300,150,"",300,#PB_ListIcon_GridLines)
    ButtonGadget(#Btn_Quit, 100, 170, 100, 25, "Quitter")
  EndIf
  For i = 0 To 10
    AddGadgetItem(#List,i,"Ligne "+Str(i))
  Next
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #List
            Debug GetGadgetState(#List)
            
          Case #Btn_Quit : Quit = 1
        EndSelect
      Case #PB_EventCloseWindow : Quit = 1
    EndSelect
  Until Quit = 1
  End
EndIf
Chris :)
Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Message par Lukky »

Alors déjà merci pour les deux codes qui fonctionnent bien sur !

Mais si ça résoud mon problème d'une autre façon ce n'est pas tout à fait la direction dans laquelle je cherche.

En fait lorsque je suis dans une listicon l'appui sur la flèche haut du clavier fait changer de ligne. Je voudrais que du code à moi s'exécute à chaque changement de ligne.

Bien sur votre code résoud ce problème parfaitement mais vous utilisez la modification de la ligne sélectionnée pour détecter l'appui sur la touche alors que je cherche à détecter quelle touche a été tapée lors du déplacement. L'avantage est qu'ensuite je pourrais associer un traitement aux autres flèches (gauche et droite) et la y'a pas de changement de ligne pour s'appuyer.

Mais bon si je trouve pas j'utiliserais l'idée que vous avez choisis, très bonne au demeurant !

JL
Quand on me gonfle trop j'éclate, sinon ça va !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

#MyWindow = 0 
#MyGadget = 0

If OpenWindow(#MyWindow,100,100,300,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ListIcon Example") 
  If CreateGadgetList(WindowID()) 
    ListIconGadget(#MyGadget,10,10,280,200,"Name",100,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection) 

    For i = 0 To 20 
      AddGadgetItem(#MyGadget,i,"Ligne "+Str(i)) 
    Next 
    ButtonGadget(10, 40, 240, 200, 20, "Standard Button") 
    
    Repeat 
      EventID = WaitWindowEvent()
      Select EventID
        Case #WM_KEYUP
          If GetFocus_()=GadgetID(#MyGadget)
            Select EventwParam()
              Case 38
                Debug "Flèche Haut"
              Case 40
                Debug "Flèche Bas"
            EndSelect 
          EndIf 
      EndSelect
      
    Until EventID = #PB_Event_CloseWindow 
  EndIf 
EndIf 
Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Message par Lukky »

En deux mots comme en cent : Pile poil !

Avec ça c'est parfait, je gère mes touches impec.

Merci à vous tous.

JL
Quand on me gonfle trop j'éclate, sinon ça va !
Répondre