j'ai ça avec un treegadet, avec de l'ownerdraw.
Faut que je zieute pour un listicon, je dois avoir aussi.
--------------
Pas mieux que Ar-S, je ne personnalise pas la couleur de sélection.
j'ai ceci avec les treegadget. et la j'ai des couleur persos, même sur la sélection
Code : Tout sélectionner
Procedure.l TreeGadget_CustomDraw(WindowID.l, Message.l, wParam.l, lParam.l)
#NM_CUSTOMDRAW = #NM_FIRST - 12
#CDDS_ITEM = $10000
#CDDS_SUBITEM = $20000
#CDDS_PREPAINT = $1
#CDDS_POSTPAINT = $2
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM | #CDDS_ITEMPREPAINT
#CDRF_DODEFAULT = $0
#CDRF_NEWFONT = $2
#CDRF_SKIPDEFAULT = $4
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYPOSTPAINT = $10
#CDRF_NOTIFYSUBITEMDRAW = $20
#CDRF_NOTIFYPOSTERASE = $40
#CDIS_SELECTED = $1
#CDIS_CHECKED = $8
Select Message
Case #WM_NOTIFY
*TVCDHeader.NMTVCUSTOMDRAW = lParam
If *TVCDHeader\nmcd\hdr\hWndFrom = GadgetID(#RechercheFichier_Tree) And *TVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
Select *TVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
; Modifier la couleur de fond
; *TVCDHeader\clrTextBk = RGB(255, 255, 223)
; Modifier la couleur du texte
; *TVCDHeader\clrText = RGB(0, 0, 0)
; Modifier la police
; SelectObject_(*TVCDHeader\nmcd\hDC, FontBold)
; Le numéro de la ligne affichée
item = -1
For n = 0 To CountGadgetItems(#RechercheFichier_Tree) - 1
If GadgetItemID(#RechercheFichier_Tree, n) = *TVCDHeader\nmcd\dwItemSpec
item = n
Break
EndIf
Next
If item >= 0 And item < ListSize(RechercheFichier()) And *TVCDHeader\nmcd\rc\right <> 0
; *TVCDHeader\nmcd\rc\Right <> 0
; Quand le TreeGadget est trop petit pour afficher le texte en entier, un ToolTip apparait et dans ce cas la zone de dessin est nulle
; il faut donc filtrer cet affichage
Level.l = *TVCDHeader\iLevel ; Le niveau de l'item (dans combien de noeuds il se trouve)
*TVCDHeader\nmcd\rc\Left - GetScrollPos_(GadgetID(#RechercheFichier_Tree), #SB_HORZ) ; Prendre en compte le décalage horizontal
SelectElement(RechercheFichier(), item)
pitem.TV_ITEM\mask = #TVIF_IMAGE
pitem\hItem = *TVCDHeader\nmcd\dwItemSpec
SendMessage_(GadgetID(#RechercheFichier_Tree), #TVM_GETITEM, 0, pitem)
If pitem\iImage = 0 ; Si pas d'image
If RechercheFichier() \Taille1 = -1
Fichier.s = DossierRecherche2 + RechercheFichier() \Nom1
Else
Fichier.s = DossierRecherche1 + RechercheFichier() \Nom1
EndIf
SHGetFileInfo_(Fichier, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
If InfosFile\iIcon = 0
InfosFile\iIcon = -1
EndIf
pitem.TV_ITEM\mask = #TVIF_IMAGE | #TVIF_SELECTEDIMAGE
pitem\iImage = InfosFile\iIcon
SendMessage_(GadgetID(#RechercheFichier_Tree), #TVM_SETITEM, 0, pitem)
EndIf
FillRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBackGround_Normal)
; Le niveau de l'item (dans combien de node il se trouve)
*TVCDHeader\nmcd\rc\Left + Level * #Tree_Indent
SetBkMode_(*TVCDHeader\nmcd\hDC, #TRANSPARENT)
ItemExpanded = GetGadgetItemState(#RechercheFichier_Tree, item)
ItemSelected = ItemExpanded & #PB_Tree_Selected
ItemExpanded = ItemExpanded & #PB_Tree_Expanded
If GetFocus_() = GadgetID(#RechercheFichier_Tree)
Focus = 1
Else
Focus = 0
EndIf
If ItemSelected And Focus
Image1 + 6
Image2 + 6
ColorBackGround = ColorBackGround_Selected
ColorBorder = ColorBorder_Selected
SetTextColor_(*TVCDHeader\nmcd\hDC, #ColorText_NormalSelected)
Else
ColorBackGround = ColorBackGround_Normal
If ItemSelected
ColorBorder = ColorBorder_Selected
Else
ColorBorder = ColorBorder_Normal
EndIf
SetTextColor_(*TVCDHeader\nmcd\hDC, #ColorText_Normal)
EndIf
If RechercheFichier() \Type = 1 Or RechercheFichier() \Taille1 = -1 Or RechercheFichier() \Taille2 = -1 Or RechercheFichier() \DossierVide = 1
Image1 + #Fichier0
Image2 + #Fichier0
If RechercheFichier() \Synchro = 0
If ItemSelected And Focus
SetTextColor_(*TVCDHeader\nmcd\hDC, #ColorText_DisableSelected)
Else
SetTextColor_(*TVCDHeader\nmcd\hDC, #ColorText_Disable)
EndIf
EndIf
Else
Image1 + #Dossier0
Image2 + #Dossier0
If ItemExpanded
Image = #Tree_Glyph_Opened
Else
Image = #Tree_Glyph_Closed
EndIf
DrawState_(*TVCDHeader\nmcd\hDC, 0, 0, ImageID(Image), 0, *TVCDHeader\nmcd\rc\Left, *TVCDHeader\nmcd\rc\Top, #Tree_Indent, #Tree_ItemHeight, #DST_BITMAP | #DSS_NORMAL)
EndIf
Select RechercheFichier() \Synchro
Case -1
If RechercheFichier() \Taille2 = -1
Image1 - 1
Else
Image2 + 1
EndIf
Case 1
If RechercheFichier() \Taille1 = -1
Image2 - 1
Else
Image1 + 1
EndIf
EndSelect
*TVCDHeader\nmcd\rc\Left + #Tree_Indent
DrawState_(*TVCDHeader\nmcd\hDC, 0, 0, ImageID(Image1), 0, *TVCDHeader\nmcd\rc\Left, *TVCDHeader\nmcd\rc\Top +(#Tree_ItemHeight - #CheckBox_Size) / 2, #CheckBox_Size, #CheckBox_Size, #DST_BITMAP | #DSS_NORMAL)
DrawState_(*TVCDHeader\nmcd\hDC, 0, 0, ImageID(Image2), 0, *TVCDHeader\nmcd\rc\Left + #CheckBox_Size + 1, *TVCDHeader\nmcd\rc\Top +(#Tree_ItemHeight - #CheckBox_Size) / 2, #CheckBox_Size, #CheckBox_Size, #DST_BITMAP | #DSS_NORMAL)
If pitem\iImage > 0
himl = SendMessage_(GadgetID(Gadget), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0)
ImageList_Draw_(himl, pitem\iImage, *TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc\Left + 2 * #CheckBox_Size + 8, *TVCDHeader\nmcd\rc\Top +(#Tree_ItemHeight - 16) / 2, #ILD_NORMAL)
EndIf
Txt.s = ReplaceString(GetFilePart(RechercheFichier() \Nom1), "&", "&&")
GetTextExtentPoint32_(*TVCDHeader\nmcd\hDC, Txt, Len(Txt), TxtSize.SIZE)
*TVCDHeader\nmcd\rc\Left + 2 * #CheckBox_Size + 8 + 16 + 3
*TVCDHeader\nmcd\rc\right = *TVCDHeader\nmcd\rc\Left + 6 + TxtSize\cx
FillRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBackGround)
FrameRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBorder)
*TVCDHeader\nmcd\rc\Left + 3
DrawTextEx_(*TVCDHeader\nmcd\hDC, Txt, -1, *TVCDHeader\nmcd\rc, #DT_EXPANDTABS | #DT_VCENTER | #DT_SINGLELINE, 0)
EndIf
ProcedureReturn #CDRF_SKIPDEFAULT
EndSelect
EndIf
Case #WM_GETMINMAXINFO
If WindowID = WindowID(0)
RtlMoveMemory_(@MinMax.MINMAXINFO, lParam, SizeOf(MINMAXINFO))
; Taille minimum de la fenêtre
MinMax\ptMinTrackSize\x = #WindowW_Min + WinCaptionSize\Edge * 2
MinMax\ptMinTrackSize\y = #WindowH_Min + WinCaptionSize\Title + WinCaptionSize\Edge
RtlMoveMemory_(lParam, @MinMax, SizeOf(MINMAXINFO))
EndIf
EndSelect
En gros, j'efface tout et je redessine moi même
Code : Tout sélectionner
FillRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBackGround_Normal)
dessine le fond
Code : Tout sélectionner
Txt.s = ReplaceString(GetFilePart(RechercheFichier() \Nom1), "&", "&&")
GetTextExtentPoint32_(*TVCDHeader\nmcd\hDC, Txt, Len(Txt), TxtSize.SIZE)
*TVCDHeader\nmcd\rc\Left + 2 * #CheckBox_Size + 8 + 16 + 3
*TVCDHeader\nmcd\rc\right = *TVCDHeader\nmcd\rc\Left + 6 + TxtSize\cx
FillRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBackGround)
FrameRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBorder)
*TVCDHeader\nmcd\rc\Left + 3
DrawTextEx_(*TVCDHeader\nmcd\hDC, Txt, -1, *TVCDHeader\nmcd\rc, #DT_EXPANDTABS | #DT_VCENTER | #DT_SINGLELINE, 0)
dessine le texte
il reste à le transformer pour une listicon