Je voudrai imposer la couleur de la barre de sélection dans un ListIconGadget lorsque l'on click sur la ligne.
Apparement j'ai rien trouvé sur le sujet.
quelqu'un aurait'il une solution.

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 <span class="posthilit">ListIconGadget</span>
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, "ListIconGadget_CustomDraw",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
; On crée un <span class="posthilit">ListIconGadget</span> avec 8 colonnes
Global posthilit.l
posthilit = <span class="posthilit">ListIconGadget</span>(1, 10, 10, 336, 177,"", 70, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
; il est important de stocker le Handle du <span class="posthilit">ListIconGadget</span> 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 <span class="posthilit">ListIconGadget</span>
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 <span class="posthilit">ListIconGadget</span>
SetWindowCallback(@ListIconGadget_CustomDraw())
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
End
; window callback permettant de personnaliser l'affichage du <span class="posthilit">ListIconGadget</span>
Procedure.l ListIconGadget_CustomDraw(WindowID.l, Message.l, wParam.l, lParam.l)
If Message = #WM_NOTIFY
*LVCDHeader.NMLVCUSTOMDRAW = lParam
If *LVCDHeader\nmcd\hdr\hWndFrom = posthilit 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 <span class="posthilit">couleur</span> de fond
; *LVCDHeader\clrTextBk = RGB(255, 255, 223)
; Modifier la <span class="posthilit">couleur</span> 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
Je te remerçie , mais ce n'est pas tout a fait cela.Ar-S a écrit :Ba il me semble bien que c'est ce qui se produit non ?
Essaye mon Resize 3 (beta version donc ne pas diffuser)
http://ldvmultimedia.com/downloads_beta ... beta10.zip
Clique sur l'icone "My choice" en bas à droite de l'interface.
Un ExplorerListGadget apparait, je pense qu'il produit ce que tu cherches (va dans un répertoire contenant des images).
Essaye en sélectionnant différentes images.
Si ça te convient je poste le code.
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
Code : Tout sélectionner
FillRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBackGround_Normal)
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)
Je ne me rappelle plus si tu as la demo ou pas dayvid. Si oui, c'est normal, sinon... ba je sais pas.dayvid a écrit :pourquoi moi rien ne marche ? '4.40, 4.50'
Code : Tout sélectionner
posthilit = <span class="posthilit">ListIconGadget</span>(1, 10, 10, 336, 177,"", 70, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)