Page 1 sur 1

ListIconGadget - #NM_CUSTOMDRAW

Publié : dim. 15/août/2021 0:00
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()

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : dim. 15/août/2021 1:06
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

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : dim. 15/août/2021 1:11
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

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : lun. 16/août/2021 15:49
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:

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : mer. 18/août/2021 9:41
par Shadow
Je savais pas qu'on pouvais faire ça avec PB 8O

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : dim. 22/août/2021 20:43
par venom
Salut Marc56,

En effet sympa ton exemple. 8) Merci du partage






@++

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : dim. 29/août/2021 10:34
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()

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : jeu. 02/sept./2021 3:21
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

Re: ListIconGadget - #NM_CUSTOMDRAW

Publié : dim. 05/sept./2021 10:56
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