Basic Univers
; Auteur : Le Soldat Inconnu - Denis
; Version de PB : 3.90
;
; Explication du programme :
; Personnaliser l'affichage d'une ListIconGadget. La couleur de texte, couleur de fond et police de caractère sont personnalisables pour chaque élément.


; Constantes nécessaires a la procedure ListIconGadget_CustomDraw
#NM_CUSTOMDRAW = #NM_FIRST - 12
#CDDS_ITEM = $10000
#CDDS_SUBITEM = $20000
#CDDS_PREPAINT = $1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM | #CDDS_ITEMPREPAINT
#CDRF_DODEFAULT = $0
#CDRF_NEWFONT = $2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYSUBITEMDRAW = $20


; window callback permettant de personnaliser l'affichage du ListIconGadget
Declare.l ListIconGadget_CustomDraw(WindowID.l, Message.l, wParam.l, lParam.l)


; On charge des polices de caractères
Global FontReg.l, FontBold.l
FontReg = LoadFont(1, "Tahoma", 9)
FontBold = LoadFont(2, "Tahoma", 9, #PB_Font_Bold)

; On crée une fenêtre
OpenWindow(0, 0, 0, 356, 197, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "ListIconGadget_CustomDraw")
CreateGadgetList(WindowID(0))

; On crée un ListIconGadget avec 8 colonnes
Global ListGadget.l
ListGadget = ListIconGadget(1, 10, 10, 336, 177, "", 70, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
; il est important de stocker le Handle du ListIconGadget dans une variable global car il est utile pour la procedure ListIconGadget_CustomDraw()

; On ajoute des colonnes
AddGadgetColumn(1, 1, "Lun", 35)
AddGadgetColumn(1, 2, "Mar", 35)
AddGadgetColumn(1, 3, "Mer", 35)
AddGadgetColumn(1, 4, "Jeu", 35)
AddGadgetColumn(1, 5, "Ven", 35)
AddGadgetColumn(1, 6, "Sam", 35)
AddGadgetColumn(1, 7, "Dim", 35)

; On ajoute quelque ligne dans le ListIconGadget
For n = 0 To 23
  AddGadgetItem(1, - 1, Str(n) + Chr(10) + "XXX" + Chr(10) + Chr(10) + "XXX" + Chr(10) + Chr(10) + "XXX")
  ; Le chr(10) permet de passer à la case suivante (vers la droite)
Next

; On appelle la procedure permettant de personnaliser le ListIconGadget
SetWindowCallback(@ListIconGadget_CustomDraw())


Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_Event_CloseWindow


End





; window callback permettant de personnaliser l'affichage du ListIconGadget
Procedure.l ListIconGadget_CustomDraw(WindowID.l, Message.l, wParam.l, lParam.l)
  If Message = #WM_NOTIFY
    *LVCDHeader.NMLVCUSTOMDRAW = lParam
    If *LVCDHeader\nmcd\hdr\hWndFrom = ListGadget And *LVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
      Select *LVCDHeader\nmcd\dwDrawStage
      
        Case #CDDS_PREPAINT
          ProcedureReturn #CDRF_NOTIFYITEMDRAW
        
        Case #CDDS_ITEMPREPAINT
          ProcedureReturn #CDRF_NOTIFYSUBITEMDRAW
        
        Case #CDDS_SUBITEMPREPAINT
          ; Modifier la couleur de fond
          ; *LVCDHeader\clrTextBk = RGB(255, 255, 223)
          
          ; Modifier la couleur du texte
          ; *LVCDHeader\clrText = RGB(0, 0, 255)
          
          ; Modifier la police
          ; SelectObject_(*LVCDHeader\nmcd\hDC, FontBold)
          
          ; On récupère les coordonnées de la case à colorier
          Row.l = *LVCDHeader\nmcd\dwItemSpec
          Col.l = *LVCDHeader\iSubItem
          
          ; On personnalise la case en fonction de sa position
          If Col = 0
            SelectObject_(*LVCDHeader\nmcd\hDC, FontBold)
          Else
            SelectObject_(*LVCDHeader\nmcd\hDC, FontReg)
          EndIf
          If(Row/2) * 2 = Row
            *LVCDHeader\clrTextBk = RGB(255, 255, 223)
            If Col = 3
              *LVCDHeader\clrText = RGB(255, 0, 0)
            EndIf
          Else
            *LVCDHeader\clrTextBk = RGB(208, 208, 176)
            If Col = 3
              *LVCDHeader\clrText = RGB(0, 0, 255)
            EndIf
          EndIf
          
          ProcedureReturn #CDRF_NEWFONT
          
        Default
          ProcedureReturn #PB_ProcessPureBasicEvents
          
      EndSelect
    Else
      ProcedureReturn #PB_ProcessPureBasicEvents
    EndIf
  Else
    ProcedureReturn #PB_ProcessPureBasicEvents
  EndIf
EndProcedure


; Les structures utilisées dans la procedure ListIconGadget_CustomDraw

; Structure NMCUSTOMDRAW
;     hdr.NMHDR
;     dwDrawStage.l
;     hdc.l
;     rc.RECT
;     dwItemSpec.l
;     uItemState.l
;     lItemlParam.l
; EndStructure

; Structure NMLVCUSTOMDRAW
;     nmcd.NMCUSTOMDRAW
;     clrText.l
;     clrTextBk.l
;     iSubItem.l
;     dwItemType.l
;
;     clrFace.l
;     iIconEffect.l
;     iIconPhase.l
;     iPartId.l
;     iStateId.l
;
;     rcText.RECT
;     uAlign.l
; EndStructure