Personnaliser les couleurs et police d'un listicongadget
Publié : jeu. 29/janv./2004 10:39
Un code que Denis m'a filé qui vient surement du forum des anglais et j'ai du corrigé car il était buggé
il permet de modifier pour chaque case indépendamment la couleur de fond, de texte et la police. super pratique en clair
il permet de modifier pour chaque case indépendamment la couleur de fond, de texte et la police. super pratique en clair
Code : Tout sélectionner
; 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()
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
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