Aide sur ListiconGadget

Sujets variés concernant le développement en PureBasic
Cagou-77
Messages : 79
Inscription : dim. 15/août/2004 13:27

Aide sur ListiconGadget

Message par Cagou-77 »

Bonjour,

J'aimerai pouvoir créer une zone de saisie flottante dans une listicongadget

ex:
je clic gauche sur ligne et colonne spécifique cela m'affiche un stringGadget
pour modifier ou saisir des données qui seront mise à jour dans la listicongadget . ( quelque chose de simple si possible )

Quelq'un a t-il une idée
Merci d'avance
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je sais pas si c'est simple mais voici un code basé sur un excellent code de El Choni d'il y a bien 2 ans.

J'ai "éclairci" le code.

Le principe, c'est une petite callback pour intercepter 2 messages, le double clic gauche de la souris et le traitement d'un message de couleur.

J'ai passé 2 heures pour essayer de faire sans callback car PB permet de récupérer le double clic mais c'est après que ça coince, pas moyen de récupérer les bonne valeurs du message.

Donc avec callback.

C'est très simple, un double clic sur un élément et tu n'as qu'à écrire directement dans la cellule, c'est la touche Entrée qui met fin à l'écriture. Après le double clic, la cellule est sur fond noir texte blanc, tu peux changer ça comme ceci :

modifie les valeurs des constantes

Code : Tout sélectionner

#CouleurFondCellule 
#CouleurTextCellule 
J'ai créé une Brush qu'il faut détruire avec l'API deleteObject, c'est dans la boucle normale, en fin de programme

C'est pas trop compliqué à utiliser, tu copies la callback et les constantes que tu as besoin et après la création de la listicon, tu mets cette ligne en changeant bien sur l'identifiant de la listicon

