change ListIcon and Panel Gadget Tab, Images (!)

Just starting out? Need help? Post your questions and find answers here.
-pantcho-
User
User
Posts: 10
Joined: Tue Sep 21, 2004 8:49 pm
Contact:

change ListIcon and Panel Gadget Tab, Images (!)

Post by -pantcho- »

hello all, i wanted to know if there is any way to change a TAB image
AFTER i did addgadgetitem(...,useimage(x))
how can i change it on the fly? this goes also to listicon if i have certin item that if i change it status i want to change the icon also, how can it be done...?

thanks for you help guys. :)
Chris
User
User
Posts: 60
Joined: Wed Jun 11, 2003 4:54 pm
Location: Somewhere... But i can see you!

Post by Chris »

When i want to change the image on the PanelGadget(), i use this method.
I don't know if it is the best, but ... :!:

Code: Select all

Img1 = CreateImage(#PB_Any,16,16)
StartDrawing(ImageOutput())
Box(0,0,16,16,RGB($0,$FF,$0)) : Circle(8,8,8,RGB($0,$0,$FF))
StopDrawing()

Img2 = CreateImage(#PB_Any,16,16)
StartDrawing(ImageOutput())
Box(0,0,16,16,RGB($FF,$0,$0))
StopDrawing()

Img3 = CreateImage(#PB_Any,16,16)
StartDrawing(ImageOutput())
Box(0,0,16,16,RGB($FF,$0,$FF))
StopDrawing()

If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget")
  If CreateGadgetList(WindowID(0)) 
    PanelGadget     (0,8,8,306,203) 
    AddGadgetItem (0,-1,"Panel 1", UseImage(Img1)) 
    AddGadgetItem (0,-1,"Panel 2", UseImage(Img2)) 
    ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
    ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
    CloseGadgetList()
  EndIf
  
  ; I get the ImageList of the PanelGadget()
  hImageList = SendMessage_(GadgetID(0),#TCM_GETIMAGELIST, 0, 0)
  ; I change the image (s)
  ImageList_Replace_(hImageList, 1, UseImage(Img3),0)
  ImageList_Replace_(hImageList, 2, UseImage(Img1),0)
  
  Delay(3000) ; Just for see the change.
  
  ; And i apply the ImageList at the PanelGadget()
  SendMessage_(GadgetID(0),#TCM_SETIMAGELIST,0,hImageList)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Quit =  #True
    EndSelect
  Until Quit
EndIf 
My english is bad !!!... It's normal, i'm french :lol:
My english is not really the English.
It's the FrogLish (Froggy's English) ;)
-pantcho-
User
User
Posts: 10
Joined: Tue Sep 21, 2004 8:49 pm
Contact:

Post by -pantcho- »

:D :D :D
thanks chris! thats a nice example!!

and your english isnt bad at all!!! mine sucks!! :P
Chris
User
User
Posts: 60
Joined: Wed Jun 11, 2003 4:54 pm
Location: Somewhere... But i can see you!

Post by Chris »

Another way, for to change the image of the selected tab.
The selected tab have a green image, and all the unselected tabs have a red image.

Code: Select all

Img1 = CreateImage(#PB_Any,16,16)
StartDrawing(ImageOutput())
Box(0,0,16,16,RGB($0,$FF,$0))
StopDrawing()

Img2 = CreateImage(#PB_Any,16,16)
StartDrawing(ImageOutput())
Box(0,0,16,16,RGB($FF,$0,$0))
StopDrawing()


Global Img1,Img2,Img3,Img4, SelectedItem

Procedure ChangeImage(Index) ; change image on the fly
  ;déclare TC_ITEM structure, and set Mask to #TCIF_IMAGE
  pitem.TC_ITEM
  pitem\Mask = #TCIF_IMAGE
  
  pitem\iImage = 1 ; Index of the image for selected tab
  SendMessage_(GadgetID(0), #TCM_SETITEM, Index, @pitem)
  
  pitem\iImage = 2 ; Index of the image for unseleted tab
  SendMessage_(GadgetID(0), #TCM_SETITEM, SelectedItem, @pitem)
  
  SelectedItem = GetGadgetState(0) ; New value for selected tab
EndProcedure


If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget")
  If CreateGadgetList(WindowID(0)) 
    PanelGadget     (0,8,8,306,203) 
    AddGadgetItem (0,-1,"Panel 1",UseImage(Img1))
    AddGadgetItem (0,-1,"Panel 2",UseImage(Img2)) 
    AddGadgetItem (0,-1,"Panel 3",UseImage(Img2)) 
    AddGadgetItem (0,-1,"Panel 4",UseImage(Img2)) 
    ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
    ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
    CloseGadgetList()
  EndIf
  
  SelectedItem = GetGadgetState(0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Quit = 1
      Case #PB_EventGadget
        Select EventGadgetID()
          
          Case 0 ; call the ChangeImage procedure
            ChangeImage(GetGadgetState(0))
        EndSelect
    EndSelect
  Until = Quit = 1
EndIf 
:roll:
My english is bad !!!... It's normal, i'm french :lol:
My english is not really the English.
It's the FrogLish (Froggy's English) ;)
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

updated version for PB4.20 PB4.30
- this function updates only one panelgadget in your window.

Code: Select all


Procedure UpdatePanelIcons(panel) ; change panel images on the fly
   ;check index and selectedItem
   Static SelectedItem=-1
   If SelectedItem=-1
      SelectedItem=GetGadgetState(panel)
      ProcedureReturn
   EndIf
   Protected Index=GetGadgetState(panel)
   If Index=SelectedItem : ProcedureReturn : EndIf
   
   ;declare TC_ITEM structure, and set Mask to #TCIF_IMAGE
   Protected pitem1.TC_ITEM
   Protected pitem2.TC_ITEM
   pitem1\Mask=#TCIF_IMAGE
   pitem2\Mask=#TCIF_IMAGE
   
   ;get images
   SendMessage_(GadgetID(panel), #TCM_GETITEM, Index, @pitem1)
   SendMessage_(GadgetID(panel), #TCM_GETITEM, SelectedItem, @pitem2)
   
   ;swap images
   Swap pitem1\iImage, pitem2\iImage
   SendMessage_(GadgetID(panel), #TCM_SETITEM, Index, @pitem1)
   SendMessage_(GadgetID(panel), #TCM_SETITEM, SelectedItem, @pitem2)
   SelectedItem=GetGadgetState(panel) ; New value for selected tab   
EndProcedure

; ********************
; EXAMPLE
; ********************

Img1=CreateImage(#PB_Any, 16, 16)
StartDrawing(ImageOutput(Img1))
   Box(0, 0, 16, 16, RGB($0, $FF, $0))
StopDrawing()

Img2=CreateImage(#PB_Any, 16, 16)
StartDrawing(ImageOutput(Img2))
   Box(0, 0, 16, 16, RGB($FF, $0, $0))
StopDrawing()

OpenWindow(1, 0, 0, 300, 200, "Icon Updating", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CompilerIf #PB_Compiler_Version<430
   CreateGadgetList(WindowID(1))
CompilerEndIf

PanelGadget(2, 5, 5, 290, 190)
AddGadgetItem(2, -1, "TAB 1", ImageID(Img1))
AddGadgetItem(2, -1, "TAB 2", ImageID(Img2))
AddGadgetItem(2, -1, "TAB 3", ImageID(Img2))
CloseGadgetList()
UpdatePanelIcons(2)

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
      Case #PB_Event_Gadget
         If EventGadget()=2
            UpdatePanelIcons(2)
         EndIf 
   EndSelect
ForEver 

Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

Personally, I use this code :

Code: Select all

Enumeration
  #Window_0
EndEnumeration
Enumeration
  #Panel_0
EndEnumeration
Enumeration
  #Image_Panel_0_1
  #Image_Panel_0_2
EndEnumeration
DataSection
  Image_Panel_0_1:
  Data.l $00010000,$10100001,$00180000,$03680018,$00160000,$00280000,$00100000,$00200000,$00010000,$00000018,$03400000,$00000000
  Data.l $00000000,$00000000,$00000000,$47470000,$48484847,$4C464646,$27274C4C,$0C0C0C27,$04050505,$08080404,$08080808,$43080808
  Data.l $49494343,$48484849,$244B4B4B,$C4C42424,$D0D0D0C4,$CAC0C0C0,$A2A2CACA,$575757A2,$898D8D8D,$73738989,$7F7F7F73,$AE474747
  Data.l $D1D1AEAE,$DDDDDDD1,$4CC5C5C5,$BFBF4C4C,$CDCDCDBF,$C3BBBBBB,$AAAAC3C3,$3E3E3EAA,$A9878787,$7B7BA9A9,$8C8C8C7B,$A84C4C4C
  Data.l $CDCDA8A8,$DBDBDBCD,$47BFBFBF,$C0C04747,$CDCDCDC0,$C4BCBCBC,$A9A9C4C4,$3B3B3BA9,$97676767,$7D7D9797,$8989897D,$AB4B4B4B
  Data.l $D0D0ABAB,$DBDBDBD0,$48C0C0C0,$C0C04848,$CDCDCDC0,$C4BCBCBC,$A6A6C4C4,$585858A6,$61424242,$7E7E6161,$8181817E,$A1494949
  Data.l $C5C5A1A1,$D9D9D9C5,$48C0C0C0,$C0C04848,$CDCDCDC0,$C2BEBEBE,$BDBDC2C2,$A7A7A7BD,$A5AAAAAA,$A0A0A5A5,$A2A2A2A0,$A39E9E9E
  Data.l $A7A7A3A3,$BFBFBFA7,$47C4C4C4,$C0C04747,$CDCDCDC0,$B8BABBBB,$B9B9BBB8,$BFBFBFBC,$BFBEBEBE,$BEBEBFBF,$C0BCBCC0,$BBC1BDBD
  Data.l $BEBEC0BB,$BEBEBEBF,$47C4C4C4,$C1C14747,$CBCBCBC1,$EBCCCACA,$EBEBE0EB,$DEDEDEDF,$DEDEDFDF,$E9E9DEDE,$DEF2F2DE,$F1DEEFEF
  Data.l $E0E0DEF1,$C3C2C2DD,$47C3C3C3,$C1C14747,$C8C5C5C1,$BDDFEBEB,$B7B7FFBD,$FFFFFFFF,$FFFFFBFB,$C3C3FFFF,$FF8A8AFF,$8FFF9292
  Data.l $F8F8FF8F,$DEE1E1FF,$48BFBEBE,$C1C14848,$C8C3C3C1,$62DBF8F8,$6363FE62,$FEFFFFFD,$FEFEFFFF,$5E5EFEFE,$FE4E4EFE,$4EFEE4E4
  Data.l $7171FD4E,$DFF9F9FE,$48BFBABA,$C1C14848,$C8C3C3C1,$7CDCF3F3,$3C3CFF7C,$FF8D8DFE,$FFFF7676,$7777FFFF,$FF5D5DFF,$5FFFE4E4
  Data.l $8181FE5F,$DFF6F6FF,$48BFBBBB,$C1C14848,$C8C3C3C1,$75DCF5F5,$5F5FFF75,$FFE5E5FE,$59FF9B9B,$7676FF59,$FF4242FF,$43FF9595
  Data.l $AAAAFE43,$DFEFEFFF,$48BFBBBB,$C1C14848,$C8C3C3C1,$66DCF8F8,$5050FF66,$FFE5E5FE,$5BFF9A9A,$6060FF5B,$FF5353FF,$52FFEEEE
  Data.l $6E6EFE52,$E1FCFCFF,$48C1BCBC,$BFBF4848,$C5C3C3BF,$BFD9E4E4,$8181FDBF,$FD8A8AFC,$FFFD7979,$C3C3FDFF,$FD8080FD,$86FD8787
  Data.l $F3F3FC86,$D5D8D8FD,$49B4B4B4,$C9C94949,$D4D4D4C9,$FFE7E5E5,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
  Data.l $FFFFFFFF,$878686FF,$5B6A6B6B,$87875B5B,$C4C4C487,$C1BFC0C0,$BEBEC3C1,$C3BFBFC3,$C3C3BFBF,$C1C1C3C3,$C3BEBEC3,$BEC3BFBF
  Data.l $C2C2C3BE,$B8B8B8C3,$49BBBBBB,$00004949,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487
  Data.l $0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487
  Data.b $87,$C4
  Image_Panel_0_2:
  Data.l $00010000,$20200001,$00000010,$02E80000,$00160000,$00280000,$00200000,$00400000,$00010000,$00000004,$02000000,$00000000
  Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$80000080,$80000000,$00800080,$00800000,$80800080,$C0C00000,$808001C0
  Data.l $00000180,$FF0000FF,$FF000100,$00FF01FF,$00FF0000,$FFFF00FF,$FFFF0100,$000001FF,$00000000,$00000000,$00000000,$00000000
  Data.l $00000000,$00000000,$00008007,$00000000,$00000000,$07000000,$00808877,$00000000,$00000000,$77070000,$80887897,$00000000
  Data.l $00000000,$97778700,$888888FF,$00000080,$00000000,$FF278700,$88780700,$00000088,$00000000,$00FF8700,$780730B3,$00000088
  Data.l $00000000,$BB008F00,$073033B3,$00000078,$00000000,$BBBB8000,$303333F7,$00000007,$00000000,$FFBB0300,$333373BB,$00000030
  Data.l $00000000,$B3FF8378,$3033B77B,$00000000,$77000000,$37B78878,$0373BB37,$00000033,$78770000,$733B8878,$03B77B73,$000000BB
  Data.l $80787700,$B7838878,$0B0BB837,$000030BB,$00807877,$00808878,$8B3000BB,$778000B3,$00008078,$BB838878,$BBBB030B,$88870030
  Data.l $00000080,$BB838878,$33BB8B80,$70879000,$00AA0000,$33808878,$0033BBBB,$70870000,$0000AA00,$80808878,$00003333,$70879000
  Data.l $00AA00F0,$88808878,$00000000,$70870000,$0000AA00,$88808878,$00000080,$70870009,$00AA00F0,$88808878,$00000080,$70870000
  Data.l $0000AA00,$88808878,$09000080,$70870000,$880000F0,$88808878,$00090980,$70870000,$77880000,$88808878,$00000080,$70870000
  Data.l $FF778800,$88807877,$00000080,$70870000,$77FF7788,$78707777,$00000080,$88870000,$7777FF77,$77877877,$00000070,$77880000
  Data.l $777777FF,$78778778,$00000080,$88000000,$78777777,$80787787,$00000000,$00000000,$88787788,$00808888,$00000000,$00000000
  Data.l $00808800,$00000000,$00000000,$FFFF0000,$FFFFFFF9,$FFFF7FE0,$FEFF1F80,$FCFF0700,$FCFF0100,$FCFF0100,$FCFF0100,$FCFF0100
  Data.l $F0FF0100,$C0FF0300,$00FF0300,$00FC0100,$00F00100,$00C00100,$00000300,$00000700,$00000D00,$00003F00,$0000FD00,$0000FF07
  Data.l $0000FB03,$0000FF03,$0000EF03,$0000BF02,$0000FF03,$0000FF03,$0000FF03,$0000FF03,$00C0FF07,$00F0FF1F,$7FFCFF7F
  Data.b $FF,$FF
EndDataSection
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 301, 269, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    PanelGadget(#Panel_0, 16, 16, 262, 238)
      AddGadgetItem(#Panel_0, -1, "Tab #1", CatchImage(#Image_Panel_0_1, ?Image_Panel_0_1))
      AddGadgetItem(#Panel_0, -1, "Tab #2", CatchImage(#Image_Panel_0_2, ?Image_Panel_0_2))
    CloseGadgetList()
  EndIf
EndProcedure

; ======================================================================
Procedure SetPanelGadgetTabIcon(GadgetNumber.l, TabNumber.l, ImageNumber.l)
  Protected hImageList.l, pitem.TC_ITEM, hImg.l
  hImg = ImageID(ImageNumber)
  ; get the ImageList of the PanelGadget
  hImageList = SendMessage_(GadgetID(GadgetNumber), #TCM_GETIMAGELIST, 0, 0) 
  If hImageList = 0 ; no image list, create one
    hImageList = ImageList_Create_(16, 16, #ILC_COLOR32 | #ILC_MASK, 20, 100)
    SendMessage_(GadgetID(GadgetNumber), #TCM_SETIMAGELIST, 0, hImageList) 
  EndIf
  ; set image
  SendMessage_(GadgetID(GadgetNumber), #TCM_GETITEM, TabNumber, @pitem) 
  pitem\mask = #TCIF_IMAGE
  If pitem\iImage = 0 ; new image
    If GetObjectType_(hImg) = #OBJ_BITMAP 
      pitem\iImage = ImageList_Add_(hImageList, hImg, 0) 
    Else
      pitem\iImage = ImageList_ReplaceIcon_(hImageList, -1, hImg) 
    EndIf
  Else ; replace image
    If GetObjectType_(hImg) = #OBJ_BITMAP 
      pitem\iImage = ImageList_Replace_(hImageList, pitem\iImage, hImg, 0) 
    Else
      pitem\iImage = ImageList_ReplaceIcon_(hImageList, pitem\iImage, hImg) 
    EndIf
  EndIf 
  SendMessage_(GadgetID(GadgetNumber), #TCM_SETITEM, TabNumber, @pitem)
EndProcedure
Procedure ResetPanelGadgetTabIcon(GadgetNumber.l, TabNumber.l)
  Protected pitem.TC_ITEM
  SendMessage_(GadgetID(GadgetNumber), #TCM_GETITEM, TabNumber, @pitem) 
  pitem\mask = #TCIF_IMAGE
  pitem\iImage = -1
  SendMessage_(GadgetID(GadgetNumber), #TCM_SETITEM, TabNumber, @pitem)
EndProcedure
; ======================================================================

OpenWindow_Window_0()

Repeat
  
  While WindowEvent() : Wend
  
  ; demo
  i + 1
  If i % 2 = 0
    SetPanelGadgetTabIcon(#Panel_0, 0, #Image_Panel_0_1)
    SetPanelGadgetTabIcon(#Panel_0, 1, #Image_Panel_0_2)
  Else
    SetPanelGadgetTabIcon(#Panel_0, 0, #Image_Panel_0_2)
    SetPanelGadgetTabIcon(#Panel_0, 1, #Image_Panel_0_1)
  EndIf
  Delay(1000)
  If i = 10
    Break
  EndIf
  
ForEver
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

Do you know how to transfer a tab icon from a panelgadget to an other one ?
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

eddy wrote:Do you know how to transfer a tab icon from a panelgadget to an other one ?
I don't understand what you mean with 'transfer', but two panelgadgets can use the same image.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

I'm coding a drag'n'drop function for panelgadgets. http://www.purebasic.fr/english/viewtopic.php?t=34590
I need to copy an tab icon in my drop function.

Panel1 ---> tab + text + icon --> Panel2
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

eddy wrote:I'm coding a drag'n'drop function for panelgadgets. http://www.purebasic.fr/english/viewtopic.php?t=34590
I need to copy an tab icon in my drop function.
Panel1 ---> tab + text + icon --> Panel2
Stupid question (I didn't try) : copying the tab info with #TCM_GETITEM from the 1st panel and pasting it with #TCM_SETITEM in the 2nd panel doesn't work ?
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

#TCM_SETITEM will only update the image index to use.

Each panel have a specific imagelist.
The problem is to update these imagelists.

I will post a code sample to make some tests. It will be easier to see the problem :wink:
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

eddy wrote:#TCM_SETITEM will only update the image index to use.
If you know the image list [TCM_GETIMAGELIST] and the image index [TCM_GETITEM] in this list, iirc you can get the image handle with ImageList_GetImageInfo_().
So you can add the image handle to the 2nd panel image list and then use TCM_SETITEM.
I don't have PB available right now to test some code, sorry.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

I don't have PB available right now to test some code, sorry
Me too :wink:
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

- fixed code -
Here is my test code
... I found the solution. :D

Code: Select all


; ********************
; EXAMPLE
; ********************

Ico1=CreateImage(#PB_Any, 16, 16)
StartDrawing(ImageOutput(Ico1))
   Box(0, 0, 16, 16, RGB($0, $FF, $0))
StopDrawing()

Ico2=CreateImage(#PB_Any, 16, 16)
StartDrawing(ImageOutput(Ico2))
   Box(0, 0, 16, 16, RGB($FF, $0, $0))
StopDrawing()

OpenWindow(1, 0, 0, 300, 100, "Copy panelgadget icon", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CompilerIf #PB_Compiler_Version<430
   CreateGadgetList(WindowID(1))
CompilerEndIf

PanelGadget(2, 5, 5, 90, 90)
AddGadgetItem(2, -1, "Source", ImageID(Ico1))
CloseGadgetList()

PanelGadget(3, 100, 5, 190, 90)
AddGadgetItem(3, -1, "Target", ImageID(Ico2))
CloseGadgetList()

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
      Case #PB_Event_Gadget
         
         TempIcon=CreateImage(#PB_Any, 16, 16)
         AddGadgetItem(3, 1, "New", ImageID(TempIcon))
         
         TC_ITEM.TC_ITEM
         TC_ITEM\Mask=#TCIF_IMAGE
         
         ;icon to copy
         SendMessage_(GadgetID(2), #TCM_GETITEM, 0, @TC_ITEM.TC_ITEM)
         i1=TC_ITEM\iImage
         l1=SendMessage_(GadgetID(2), #TCM_GETIMAGELIST, 0, 0)
         icoToCopy=ImageList_GetIcon_(l1, i1, #ILD_TRANSPARENT)
         
         ;icon to replace
         SendMessage_(GadgetID(3), #TCM_GETITEM, 1, @TC_ITEM.TC_ITEM)
         i2=TC_ITEM\iImage
         l2=SendMessage_(GadgetID(3), #TCM_GETIMAGELIST, 0, 0)
         ImageList_ReplaceIcon_(l2, i2, icoToCopy)
         
   EndSelect
ForEver
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
javabean
User
User
Posts: 60
Joined: Sat Nov 08, 2003 10:29 am
Location: Austria

Re: change ListIcon and Panel Gadget Tab, Images (!)

Post by javabean »

There is a kind of memory leak in Gnozal's procedure.
pitem\mask = #TCIF_IMAGE has to be set BEFORE the #TCM_GETITEM message is sent. Otherwise "pitem\iImage" is always 0 and every time the procedure is called an image is added to to Imagelist.

Here is a fixed version of Gnozal's code:

Code: Select all

Enumeration
  #Window_0
EndEnumeration
Enumeration
  #Panel_0
  #Button_0
EndEnumeration
Enumeration
  #Image_Panel_0_1
  #Image_Panel_0_2
EndEnumeration

Define.i Event, EventWindow, EventGadget, EventType, EventMenu, cnt


Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 301, 269, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    
    PanelGadget(#Panel_0, 16, 16, 262, 238)
      AddGadgetItem(#Panel_0, -1, "Tab #1", CatchImage(#Image_Panel_0_1, ?Image_Panel_0_1))
        ButtonGadget(#Button_0,5,5,100,30,"Button")

      AddGadgetItem(#Panel_0, -1, "Tab #2", CatchImage(#Image_Panel_0_2, ?Image_Panel_0_2))
    CloseGadgetList()
               
  EndIf
EndProcedure

; ======================================================================
Procedure SetPanelGadgetTabIcon(GadgetNumber.i, TabNumber.i, ImageNumber.i)
  Protected hImageList.i, pitem.TC_ITEM, hImg.i
  
  hImg = ImageID(ImageNumber)
  
  ; get the ImageList of the PanelGadget
  hImageList = SendMessage_(GadgetID(GadgetNumber), #TCM_GETIMAGELIST, 0, 0)
  If hImageList = 0 ; no image list, create one
    hImageList = ImageList_Create_(16, 16, #ILC_COLOR32 | #ILC_MASK, 20, 100)
    SendMessage_(GadgetID(GadgetNumber), #TCM_SETIMAGELIST, 0, hImageList)
  EndIf
  
  ; set image
  pitem\mask = #TCIF_IMAGE     ;set  pitem\mask BEFORE calling the #TCM_GETITEM message
  SendMessage_(GadgetID(GadgetNumber), #TCM_GETITEM, TabNumber, @pitem)
  
  If pitem\iImage = 0 ; new image
    If GetObjectType_(hImg) = #OBJ_BITMAP
      pitem\iImage = ImageList_Add_(hImageList, hImg, 0)
    Else
      pitem\iImage = ImageList_ReplaceIcon_(hImageList, -1, hImg)
    EndIf
  Else ; replace image
    If GetObjectType_(hImg) = #OBJ_BITMAP
      pitem\iImage = ImageList_Replace_(hImageList, pitem\iImage, hImg, 0)
    Else
      pitem\iImage = ImageList_ReplaceIcon_(hImageList, pitem\iImage, hImg)
    EndIf
  EndIf
  SendMessage_(GadgetID(GadgetNumber), #TCM_SETITEM, TabNumber, @pitem)
EndProcedure


Procedure ResetPanelGadgetTabIcon(GadgetNumber.i, TabNumber.i)
  Protected pitem.TC_ITEM
  pitem\mask = #TCIF_IMAGE
  SendMessage_(GadgetID(GadgetNumber), #TCM_GETITEM, TabNumber, @pitem)
  pitem\iImage = -1
  SendMessage_(GadgetID(GadgetNumber), #TCM_SETITEM, TabNumber, @pitem)
EndProcedure
; ======================================================================

OpenWindow_Window_0()
cnt = 1

Repeat
 
  Select WaitWindowEvent()
    
    Case #PB_Event_CloseWindow
      quit = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_0
          If cnt%2
            SetPanelGadgetTabIcon(#Panel_0, 0, #Image_Panel_0_2)
            SetPanelGadgetTabIcon(#Panel_0, 1, #Image_Panel_0_1)
          Else
            SetPanelGadgetTabIcon(#Panel_0, 0, #Image_Panel_0_1)
            SetPanelGadgetTabIcon(#Panel_0, 1, #Image_Panel_0_2)        
          EndIf
          cnt = cnt+1
      EndSelect
  
  EndSelect
 
Until quit = 1
End

DataSection
  Image_Panel_0_1:
  Data.l $00010000,$10100001,$00180000,$03680018,$00160000,$00280000,$00100000,$00200000,$00010000,$00000018,$03400000,$00000000
  Data.l $00000000,$00000000,$00000000,$47470000,$48484847,$4C464646,$27274C4C,$0C0C0C27,$04050505,$08080404,$08080808,$43080808
  Data.l $49494343,$48484849,$244B4B4B,$C4C42424,$D0D0D0C4,$CAC0C0C0,$A2A2CACA,$575757A2,$898D8D8D,$73738989,$7F7F7F73,$AE474747
  Data.l $D1D1AEAE,$DDDDDDD1,$4CC5C5C5,$BFBF4C4C,$CDCDCDBF,$C3BBBBBB,$AAAAC3C3,$3E3E3EAA,$A9878787,$7B7BA9A9,$8C8C8C7B,$A84C4C4C
  Data.l $CDCDA8A8,$DBDBDBCD,$47BFBFBF,$C0C04747,$CDCDCDC0,$C4BCBCBC,$A9A9C4C4,$3B3B3BA9,$97676767,$7D7D9797,$8989897D,$AB4B4B4B
  Data.l $D0D0ABAB,$DBDBDBD0,$48C0C0C0,$C0C04848,$CDCDCDC0,$C4BCBCBC,$A6A6C4C4,$585858A6,$61424242,$7E7E6161,$8181817E,$A1494949
  Data.l $C5C5A1A1,$D9D9D9C5,$48C0C0C0,$C0C04848,$CDCDCDC0,$C2BEBEBE,$BDBDC2C2,$A7A7A7BD,$A5AAAAAA,$A0A0A5A5,$A2A2A2A0,$A39E9E9E
  Data.l $A7A7A3A3,$BFBFBFA7,$47C4C4C4,$C0C04747,$CDCDCDC0,$B8BABBBB,$B9B9BBB8,$BFBFBFBC,$BFBEBEBE,$BEBEBFBF,$C0BCBCC0,$BBC1BDBD
  Data.l $BEBEC0BB,$BEBEBEBF,$47C4C4C4,$C1C14747,$CBCBCBC1,$EBCCCACA,$EBEBE0EB,$DEDEDEDF,$DEDEDFDF,$E9E9DEDE,$DEF2F2DE,$F1DEEFEF
  Data.l $E0E0DEF1,$C3C2C2DD,$47C3C3C3,$C1C14747,$C8C5C5C1,$BDDFEBEB,$B7B7FFBD,$FFFFFFFF,$FFFFFBFB,$C3C3FFFF,$FF8A8AFF,$8FFF9292
  Data.l $F8F8FF8F,$DEE1E1FF,$48BFBEBE,$C1C14848,$C8C3C3C1,$62DBF8F8,$6363FE62,$FEFFFFFD,$FEFEFFFF,$5E5EFEFE,$FE4E4EFE,$4EFEE4E4
  Data.l $7171FD4E,$DFF9F9FE,$48BFBABA,$C1C14848,$C8C3C3C1,$7CDCF3F3,$3C3CFF7C,$FF8D8DFE,$FFFF7676,$7777FFFF,$FF5D5DFF,$5FFFE4E4
  Data.l $8181FE5F,$DFF6F6FF,$48BFBBBB,$C1C14848,$C8C3C3C1,$75DCF5F5,$5F5FFF75,$FFE5E5FE,$59FF9B9B,$7676FF59,$FF4242FF,$43FF9595
  Data.l $AAAAFE43,$DFEFEFFF,$48BFBBBB,$C1C14848,$C8C3C3C1,$66DCF8F8,$5050FF66,$FFE5E5FE,$5BFF9A9A,$6060FF5B,$FF5353FF,$52FFEEEE
  Data.l $6E6EFE52,$E1FCFCFF,$48C1BCBC,$BFBF4848,$C5C3C3BF,$BFD9E4E4,$8181FDBF,$FD8A8AFC,$FFFD7979,$C3C3FDFF,$FD8080FD,$86FD8787
  Data.l $F3F3FC86,$D5D8D8FD,$49B4B4B4,$C9C94949,$D4D4D4C9,$FFE7E5E5,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
  Data.l $FFFFFFFF,$878686FF,$5B6A6B6B,$87875B5B,$C4C4C487,$C1BFC0C0,$BEBEC3C1,$C3BFBFC3,$C3C3BFBF,$C1C1C3C3,$C3BEBEC3,$BEC3BFBF
  Data.l $C2C2C3BE,$B8B8B8C3,$49BBBBBB,$00004949,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487
  Data.l $0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487,$0000C487
  Data.b $87,$C4
  Image_Panel_0_2:
  Data.l $00010000,$20200001,$00000010,$02E80000,$00160000,$00280000,$00200000,$00400000,$00010000,$00000004,$02000000,$00000000
  Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$80000080,$80000000,$00800080,$00800000,$80800080,$C0C00000,$808001C0
  Data.l $00000180,$FF0000FF,$FF000100,$00FF01FF,$00FF0000,$FFFF00FF,$FFFF0100,$000001FF,$00000000,$00000000,$00000000,$00000000
  Data.l $00000000,$00000000,$00008007,$00000000,$00000000,$07000000,$00808877,$00000000,$00000000,$77070000,$80887897,$00000000
  Data.l $00000000,$97778700,$888888FF,$00000080,$00000000,$FF278700,$88780700,$00000088,$00000000,$00FF8700,$780730B3,$00000088
  Data.l $00000000,$BB008F00,$073033B3,$00000078,$00000000,$BBBB8000,$303333F7,$00000007,$00000000,$FFBB0300,$333373BB,$00000030
  Data.l $00000000,$B3FF8378,$3033B77B,$00000000,$77000000,$37B78878,$0373BB37,$00000033,$78770000,$733B8878,$03B77B73,$000000BB
  Data.l $80787700,$B7838878,$0B0BB837,$000030BB,$00807877,$00808878,$8B3000BB,$778000B3,$00008078,$BB838878,$BBBB030B,$88870030
  Data.l $00000080,$BB838878,$33BB8B80,$70879000,$00AA0000,$33808878,$0033BBBB,$70870000,$0000AA00,$80808878,$00003333,$70879000
  Data.l $00AA00F0,$88808878,$00000000,$70870000,$0000AA00,$88808878,$00000080,$70870009,$00AA00F0,$88808878,$00000080,$70870000
  Data.l $0000AA00,$88808878,$09000080,$70870000,$880000F0,$88808878,$00090980,$70870000,$77880000,$88808878,$00000080,$70870000
  Data.l $FF778800,$88807877,$00000080,$70870000,$77FF7788,$78707777,$00000080,$88870000,$7777FF77,$77877877,$00000070,$77880000
  Data.l $777777FF,$78778778,$00000080,$88000000,$78777777,$80787787,$00000000,$00000000,$88787788,$00808888,$00000000,$00000000
  Data.l $00808800,$00000000,$00000000,$FFFF0000,$FFFFFFF9,$FFFF7FE0,$FEFF1F80,$FCFF0700,$FCFF0100,$FCFF0100,$FCFF0100,$FCFF0100
  Data.l $F0FF0100,$C0FF0300,$00FF0300,$00FC0100,$00F00100,$00C00100,$00000300,$00000700,$00000D00,$00003F00,$0000FD00,$0000FF07
  Data.l $0000FB03,$0000FF03,$0000EF03,$0000BF02,$0000FF03,$0000FF03,$0000FF03,$0000FF03,$00C0FF07,$00F0FF1F,$7FFCFF7F
  Data.b $FF,$FF
EndDataSection
Post Reply