TreeGadget ChangeIcon OnTheFly

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

TreeGadget ChangeIcon OnTheFly

Beitrag 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!
Zuletzt geändert von Kai am 09.05.2007 20:21, insgesamt 1-mal geändert.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag 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
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Kai am 31.05.2007 20:16, insgesamt 1-mal geändert.
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag von dige »

:allright:
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Antworten