Seite 1 von 1

TreeGadget ChangeIcon OnTheFly

Verfasst: 08.05.2007 23:34
von Kai
Ich bin mir sehr sicher das das der ein oder andere gebrauchen kann.
Hoffe haben sich keine Fehler eingeschlichen.

Ändert das Icon eines Eintrags im TreeGadget, anhand eines geladenen Icons.

Code: Alles auswählen

Schau Unten!

Verfasst: 09.05.2007 10:07
von dige
Funktioniert das auch mit Sub-Items?
Also zum Bsp.:

Code: Alles auswählen

[+] Item 1
  - Sub Item 1_1
  - Sub Item 1_2
[+] Item 2
  - Sub Item 2_1
  - Sub Item 2_2

Verfasst: 09.05.2007 16:56
von Kai
Das hab ich jetzt garnicht getestet,
aber ansich dürfte es auch funktionieren,
müßte ich erstmal sehen wie PureBasic da die ImageList verwaltet.

Verfasst: 09.05.2007 18:07
von Kai
So nun geht es auf jeden Fall.

Code: Alles auswählen

EnableExplicit

Procedure.s SystemPath()
 Protected Path.s = Space(#MAX_PATH)
 GetSystemDirectory_(@Path, #MAX_PATH)
 PathAddBackslash_(@Path)
 ProcedureReturn Path
EndProcedure

Procedure.l TreeGadget_ChangeIcon(Gadget, Index, hIcn)
 Protected hImgList.l, IcnIndex.l, II.TV_ITEM, x.l, nIcnIndex.l, AddBool.l
 If IsGadget(Gadget) <> 0 And GadgetType(Gadget) = #PB_GadgetType_Tree And Index >= 0 And Index < CountGadgetItems(Gadget)
  hImgList = SendMessage_(GadgetID(Gadget), #TVM_GETIMAGELIST, #LVSIL_NORMAL, #Null)
  If hImgList <> 0
   II\hitem = GadgetItemID(Gadget, Index)
   II\mask  = #TVIF_IMAGE
   If SendMessage_(GadgetID(Gadget), #TVM_GETITEM, #Null, @II) = 0: ProcedureReturn 0: EndIf
   IcnIndex = II\iImage
   If IcnIndex = 0: ProcedureReturn 0: EndIf
   For x = 0 To CountGadgetItems(Gadget) - 1
    II\hitem = GadgetItemID(Gadget, x)
    II\mask  = #TVIF_IMAGE
    If SendMessage_(GadgetID(Gadget), #TVM_GETITEM, #Null, @II) = 0: ProcedureReturn 0: EndIf
    If II\iImage = IcnIndex And x <> Index: AddBool = 1: Break: EndIf
   Next
   If AddBool = 1
    nIcnIndex = ImageList_AddIcon_(hImgList, hIcn)
    If nIcnIndex = -1: ProcedureReturn 0: EndIf
    II\hitem  = GadgetItemID(Gadget, Index)
    II\mask   = #TVIF_IMAGE
    II\iImage = nIcnIndex
    If SendMessage_(GadgetID(Gadget), #TVM_SETITEM, #Null, @II) = 0: ProcedureReturn 0: EndIf
    II\hitem          = GadgetItemID(Gadget, Index)
    II\mask           = #TVIF_SELECTEDIMAGE
    II\iSelectedImage = nIcnIndex
    If SendMessage_(GadgetID(Gadget), #TVM_SETITEM, #Null, @II) = 0: ProcedureReturn 0: EndIf
    If SendMessage_(GadgetID(Gadget), #TVM_SETIMAGELIST, #LVSIL_NORMAL, hImgList) <> 0: ProcedureReturn 1: EndIf
   Else
    If ImageList_ReplaceIcon_(hImgList, IcnIndex, hIcn) = -1: ProcedureReturn 0: EndIf
    If SendMessage_(GadgetID(Gadget), #TVM_SETIMAGELIST, #LVSIL_NORMAL, hImgList) <> 0: ProcedureReturn 1: EndIf
   EndIf
  EndIf
 EndIf
EndProcedure

If OpenWindow(0, 0, 0, 250, 150, "TreeGadget ChangeIcon", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) <> 0
 If CreateGadgetList(WindowID(0))
  TreeGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 37)
  ButtonGadget(1, 5, GadgetHeight(0) + 10, WindowWidth(0) - 10, 22, "Change Icons")
 EndIf
 Define hIcn.l
 ExtractIconEx_(SystemPath() + "SHELL32.dll", 3, #Null, @hIcn, 1)
 AddGadgetItem(0, -1, "Tree", hIcn, 0)
  AddGadgetItem(0, -1, "Eintrag", hIcn, 1)
  AddGadgetItem(0, -1, "Eintrag", hIcn, 1)
  SetGadgetState(0, 1)
 DestroyIcon_(hIcn)
EndIf

Procedure ChangeIcons()
 Static Bool.l: Protected hIcn1.l, hIcn2.l, IcnI1.l, IcnI2.l: Bool!1
 Select Bool
  Case 0: IcnI1 = 3: IcnI2 = 4
  Case 1: IcnI1 = 4: IcnI2 = 3
 EndSelect
 ExtractIconEx_(SystemPath() + "SHELL32.dll", IcnI1, #Null, @hIcn1, 1)
 ExtractIconEx_(SystemPath() + "SHELL32.dll", IcnI2, #Null, @hIcn2, 1)
 If hIcn1 <> 0 And hIcn2 <> 0
  TreeView_ChangeIcon(0, 0, hIcn1)
  TreeView_ChangeIcon(0, 1, hIcn2)
  TreeView_ChangeIcon(0, 2, hIcn2)
  DestroyIcon_(hIcn1): DestroyIcon_(hIcn2)
 EndIf
EndProcedure

Repeat
 Select WindowEvent()
  Case #PB_Event_Gadget
   Select EventGadget()
    Case 1: ChangeIcons()
   EndSelect
  Case #PB_Event_CloseWindow: End
  Case #False: Delay(1)
 EndSelect
ForEver

Verfasst: 11.05.2007 09:35
von dige
:allright:

Verfasst: 28.05.2007 08:20
von edel
Eine etwas kuerzere Version :

Code: Alles auswählen

Procedure CreateImageDrawBox(image,color)
  CreateImage(image,16,16)
  StartDrawing(ImageOutput(image))
  Box(0,0,16,16,$FFFFFF)
  Box(1,1,14,14,$0)
  Box(2,2,12,12,color)
  StopDrawing()
EndProcedure

Procedure InsertTreeImageList(hWnd,image)
  HiMg = SendMessage_(hWnd,#TVM_GETIMAGELIST,#TVSIL_NORMAL,0)
  If Not HiMg
    HiMg = ImageList_Create_(16,16,#ILC_COLOR32,1,5)
  EndIf 
  SendMessage_(hWnd,#TVM_SETIMAGELIST,#TVSIL_NORMAL,HiMg)
  ImageList_Add_(HiMg,image,0)
EndProcedure

Procedure _subclass_cb_(hWnd,uMsg,wParam,lParam)
  
  If uMsg = #WM_NOTIFY
    
    *notify.NMTREEVIEW = lParam
    
    If *notify\hdr\code = #TVN_SELCHANGED
      *notify\itemOld\mask = #TVIF_SELECTEDIMAGE 
      *notify\itemOld\iSelectedImage = 0
      SendMessage_(*notify\hdr\hwndFrom,#TVM_SETITEM,0,*notify\itemOld)
      *notify\itemNew\mask = #TVIF_SELECTEDIMAGE
      *notify\itemNew\iSelectedImage = 1
      SendMessage_(*notify\hdr\hwndFrom,#TVM_SETITEM,0,*notify\itemNew)  
    EndIf
    
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

hWnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,180,180,"leer")

CreateGadgetList(hWnd)
TreeGadget(0, 10, 10, 160, 160)       

CreateImageDrawBox(0,$0080FF)
CreateImageDrawBox(1,$804000)

InsertTreeImageList(GadgetID(0),ImageID(0))
InsertTreeImageList(GadgetID(0),ImageID(1))

For a = 0 To 3
  AddGadgetItem(0, -1, "Normal Item "+Str(a),0,0) 
  AddGadgetItem(0, -1, "Node        "+Str(a),0,0)        
  AddGadgetItem(0, -1, "Sub-Item 1  "       ,0,1)   
Next

SetWindowCallback(@_subclass_cb_(),0)

Repeat
  event = WaitWindowEvent() 
Until event = #PB_Event_CloseWindow