Code : Tout sélectionner

  OlCallback = SetWindowLong_(GadgetID(#ListIconGadget1), #GWL_WNDPROC, @Mycallback()) 
Si tu utilise la librairie MoreListiconGadget, ne mets pas la ligne

Code : Tout sélectionner

SendMessage_(GadgetID(#ListIconGadget1), #CCM_SETVERSION, 5, 0)
car la librairie le fait déjà.

Le code

Code : Tout sélectionner

Enumeration
    #MainWindow
    #ListIconGadget1
    #StringGadget
EndEnumeration

; Structure LVITEM
; Mask.l
; iItem.l
; iSubItem.l
; State.l
; stateMask.l
; pszText.l
; cchTextMax.l
; iImage.l
; lParam.l
; iIndent.l
; iGroupId.l
; cColumns.l
; puColumns.l
; EndStructure
;
#CCM_SETVERSION = 8199
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56
#KeyDown = 0
#KeyUp = 2

Global OlCallback.l, BrushFondCellule

#CouleurFondCellule = 0
#CouleurTextCellule = #white

BrushFondCellule = CreateSolidBrush_(#CouleurFondCellule)

Procedure Mycallback(Window, Message, wParam, lParam)
    resultat = CallWindowProc_(OlCallback, Window, Message, wParam, lParam)
    Select Message
        Case #WM_LBUTTONDBLCLK
            var.LVHITTESTINFO
            var\pt\x = lParam & $FFFF
            var\pt\y = lParam >> 16
            SendMessage_(Window, #LVM_SUBITEMHITTEST, 0, var)
            rc.RECT
            rc\top = var\iSubItem
            rc\left = #LVIR_BOUNDS
            SendMessage_(Window, #LVM_GETSUBITEMRECT, var\iItem, rc)
            UseGadgetList(Window)
            ligne = var\iItem
            colonne = var\iSubItem
            Text$ = GetGadgetItemText(#ListIconGadget1, ligne, colonne )
            If colonne = 0
                rc\right = rc\left + SendMessage_(Window, #LVM_GETCOLUMNWIDTH, 0, 0)
            EndIf
            StringGadget(#StringGadget, rc\left + 1, rc\top, rc\right - rc\left - 1, rc\bottom - rc\top - 1, Text$, #PB_String_BorderLess)
            ActivateGadget(#StringGadget)
            Repeat
                Select WaitWindowEvent()
                    Case #WM_KEYDOWN
                        Select EventwParam()
                            Case #VK_RETURN
                                Text$ = GetGadgetText(#StringGadget)
                                FreeGadget(#StringGadget)
                                SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
                                quit2 + 1
                        EndSelect
                EndSelect
            Until quit2
            
        Case #WM_CTLCOLOREDIT
            If GetFocus_() = lParam
                SetBkMode_(wParam, #TRANSPARENT)
                SetTextColor_(wParam, #CouleurTextCellule)
                resultat = BrushFondCellule
            EndIf
    EndSelect
    ProcedureReturn resultat
EndProcedure

If OpenWindow(#MainWindow, 0, 0, 480, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Cellules et stringGadget")
    
    If CreateGadgetList(WindowID()) And ListIconGadget(#ListIconGadget1, 40, 95, 398, 180, "Col 1", 198)
        SendMessage_(GadgetID(#ListIconGadget1), #CCM_SETVERSION, 5, 0)
        OlCallback = SetWindowLong_(GadgetID(#ListIconGadget1), #GWL_WNDPROC, @Mycallback())
        
        AddGadgetColumn(#ListIconGadget1, 1, "Col 2", 190 / 2)
        AddGadgetColumn(#ListIconGadget1, 2, "Col 3", 190 / 2)
        For i.b = 1 To 10
            AddGadgetItem(#ListIconGadget1, -1, "Element " + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Str(i))
        Next i
        
        
        Repeat
            
            Select WaitWindowEvent()
                    
                Case #PB_EventCloseWindow
                    DeleteObject_(BrushFondCellule)
                    Quit + 1
                    
            EndSelect
            
        Until Quit
        
    EndIf
EndIf
End
Dernière modification par Anonyme2 le jeu. 21/avr./2005 4:13, modifié 1 fois.
Cagou-77
Messages : 79
Inscription : dim. 15/août/2004 13:27

Message par Cagou-77 »

Super Denis,

tout ce que j'attendais je vais adapter le code à mon application je te montrerai ce que j'ai obtenu .

Merci encore et bonne soirée .
@++

Michel
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

pas au point :? (j'ai planté le bazar) mais ça a le mérite de montrer le principe :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Cagou-77
Messages : 79
Inscription : dim. 15/août/2004 13:27

Message par Cagou-77 »

Salut,

j'ai déjà rajouté ca :

Code : Tout sélectionner

            Repeat
                Select WaitWindowEvent()
                    Case #WM_KEYDOWN
                        Select EventwParam()
                            Case #VK_RETURN
                                Text$ = GetGadgetText(#StringGadget)
                                FreeGadget(#StringGadget)
                                SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
                                quit2 + 1
__________________________________________
                            Case #VK_ESCAPE
                                FreeGadget(#StringGadget)
                                Break
___________________________________________
                        EndSelect
                EndSelect
            Until quit2
ce qui serait bien : 1er click souris positionnement, surbrillance .
2ème click souris Saisie .

Merci de votre aide, se serait bien de dévellopper un outil complet pour
la saise dans une listicongadget .

Bonne Nuit
Michel
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Oui, on doit pouvoir faire plus simple et plus prope :) et sans callback
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Le Soldat Inconnu a écrit :pas au point :? (j'ai planté le bazar) mais ça a le mérite de montrer le principe :)
Je ne sais pas pourquoi ça plante chez toi car tous mes essais fonctionnent avec et sans les thèmes XP.

Peut -être parce que le addgadgetcolumnn de la 3eme colonne a le même numéro que la 2eme colonne , j'ai corrigé dans le code posté.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Le Soldat Inconnu a écrit :Oui, on doit pouvoir faire plus simple et plus prope :) et sans callback
Il faudra la callback pour la couleur du stringgadget.

J'ai intercepté dans la boucle standart le double clic sur la listicon mais EventLparam() ne retournait pas les valeurs correctes du rectangle de la cellule (j'ai fait des essais en clientscreen etc mais je n'ai jamais eu les bonnes valeurs, peut-être une erreur dans mon code, donc je ne suis pas arrivé à obtenir le bon numéro de ligne)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Ah ? je ferais un essai cet après midi

Pour la version sans CallBack, il n'y a plus de couleur, bien sur ;)

j'ai cru planté le bazar car je n'avais pas cliqué sur Enter après une édition
et j'ai déplacé la liste avec les scrollbars.
Mais j'ai une idée pour remedier à ce problème ;)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Salut,
@ Cagou-77 :
J'aimerai pouvoir créer une zone de saisie flottante dans une listicongadget
Comme au début tu voulais une fenêtre flottante, il me semblait que l'InputRequester était approprié pour agir sur ta ListIcon.

Denis et LSI sont partis sur la réalisation d'une ListIcon Editable, ce qui manque encore à PB et sera très bienvenue. :D

Personnellement je me sers de la méthode suivante (initiée par Régis également à laquelle j'ai rajouté l'action sur plusieurs colonnes par l'intermédiaire d'une ComboBoxGadget)

Code : Tout sélectionner

;Cette partie du code représente la création d'une combobox listant chaque colonne de la ListIcon dans la fenêtre principale où se trouve aussi la listicon.
;Ne pas tenir compte des valeurs de positionnement de gadget (extrait d'un de mes programmes)
;Les noms des colonnes...c'est pour l'exemple
;SetGadgetColor() et SetComboBoxColor() sont des fonctions de la Lib de Denis
TextGadget(#text_modif,470,85,130,15,"Modifier",#PB_Text_Center)
;SetGadgetColor(#text_modif, #black, RGB($D0,$F0,$FF))
ComboBoxGadget(#SelectColonne, 470, 100, 130, 120,#PB_ComboBox_Editable); ComboBox éditable pour colorisation       
;SetComboBoxColor(#SelectColonne, RGB($B0,$EC,$F0), #black,#black)
AddGadgetItem(#SelectColonne, -1, "Nom")   ; première colonne valant 0
AddGadgetItem(#SelectColonne, -1, "Prénom"); deuxième colonne valant 1 
AddGadgetItem(#SelectColonne, -1, "Âge")   ; etc...
AddGadgetItem(#SelectColonne, -1, "Sexe")
AddGadgetItem(#SelectColonne, -1, "Planète")
AddGadgetItem(#SelectColonne, -1, "Langue")
AddGadgetItem(#SelectColonne, -1, "Intelligence")
;******************************************************
;Dans la boucle Repeat, 
Case #ListIcon; constante de la ListIconGadget()
  Resultat$ = GetGadgetText(#SelectColonne); On récupère la colonne voulue dans une variable
  If Resultat$="Nom": Colonne=0            ; si la variable vaut "Nom" alors c'est la colonne 0 qui est sélectionnée
  ElseIf Resultat$="Prénom" : Colonne=1    ; si la variable vaut "Prénom" alors c'est la colonne 1 qui est sélectionnée
  ElseIf Resultat$="Âge" : Colonne=2       ; etc...
  ElseIf Resultat$="Sexe" : Colonne=3
  ElseIf Resultat$="Planète" : Colonne=4
  ElseIf Resultat$="Langue" : Colonne=5
  ElseIf Resultat$="Intelligence" : Colonne=6
  EndIf  
  Pos = GetGadgetState(#ListIcon)
  If Pos >= 0 
    If EventType() = #PB_EventType_RightClick ; au choix 
      Txt.s = InputRequester("MODIFICATION D'UN ELEMENT DE LA LISTICON", "Entrez vos modifications :", GetGadgetItemText(#ListIcon, Pos, Colonne)) 
      SetGadgetItemText(#ListIcon, Pos, Txt, Colonne) 
    EndIf 
  EndIf 
Ainsi en sélectionnant la colonne sur laquelle on a besoin d'agir avec la combobox, il n'y a plus qu'à faire un clic droit sur l'élément de la colonne choisie qu'il faut modifier. Il y a sûrement plus simple.

Voilà, si ça peut servir
@+ Jacobus
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Voilas ma version :

Code : Tout sélectionner

Enumeration
    #MainWindow
    #ListIconGadget1
    #StringGadget
EndEnumeration

#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56

If OpenWindow(#MainWindow, 0, 0, 480, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Cellules et stringGadget")
   
  If CreateGadgetList(WindowID()) And ListIconGadget(#ListIconGadget1, 40, 95, 398, 180, "Col 1", 198)
    AddGadgetColumn(#ListIconGadget1, 1, "Col 2", 190 / 2)
    AddGadgetColumn(#ListIconGadget1, 2, "Col 3", 190 / 2)
    For i.b = 1 To 10
        AddGadgetItem(#ListIconGadget1, -1, "Element " + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Chr(10) + "Sous-élément" + Str(i) + Str(i))
    Next i
   
   
    Repeat
     
      Select WindowEvent()
           
        Case #PB_EventCloseWindow
          Quit + 1
          
        Case #WM_LBUTTONDBLCLK 
          Debug "t"
          
        Case #PB_Event_Gadget
          Select EventGadgetID()
            
            Case #ListIconGadget1
              Select EventType()
              
                Case #PB_EventType_LeftDoubleClick
                  ;Debug "ok"
                  var.LVHITTESTINFO
                  var\pt\x = WindowMouseX() - GadgetX(#ListIconGadget1) + GetSystemMetrics_(#SM_CXEDGE)
                  var\pt\y = WindowMouseY() - GadgetY(#ListIconGadget1) + GetSystemMetrics_(#SM_CYEDGE)
                  ;Debug var\pt\x
                  ;Debug var\pt\y
                  SendMessage_(GadgetID(#ListIconGadget1), #LVM_SUBITEMHITTEST, 0, var)
                  rc.RECT
                  rc\top = var\iSubItem
                  rc\left = #LVIR_BOUNDS
       
                  Debug SendMessage_(GadgetID(#ListIconGadget1), #LVM_GETSUBITEMRECT, var\iItem, rc)
                  UseGadgetList(WindowID())
                  ligne = var\iItem
                  colonne = var\iSubItem
                  Text$ = GetGadgetItemText(#ListIconGadget1, ligne, colonne )
                  If colonne = 0
                      rc\right = rc\left + SendMessage_(GadgetID(#ListIconGadget1), #LVM_GETCOLUMNWIDTH, 0, 0)
                  EndIf
                  rc\Top + GadgetY(#ListIconGadget1) + GetSystemMetrics_(#SM_CYEDGE)
                  rc\bottom + GadgetY(#ListIconGadget1) + GetSystemMetrics_(#SM_CYEDGE)
                  rc\right + GadgetX(#ListIconGadget1) + GetSystemMetrics_(#SM_CXEDGE)
                  rc\left + GadgetX(#ListIconGadget1) + GetSystemMetrics_(#SM_CXEDGE)
                  StringGadget(#StringGadget, rc\left + 1, rc\top, rc\right - rc\left - 1, rc\bottom - rc\top - 1, Text$, #PB_String_BorderLess)
                  ActivateGadget(#StringGadget)
                  SendMessage_(GadgetID(#StringGadget),#EM_SETSEL,0,99999)
                  quit2 = 0
                  Repeat
                    Select WindowEvent()
                      Case #WM_KEYDOWN
                        Select EventwParam()
                          Case #VK_RETURN
                            Text$ = GetGadgetText(#StringGadget)
                            FreeGadget(#StringGadget)
                            SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
                            quit2 + 1
                          Case #VK_ESCAPE
                            Quit2 + 1
                        EndSelect
                    EndSelect
                    If GetFocus_() <> GadgetID(#StringGadget)
                      Text$ = GetGadgetText(#StringGadget)
                      FreeGadget(#StringGadget)
                      SetGadgetItemText(#ListIconGadget1, Ligne, Text$, Colonne)
                      quit2 + 1
                    EndIf
                  Until quit2
              
              EndSelect
            
          EndSelect
             
      EndSelect
       
    Until Quit
     
  EndIf
EndIf
End
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

voila la version sans callback ;)

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.93
;
; Explication du programme :


#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56

; Création de la fenêtre principale
OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test")
CreateGadgetList(WindowID())

; ListIcon
ListIconGadget(0, 0, 0, 300, 300, "Colonne 1", 150, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Colonne 2", 150)
AddGadgetColumn(0, 2, "Colonne 3", 150)
For n = 0 To 20
  AddGadgetItem(0, -1, "Elément " + Str(n) + " - 0" + Chr(10) + "Elément " + Str(n) + " - 1" + Chr(10) + "Elément " + Str(n) + " - 2")
Next

; Fenêtre d'édition de la ListIconGadget
OpenWindow(1, 0, 0, 100, 20, #PB_Window_BorderLess | #PB_Window_Invisible, "Edition", WindowID())
CreateGadgetList(WindowID())
StringGadget(2, 0, 0, 100, 20, "", #PB_String_MultiLine)
AddKeyboardShortcut(1, #PB_Shortcut_Return, 0) ; Touche de raccourci
AddKeyboardShortcut(1, #PB_Shortcut_Escape, 1)
UseWindow(0)
UseGadgetList(WindowID())



Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_EventGadget
      Select EventGadgetID()
        Case 0 ; ListIcon
          Select EventType()
            Case #PB_EventType_LeftDoubleClick
              ; Sur quel élément on a cliqué
              GetCursorPos_( @MouseClic.LVHITTESTINFO\pt) ; Coordonnée de la souris
              ScreenToClient_(GadgetID(0), @MouseClic.LVHITTESTINFO\pt)
              SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, MouseClic)
              Debug MouseClic\iItem
              Debug MouseClic\iSubItem
              ; Position et taille de l'élément
              Zone.RECT\Top = MouseClic\iSubItem
              Zone\Left = #LVIR_BOUNDS
              SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, MouseClic\iItem, Zone)
              If MouseClic\iSubItem = 0 ; Si on est sur la colonne 0
                ; Il faut ajuster la taille en fonction de la largeur de la colonne
                Zone\Right = Zone\Left + SendMessage_(GadgetID(0), #LVM_GETCOLUMNWIDTH, 0, 0)
              EndIf
              Debug Str(Zone\Left) + ", " + Str(Zone\Top)
              
              ; On déplace la fenêtre d'éditon et on la redimensionne
              GetWindowRect_(GadgetID(0), WinPos.RECT)
              GetClientRect_(GadgetID(0), ClientPos.RECT)
              UseWindow(1)
              Largeur = Zone\Right - Zone\Left
              Hauteur = Zone\Bottom - Zone\Top
              If Hauteur < 18
                Hauteur = 18
              EndIf
              MoveWindow(Zone\Left + WinPos\Left, Zone\Top + WinPos\Top)
              ResizeWindow(Largeur, Hauteur)
              ResizeGadget(2, 0, 0, Largeur, Hauteur)
              
              ; On récupère la texte
              SetGadgetText(2, GetGadgetItemText(0, MouseClic\iItem, MouseClic\iSubItem))
              
              ; On affiche
              EnableWindow_(WindowID(0), 0) ; On désactive la fenêtre principale
              HideWindow(1, 0) ; On montre le StringGadget
              ActivateGadget(2) ; et on lui donne le focus
              ; On gère les actions
              Quitter = 0
              Repeat
                Event = WaitWindowEvent()
                If Event = #PB_EventMenu
                  Select EventMenuID()
                    Case 0 ; Entrer
                      Quitter = 1
                      SetGadgetItemText(0, MouseClic\iItem, GetGadgetText(2), MouseClic\iSubItem) ; On récupère le nouveau texte
                    Case 1 ; Echap
                      Quitter = 1
                  EndSelect
                EndIf
              Until Quitter Or Event = #PB_EventCloseWindow
              HideWindow(1, 1)
              EnableWindow_(WindowID(0), 1) ; On active la fenêtre principale
              
          EndSelect
           
      EndSelect
  EndSelect
  
Until Event = #PB_EventCloseWindow

End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

la miene est sans callback aussi :p
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui ;) j'ai vu après avoir poster :D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Alors, on aime pas les CallBack :0:
Répondre