Récupérer l'evenement clavier dans un listicongadget ?
Récupérer l'evenement clavier dans un listicongadget ?
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
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 !
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
Chris
Re: Récupérer l'evenement clavier dans un listicongadget ?
Courage, tu vas finir par trouver !!!
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.
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.
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.
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
Chris
Mais en fait, c'est le même principe que celui au dessus
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
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
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 !
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