ListIconGadget - #NM_CUSTOMDRAW

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
CaptainCrunch
Messages : 52
Inscription : dim. 29/juin/2014 6:32

ListIconGadget - #NM_CUSTOMDRAW

Message par CaptainCrunch »

Bonjour tout le monde, question bête mais la je patauge....

J'explique mon problème, via un callBack, je traite les couleurs des lignes d'un ListIconGadget....
Une couleur sur 2, gris clair, gris fonce etc... mais si je veux en plus une autre couleur de ligne en cas d'une variable spéciale, problème.
Si qqun a des suggestions...

Dans ce bout de code, j'aimerai en plus une couleur de ligne si la colonne F contient "OUI"

Code : Tout sélectionner


Global TEST1

Enumeration
  #frm
  #lst
EndEnumeration

Procedure WndProc(hwnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lParam
      Select *pnmh\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam
          If *LVCDHeader\nmcd\hdr\hwndFrom = TEST1
            Select *LVCDHeader\nmcd\dwDrawStage
              Case #CDDS_PREPAINT
                result = #CDRF_NOTIFYITEMDRAW
              Case #CDDS_ITEMPREPAINT
                result = #CDRF_NOTIFYSUBITEMDRAW
              Case #CDDS_SUBITEMPREPAINT
                Row = *LVCDHeader\nmcd\dwItemSpec
                Col = *LVCDHeader\iSubItem
                If Row & 1 = 0
                   *LVCDHeader\clrTextBk = RGB(240,240,240)
                Else
                  *LVCDHeader\clrTextBk = RGB(210,210,210)
                EndIf
                result = #CDRF_NEWFONT
            EndSelect
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn result
  
EndProcedure

Procedure frm_Open()
  Protected Width.l, Height.l, x.l
  Protected tmp.s
  
  Width  = 400
  Height = 400
   
  OpenWindow(#Frm,0,0, width, height, "", #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
      
  TEST1 = ListIconGadget(#lst, 10, 30, 380, 350, "ID", 0,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect)
       
  AddGadgetColumn(#lst, 1, "A",50)
  AddGadgetColumn(#lst, 2, "B",50)  
  AddGadgetColumn(#lst, 3, "C",50) 
  AddGadgetColumn(#lst, 4, "D",50) 
  AddGadgetColumn(#lst, 5, "E",50) 
  AddGadgetColumn(#lst, 6, "F",50)
  
  tmp = ""       + #LF$
  tmp + "un"     + #LF$
  tmp + "deux"   + #LF$
  tmp + "trois"  + #LF$
  tmp + "quatre" + #LF$
  tmp + "cinq"   + #LF$
  tmp + "NON"    + #LF$
   
  For x = 1 To 5
    AddGadgetItem(#lst,-1,tmp,0)
  Next x
  
  tmp = ""       + #LF$
  tmp + "un"     + #LF$
  tmp + "deux"   + #LF$
  tmp + "trois"  + #LF$
  tmp + "quatre" + #LF$
  tmp + "cinq"   + #LF$
  tmp + "OUI"    + #LF$
  
  AddGadgetItem(#lst,-1,tmp,0)
   
   SetWindowCallback(@WndProc())
   
EndProcedure

Procedure frm_Event()
  
  Protected glEvent.l, glGadget.l, glType.l, glWindow.l
  
  Repeat
    
    glEvent  = WaitWindowEvent()
    glGadget = EventGadget()
    glType   = EventType()
    glWindow = EventWindow()
    glMenu   = EventMenu()
    
  ForEver
  End
    
EndProcedure

frm_Open()
frm_Event()
Dernière modification par CaptainCrunch le sam. 21/août/2021 9:25, modifié 1 fois.
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par Demivec »

Si je vous comprends bien, remplacez la procédure WndProc par celle-ci :

Code : Tout sélectionner

Procedure WndProc(hwnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lParam
      Select *pnmh\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam
          If *LVCDHeader\nmcd\hdr\hwndFrom = TEST1
            Select *LVCDHeader\nmcd\dwDrawStage
              Case #CDDS_PREPAINT
                result = #CDRF_NOTIFYITEMDRAW
              Case #CDDS_ITEMPREPAINT
                result = #CDRF_NOTIFYSUBITEMDRAW
              Case #CDDS_SUBITEMPREPAINT
                Row = *LVCDHeader\nmcd\dwItemSpec
                Col = *LVCDHeader\iSubItem
                
                If Col = 0
                  SetGadgetItemData(#lst, Row, Bool(GetGadgetItemText(#lst, Row, 6) = "OUI"))
                EndIf
                
                If GetGadgetItemData(#lst, Row) = #True
                  If Row & 1 = 0
                    *LVCDHeader\clrTextBk = RGB(200,240,200)
                  Else
                    *LVCDHeader\clrTextBk = RGB(170,210,170)
                  EndIf
                Else
                  If Row & 1 = 0
                    *LVCDHeader\clrTextBk = RGB(240,240,240)
                  Else
                    *LVCDHeader\clrTextBk = RGB(210,210,210)
                  EndIf
                EndIf

                result = #CDRF_NEWFONT
            EndSelect
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn result
  
EndProcedure
CaptainCrunch
Messages : 52
Inscription : dim. 29/juin/2014 6:32

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par CaptainCrunch »

Perfect =)

Je te remercie bien, c'est très gentil à toi.

En te souhaitant un bon week-end.

Cordialement

Ps : SendMessage_(GadgetID(#lst),#WM_SETREDRAW,#True,0) c'est nickel =) Thanks :D
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par Marc56 »

Une façon de faire purement PureBasic (alterner les couleurs de ligne (méthode classique en PHP) et afficher un texte d'une couleur différente)

Code : Tout sélectionner

Global TEST1

Enumeration
    #frm
    #lst
EndEnumeration

Procedure frm_Open()
    Protected Width.l, Height.l, x.l
    Protected tmp.s
    
    Width  = 400
    Height = 400
    
    OpenWindow(#Frm,0,0, width, height, "", #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    
    TEST1 = ListIconGadget(#lst, 10, 30, 380, 350, "ID", 0,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect)
    
    AddGadgetColumn(#lst, 1, "A",50)
    AddGadgetColumn(#lst, 2, "B",50)  
    AddGadgetColumn(#lst, 3, "C",50) 
    AddGadgetColumn(#lst, 4, "D",50) 
    AddGadgetColumn(#lst, 5, "E",50) 
    AddGadgetColumn(#lst, 6, "F",50)
    
    tmp = ""       + #LF$
    tmp + "un"     + #LF$
    tmp + "deux"   + #LF$
    tmp + "trois"  + #LF$
    tmp + "quatre" + #LF$
    tmp + "cinq"   + #LF$
    tmp + "NON"    + #LF$
    
    For x = 1 To 5
        AddGadgetItem(#lst,-1,tmp,0) 
    Next x
    
    tmp = ""       + #LF$
    tmp + "un"     + #LF$
    tmp + "deux"   + #LF$
    tmp + "trois"  + #LF$
    tmp + "quatre" + #LF$
    tmp + "cinq"   + #LF$
    tmp + "OUI"    + #LF$
    
    AddGadgetItem(#lst,-1,tmp,0)
    
    ; Alterner les couleurs de lignes
    For x = 0 To 6
        If Col_Bck = #Gray
            Col_Bck = #White
        Else 
            Col_Bck = #Gray
        EndIf
        SetGadgetItemColor(#lst, x, #PB_Gadget_BackColor, Col_Bck, -1)
        
        ; Changer la couleur d'une case en fonction de son contenu
        If FindString(GetGadgetItemText(#lst, x, 6), "OUI")
            SetGadgetItemColor(#lst, x, #PB_Gadget_BackColor, #Yellow, x+1) ; -1 pour la ligne entière
        EndIf
    Next x
    
EndProcedure

Procedure frm_Event()
    
    Protected glEvent.l, glGadget.l, glType.l, glWindow.l
    
    Repeat
        
        glEvent  = WaitWindowEvent()
        glGadget = EventGadget()
        glType   = EventType()
        glWindow = EventWindow()
        glMenu   = EventMenu()
        
    ForEver
    End
    
EndProcedure

frm_Open()
frm_Event()


:wink:
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par Shadow »

Je savais pas qu'on pouvais faire ça avec PB 8O
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par venom »

Salut Marc56,

En effet sympa ton exemple. 8) Merci du partage






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
CaptainCrunch
Messages : 52
Inscription : dim. 29/juin/2014 6:32

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par CaptainCrunch »

Bonjour à tous, nouveau problème...

Dans un programme qui traite énormément de données, j'utilise un ListIconGadget pour l'affichage, et je traite les couleurs via un CallBack.
Lors du rafraichissement de la liste, je perds énormément en performance (Sous wine c'est ignoble)

Une idée pour accélérer la chose ?

De plus, lors du rafraichissement, si la souris passe sur l'entête colonne, elle clignote.

Un moyen pour le désactiver ?

Code : Tout sélectionner

CompilerIf #PB_Compiler_Thread = 0
  CompilerError "Use Compileroption Threadsafe!"
CompilerEndIf

Enumeration
  #FDS_FRM
  #FDS_LST
  #FDS_COMBO
EndEnumeration

Global TEST1

Procedure FDS_WndProc(hwnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lParam
      Select *pnmh\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam
          
          Select *LVCDHeader\nmcd\hdr\hwndFrom
              
            Case TEST1
              Select *LVCDHeader\nmcd\dwDrawStage
                Case #CDDS_PREPAINT
                  result = #CDRF_NOTIFYITEMDRAW
                Case #CDDS_ITEMPREPAINT
                  result = #CDRF_NOTIFYSUBITEMDRAW
                Case #CDDS_SUBITEMPREPAINT
                  
                  Row = *LVCDHeader\nmcd\dwItemSpec
                  Col = *LVCDHeader\iSubItem  
                  
                  If Bool(GetGadgetText(#FDS_COMBO) = "TOUS")
                    If Col = 0
                      SetGadgetItemData(#FDS_LST, Row, Bool(GetGadgetItemText(#FDS_LST, Row, 6) = "NPY"))
                    EndIf
                    If GetGadgetItemData(#FDS_LST, Row) = #True
                      If Row & 1 = 0
                        *LVCDHeader\clrTextBk = RGB(244, 135, 160)
                      Else
                        *LVCDHeader\clrTextBk = RGB(246, 159, 179)
                      EndIf
                    Else
                      If Row & 1 = 0
                        *LVCDHeader\clrTextBk = RGB(240,240,240)
                      Else
                        *LVCDHeader\clrTextBk = RGB(210,210,210)
                      EndIf
                    EndIf
                  Else
                    If Row & 1 = 0
                      *LVCDHeader\clrTextBk = RGB(240,240,240)
                    Else
                      *LVCDHeader\clrTextBk = RGB(210,210,210)
                    EndIf
                  EndIf
                                                    
                  result = #CDRF_NEWFONT
                  
              EndSelect
          EndSelect
      EndSelect
  EndSelect
  
  ProcedureReturn result
    
EndProcedure

Procedure FDS_Remplir(parameter)
  Protected tmp.s
  Protected Dim tbl.s(4)
  Protected x.l
  
  tbl(1) = "CB" : tbl(2) = "ESP" : tbl(3) = "CHQ" : tbl(4) = "NPY"
    
  For x = 1 To 9999
    tmp = Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + tbl(Random(4,1))
    SendMessage_(GadgetID(#FDS_LST),#WM_SETREDRAW,#False,0)
    AddGadgetItem(#FDS_LST,-1,tmp,0)
    SendMessage_(GadgetID(#FDS_LST),#WM_SETREDRAW,#True,0)
  Next x
    
EndProcedure

Procedure FDS_frm_Open()
  Protected Width.l, Height.l
  
  Width  = 595
  Height = 630
  
  OpenWindow(#FDS_FRM,0,0, width, height, "LISTE", #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    
  TEST1 = ListIconGadget(#FDS_LST, 10, 10, 575, 490, "A", 50,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect)
  AddGadgetColumn(#FDS_LST, 1, "B", 50)
  AddGadgetColumn(#FDS_LST, 2, "C", 50)
  AddGadgetColumn(#FDS_LST, 3, "D", 50)
  AddGadgetColumn(#FDS_LST, 4, "E", 50)
  AddGadgetColumn(#FDS_LST, 5, "F", 50)
  AddGadgetColumn(#FDS_LST, 6, "G", 50)
  
  ComboBoxGadget(#FDS_COMBO,10,530,80,20)
  AddGadgetItem(#FDS_COMBO,-1,"TOUS")
  SetGadgetState(#FDS_COMBO,0)
     
  SetWindowCallback(@FDS_WndProc(),#FDS_FRM)
      
EndProcedure

Procedure FDS_Events()
 
Protected glEvent.l, glGadget.l, glType.l, glWindow.l

Repeat

glEvent  = WaitWindowEvent()
glGadget = EventGadget()
glType   = EventType()
glWindow = EventWindow()
glMenu   = EventMenu()

If glWindow = #FDS_FRM
  Select glEvent
    Case #PB_Event_CloseWindow
      End
  EndSelect
EndIf

ForEver

EndProcedure

FDS_frm_Open()
CreateThread(@FDS_Remplir(),0)
FDS_Events()
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par Demivec »

CaptainCrunch a écrit : dim. 29/août/2021 10:34Un moyen pour le désactiver ?
C'est simple :

Code : Tout sélectionner

Procedure FDS_Remplir(parameter)
  Protected tmp.s
  Protected Dim tbl.s(4)
  Protected x.l
  
  tbl(1) = "CB" : tbl(2) = "ESP" : tbl(3) = "CHQ" : tbl(4) = "NPY"
  SendMessage_(GadgetID(#FDS_LST),#WM_SETREDRAW,#False,0)  
  For x = 1 To 9999
   ; SendMessage_(GadgetID(#FDS_LST),#WM_SETREDRAW,#False,0)  
    tmp = Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + Str(x) + #LF$ + tbl(Random(4,1))
    AddGadgetItem(#FDS_LST,-1,tmp,0)
   ; SendMessage_(GadgetID(#FDS_LST),#WM_SETREDRAW,#True,0)
  Next x
  SendMessage_(GadgetID(#FDS_LST),#WM_SETREDRAW,#True,0)
EndProcedure
CaptainCrunch
Messages : 52
Inscription : dim. 29/juin/2014 6:32

Re: ListIconGadget - #NM_CUSTOMDRAW

Message par CaptainCrunch »

Bonjour Demivec

Oui, mais non...
Avec le refresh à la fin, c'est pas bon.
Lors de l'ajout d'un item avec la couleur rose, je vois que la case colorée et non la ligne....jusqu'au refresh
Répondre