Special ListIconGadget() [Windows]

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Special ListIconGadget() [Windows]

Post by RASHAD »

- Very flexible
- Adapt it for your needs
- Left Click to switch icons

Have fun
RASHAD

Code: Select all

 #HDF_IMAGE = $800
 #HDI_IMAGE = $20
 
UsePNGImageDecoder()

Global oldproc, header_h ,Header,cell.LVHITTESTINFO,ii.lv_item

Procedure SetImg(Row,Col,Img)
  ii\mask     =  #LVIF_IMAGE
  ii\iItem    = Row
  ii\iSubItem = Col
  ii\iImage   = Img
  SendMessage_(GadgetID(0), #LVM_SETITEM, 0, @ii)
EndProcedure

Procedure GetImg(Row,Col)
  ii\mask     =  #LVIF_IMAGE
  ii\iItem    = Row
  ii\iSubItem = Col
  SendMessage_(GadgetID(0), #LVM_GETITEM, 0, @ii)
EndProcedure

Procedure HeaderImg(Col,Img)             
  hi.HDITEM
  hi\mask   = #HDI_IMAGE
  hi\fmt    = #HDF_IMAGE
  hi\iImage = Img
  SendMessage_(Header , #HDM_SETITEM, Col, @hi)
EndProcedure

Procedure Hheight(hWnd, uMsg, wParam, lParam)
   Select uMsg
      Case #HDM_LAYOUT
        result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
        *hdlayout.HD_LAYOUT = lParam
        If *hdlayout\prc <> 0
            *rect.RECT = *hdlayout\prc
            *rect\top = header_h
        EndIf
        If *hdlayout\pwpos <> 0
            *windowpos.WINDOWPOS = *hdlayout\pwpos
            *windowpos\cy = header_h
        EndIf
     
      Default
        result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
           
    EndSelect
    ProcedureReturn result
EndProcedure

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
result = #PB_ProcessPureBasicEvents 
  Select uMsg

   Case #WM_SIZE
        ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-60)
        
   Case #WM_NOTIFY
        *NMHDR.NMHDR = lParam
           If *NMHDR\hWndFrom = GetWindow_(GadgetID(0),#GW_CHILD) And *NMHDR\code = #HDN_FIRST
              *phdn.NMHEADER = lParam
              row = *phdn\iItem                 
              If  row = 0 Or row = 1 Or row = 2  Or row = 3 
                    ProcedureReturn 1
              EndIf
           EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

CreateImage(0,26,20,24,#White)
CatchImage(1,?CBox0) 
CatchImage(2,?CBox1)
CatchImage(3,?Circle0)
CatchImage(4,?Circle1)
CatchImage(5,?Ocircle0)
CatchImage(6,?Ocircle1)

iinf.ICONINFO
iinf\fIcon = 1

iinf\hbmMask = ImageID(0)
iinf\hbmColor = ImageID(0)

Icwnd0 = CreateIconIndirect_(iinf)

iinf\hbmMask = ImageID(1)
iinf\hbmColor = ImageID(1)

Icwnd1 = CreateIconIndirect_(iinf)

iinf\hbmMask = ImageID(2)
iinf\hbmColor = ImageID(2)

Icwnd2 = CreateIconIndirect_(iinf)

iinf\hbmMask = ImageID(3)
iinf\hbmColor = ImageID(3)

Icwnd3 = CreateIconIndirect_(iinf)

iinf\hbmMask = ImageID(4)
iinf\hbmColor = ImageID(4)

Icwnd4 = CreateIconIndirect_(iinf)

iinf\hbmMask = ImageID(5)
iinf\hbmColor = ImageID(5)

Icwnd5 = CreateIconIndirect_(iinf)

iinf\hbmMask = ImageID(6)
iinf\hbmColor = ImageID(6)

Icwnd6 = CreateIconIndirect_(iinf)

For img = 0 To 6
  FreeImage(img)
Next

ILwnd2 = ImageList_Create_(26,20,#ILC_COLOR32| #ILC_MASK, 0, 100)

ILwnd = ImageList_Create_(20,20,#ILC_COLOR32| #ILC_MASK, 0, 100)
ImageList_AddIcon_(ILwnd,Icwnd0)
ImageList_AddIcon_(ILwnd,Icwnd1)
ImageList_AddIcon_(ILwnd,Icwnd2)
ImageList_AddIcon_(ILwnd,Icwnd3)
ImageList_AddIcon_(ILwnd,Icwnd4)
ImageList_AddIcon_(ILwnd,Icwnd5)
ImageList_AddIcon_(ILwnd,Icwnd6)
; ImageList_AddIcon_(ILwnd,Icwnd1)
; ImageList_AddIcon_(ILwnd,Icwnd3)
; ImageList_AddIcon_(ILwnd,Icwnd5)

For index = 0 To 6
  CreateImage(0,26,20,24,$FFFFFF)
  hdc = StartDrawing(ImageOutput(0))
     ImageList_Draw_(ILwnd,index,hdc,6,0,#ILD_TRANSPARENT)
  StopDrawing()
  
 iinf\hbmMask = ImageID(0)
 iinf\hbmColor = ImageID(0)

 Icwnd = CreateIconIndirect_(iinf) 
 ImageList_AddIcon_(ILwnd2,Icwnd)
Next
For index = 1 To 5 Step 2
  CreateImage(0,26,20,24,#White)
  hdc = StartDrawing(ImageOutput(0))
     ImageList_Draw_(ILwnd,index,hdc,0,0,#ILD_TRANSPARENT)
  StopDrawing()  
 iinf\hbmMask = ImageID(0)
 iinf\hbmColor = ImageID(0)
 Icwnd = CreateIconIndirect_(iinf) 
 ImageList_AddIcon_(ILwnd2,Icwnd) 
Next
ImageList_Destroy_(ILwnd) 

LoadFont(0,"Broadway",16)

OpenWindow(0,0,0,800,600, "Special ListIcon", #PB_Window_ScreenCentered |#PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)       
ListIconGadget(0,10,10,780,540,"",0,#PB_ListIcon_GridLines)
SetGadgetColor(0,#PB_Gadget_BackColor,$E6E6E6)
SetGadgetColor(0,#PB_Gadget_LineColor,$FEC0C2)

Header = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)

SetGadgetFont(0,FontID(0))

AddGadgetColumn(0, 1, "",32)
AddGadgetColumn(0, 2, "",32)
AddGadgetColumn(0, 3, "",32)
AddGadgetColumn(0, 4, "Column 1",200)
AddGadgetColumn(0, 5, "Column 2",200)
AddGadgetColumn(0, 6, "Column 3",200)

SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE , #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)

SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, ILwnd2)

For i = 0 To 5
  AddGadgetItem(0, -1, Chr(10)+Chr(10)+Chr(10)+Chr(10)+"  111"+Chr(10)+"  222"+Chr(10)+ "  333",0)
Next

oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())

header_h = 42

For cel = 0 To 5
   SetImg(cel,1,1)
Next

SetImg(0,2,3)
SetImg(0,3,1)
SetImg(0,2,4)
SetImg(1,2,3)
SetImg(0,3,5)
SetImg(1,3,6)

HeaderImg(1,7)
HeaderImg(2,8)
HeaderImg(3,9)

SetWindowCallback(@WinCallback())

Repeat
  Select WaitWindowEvent()
     
      Case #PB_Event_CloseWindow
            Quit = 1
     
      Case #PB_Event_Gadget
          Select EventGadget()
           Case 0
                Select EventType()
                    Case #PB_EventType_LeftClick
                        GetCursorPos_(@p.POINT)
                        ScreenToClient_(GadgetID(0), p)
                        cell\pt\x = p\x
                        cell\pt\y = p\y  
                        SendMessage_(GadgetID(0),#LVM_SUBITEMHITTEST,0,@cell)
                        LI_row = cell\iItem
                        LI_col = cell\iSubItem                       
                        GetImg(LI_row,LI_col)
                        index = ii\iImage
                        If index > 0 And index <= 6
                          If index % 2 = 1
                             SetImg(LI_row,LI_col,index + 1)
                          Else
                             SetImg(LI_row,LI_col,index - 1)
                          EndIf
                        EndIf
                        
                EndSelect                
              
          EndSelect             
  EndSelect

Until Quit = 1
End

DataSection
CBox0:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$41444969000000AF
   Data.q $C00A3194EDCB3854,$8ABC45FFBD450830,$2C7FB6B8ABD1762E,$F57F250870534934,$85A1459D280847FD
   Data.q $A30074C7AAA99945,$0D2A0C7D088910D2,$7E3111CCC6619991,$DC8AE9518060000B,$B3EE88BD8047E67D
   Data.q $A2D2D16D16F09E41,$5233B2DA582915B2,$642B2FFC777ED876,$00004C0F8C5D0CC2,$42AE444E45490000
   Data.q $8260
CBox0end:

CBox1:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$414449DE000000AF
   Data.q $840E3194DDCB3854,$F195833D2D451020,$2CED057A4385DE04,$1BD42CA9044D90B5,$1B36491FDDDB1210
   Data.q $FE03BFB362958541,$A29033D1330CC0BC,$C3EDB6DAEBAD061F,$269A6A02C4233059,$CE294A202C4214F2
   Data.q $302EFCE18618A28A,$739C410E423306C0,$B33CFA0176C08C97,$77F7DF4B2CB5294A,$05B884275D74F041
   Data.q $9084415C9B1639D2,$798C620D638E251D,$40A4C4924D34D280,$639E79415CB04A52,$5B3CF35A45FBDC09
   Data.q $81FCCCB2CA0870F3,$19476AAAAA07E29A,$EBAB556732A4F1C7,$4B2CA82037CBBCDA,$2835E0ABB4D34E6C
   Data.q $6BF06E8B4D988B58,$BBFB60D8246360DA,$AF9F53C5E202FFE1,$4900000000EE3873,$826042AE444E45
CBox1end:

Circle0:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$414449CD000000AF
   Data.q $440E31D4D5CB3854,$B5431C29E1861840,$8434E1CF635051D7,$8485615C24E34742,$C8AEC913FDDE4833
   Data.q $3CCD0AF959A233B0,$FEA3D3715FBE6331,$A157177C7D999A07,$E1E41D99198484D6,$460C0CE0E2EFD67D
   Data.q $3203FA4A4DB111D0,$8EC9D0873434D651,$A564C4D0345859B4,$42D810140D121248,$E6D3FDB6FBFCB36A
   Data.q $4E49141743DAF179,$545503DE52540F7E,$47A5B0E7BA22287B,$8F4A42FE8783CAB6,$E68C8D0F5696A0AC
   Data.q $B68DA4D759E793CA,$895CF1B4BF6C3A9B,$A47A51B491E74D89,$E9EDA8CAEE8E90FD,$0DBFF53575B90A0B
   Data.q $4D6B99AB49EE37FF,$454900000000B337,$826042AE444E
Circle0end:

Circle1:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$414449C3000000AF
   Data.q $440E4BD4D5CB3854,$9586385AE0061040,$10D38738F6B058EB,$12102B849C6C7616,$4646499929A920CE
   Data.q $5F5BFC86F4974F75,$041E0FA5A017F5FA,$7C022EBA01061B6D,$BFF7C84214584512,$20CD9E7071C4FFFF
   Data.q $944C83FF9E4E7115,$66C476690D4EBA77,$CB250A655D6839DF,$9D070010C50C2838,$286E8178E33CDA6F
   Data.q $A825B5D504B4B294,$EA6C3A5B1C502E69,$1EA483C53CF15491,$5022CB4057BEA089,$5370A36A35DB54D2
   Data.q $18924AF51B53F6EA,$C85D88F5236A23CF,$755584D3B51ADC30,$017FF0DA7DB6BABC,$98C3C28C99AB4AF5
   Data.q $444E454900000000,$826042AE
Circle1end:

Ocircle0:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$4144492C010000AF
   Data.q $41AE4B94D5CB3854,$2C8C32C48F861041,$26C0D7B18250D4C3,$C240633030856C4C,$F100B2308205B036
   Data.q $EDDD69D2A6EA4ADD,$F3FFA746A744C7DC,$2B4FF195FD575775,$8946835B8DD01CFB,$FC6635A2D1A64652
   Data.q $9145EFFD9A8D5033,$C6E10C502E5389E2,$DF53AEAB901BD188,$EE86432E17EFD1B0,$2815196414558AEE
   Data.q $C62A15EE775D3A78,$A7635CAE8008F07A,$69350010603D6EC5,$2B1AD96F4AE9465A,$9AE8E759AF4AB200
   Data.q $243D7A0F8381D06F,$27F2613C55F4FAB1,$20A2CC678A9E8F50,$B99CC3BD905BF4A9,$3497E93DD6D36A0F
   Data.q $DB23E2D8F533C9E5,$565554AA80497E96,$A42A91F1486E1CA6,$C76F3B4B259462EB,$EAE04D76733A0C2E
   Data.q $CA6E97448BBB2334,$F969529FCF46E26B,$8BF751525E279DC7,$8F3BC9D0EFD6D23F,$645C8457A3E28DC4
   Data.q $CA71C8F6A337FECF,$FF86D3E2C16EBA54,$2ABBDFF698AAC717,$4E454900000000C5,$826042AE44
Ocircle0end:

Ocircle1:
   Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$AA156F0000000208,$41444921010000AF
   Data.q $820E3B94D5CB3854,$1E5618E131861040,$B82C51AC449296C3,$85876160C1578D84,$5025120AE00D7024
   Data.q $D79775C638E20071,$7C3B1533FC68F8AC,$2923F028FF3BB3BB,$8F180C300A2A047F,$6FB76C2698585141
   Data.q $85550ADFFC5D7482,$71C3D442881879F3,$218419B3D9EA815E,$7D5634D9B0659EFB,$1E56A3468AF1069F
   Data.q $D555582A74C25953,$EBD4F2376A73CA07,$15C915173E681F75,$041D2FE203D58245,$A03A9D3A09E6DA03
   Data.q $DD764B36D93226CE,$69EFDE4B15AB40EF,$BCF07BF14BF4BE10,$722FD86B60B1680E,$65F11F46CBD2AF5D
   Data.q $264DA58D348917EC,$75D8191E8FA24344,$A0131C5FB1478E94,$88AB1E5A8261A5CB,$37435EA4B2C3059F
   Data.q $E7D4FF8D2F89FCB6,$B90FE8FDDA28B349,$88DD08F3C1CB97F5,$D1F24920F022EA3E,$775DEEEDD8534DA8
   Data.q $045801BFF0DBFC38,$00003DFA0EDEF698,$42AE444E45490000,$8260
Ocircle1end:
EndDataSection
Edit :Very quick fix
Edit2 :some lines removed
Last edited by RASHAD on Thu Apr 02, 2015 2:59 am, edited 3 times in total.
Egypt my love
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

Very impressively done-up RASHAD! ... I bet you've guessed that I'll be among the first to respond. :wink: :lol:

The only dislike I have, is the column images dis-alignments to the header images. :wink:

Image
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Special ListIconGadget() [Windows]

Post by RASHAD »

You can shift the columns icons to the left by 6 pix

# 1:
From the beginning :
- Create image 26x20
- draw columns icons at 6,0
- draw the header icons at 0,0

# 2:
Use ImageList_Merge_()

# 3:
Use my stupid fix :mrgreen:
Egypt my love
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

LOL!

That works. :twisted:


Thanks. :lol:
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Special ListIconGadget() [Windows]

Post by RASHAD »

Hi Thunder93
I just changed it again :)
Egypt my love
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

Looking better and better.! Is it me or does it look like the alignments are off by fraction of a hair ?? :twisted:
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Special ListIconGadget() [Windows]

Post by RASHAD »

I do not know :D
You can play with [ 6 ] up or down

Code: Select all

ImageList_Draw_(ILwnd,index,hdc,6,0,#ILD_TRANSPARENT)
Last edited by RASHAD on Thu Apr 02, 2015 1:05 am, edited 1 time in total.
Egypt my love
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

:lol:


... Just teasing you. 8)
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

Hi RASHAD.

Quick question. Lines 132, 133, 134 consisting of ImageList_AddIcon_() .. are just unnecessary duplicates or they serve a special purpose that I'm yet to see why?

Sometime I have the chance, going to see if I can put some of that stuff into procedures for little more convince and flexibility and make it little smaller if possible.
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Special ListIconGadget() [Windows]

Post by RASHAD »

Yes you are right
No need for the 3 lines
Code updated
Egypt my love
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

I knew you like playing mind games.... I'm going to have to keep an watchful eye on you. :shock:
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

Here's your code after it has been touched by the hand of GOD.

Code: Select all

#HDF_IMAGE = $800
#HDI_IMAGE = $20

UsePNGImageDecoder()

Global oldproc,  header_h,  Header,  cell.LVHITTESTINFO,  ii.lv_item

Procedure SetImg(Row,  Col,  Img)
  ii\mask     =  #LVIF_IMAGE
  ii\iItem    = Row
  ii\iSubItem = Col
  ii\iImage   = Img
  SendMessage_(GadgetID(0),   #LVM_SETITEM,  0,  @ii)
EndProcedure

Procedure GetImg(Row,  Col)
  ii\mask     =  #LVIF_IMAGE
  ii\iItem    = Row
  ii\iSubItem = Col
  SendMessage_(GadgetID(0),  #LVM_GETITEM,  0,  @ii)
EndProcedure

Procedure HeaderImg(Col,  Img)             
  hi.HDITEM
  hi\mask   = #HDI_IMAGE
  hi\fmt    = #HDF_IMAGE
  hi\iImage = Img
  SendMessage_(Header,  #HDM_SETITEM,  Col,  @hi)
EndProcedure

Procedure Hheight(hWnd,  uMsg,  wParam,  lParam)
  Select uMsg
    Case #HDM_LAYOUT
      result = CallWindowProc_(oldproc,  hWnd,  uMsg,  wParam,  lParam)
      *hdlayout.HD_LAYOUT = lParam
      If *hdlayout\prc <> 0
        *rect.RECT = *hdlayout\prc
        *rect\top = header_h
      EndIf
      If *hdlayout\pwpos <> 0
        *windowpos.WINDOWPOS = *hdlayout\pwpos
        *windowpos\cy = header_h
      EndIf
      
    Default
      result = CallWindowProc_(oldproc,  hWnd,  uMsg,  wParam,  lParam)
      
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure WinCallback(hWnd,  uMsg,  wParam,  lParam)
  result = #PB_ProcessPureBasicEvents 
  Select uMsg
      
    Case #WM_SIZE
      ResizeGadget(0,  #PB_Ignore,  #PB_Ignore,  WindowWidth(0)-20,  WindowHeight(0)-60)
      
    Case #WM_NOTIFY
      *NMHDR.NMHDR = lParam
      If *NMHDR\hWndFrom = GetWindow_(GadgetID(0),  #GW_CHILD) And *NMHDR\code = #HDN_FIRST
        *phdn.NMHEADER = lParam
        row = *phdn\iItem                 
        If  row = 0 Or row = 1 Or row = 2  Or row = 3 
          ProcedureReturn 1
        EndIf
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

Structure Shells : Num.i : EndStructure : Global Dim Icwnd.Shells(6)

Procedure _SetHeaderColumn_Images()
  Global ILwnd, ILwnd2, iinf.ICONINFO
  
  CreateImage(0,  26,  20,  24,  #White)
  CatchImage(1,  ?CBox0) 
  CatchImage(2,  ?CBox1)
  CatchImage(3,  ?Circle0)
  CatchImage(4,  ?Circle1)
  CatchImage(5,  ?Ocircle0)
  CatchImage(6,  ?Ocircle1)
     
  iinf\fIcon = 1
  
  For i = 0 To 6
    iinf\hbmMask = ImageID(i)
    iinf\hbmColor = ImageID(i)    
    Icwnd(i)\Num = CreateIconIndirect_(iinf)
  Next
  
  For Img = 0 To 6
    FreeImage(Img)
  Next
  
  ILwnd = ImageList_Create_(20,  20,  #ILC_COLOR32| #ILC_MASK,  0,  100)
  ILwnd2 = ImageList_Create_(26,  20,  #ILC_COLOR32| #ILC_MASK,  0,  100)  
  
  For i = 0 To 6
    ImageList_AddIcon_(ILwnd,  Icwnd(i)\Num)
  Next
  
  If ILwnd And ILwnd2
    For index = 0 To 6
      CreateImage(0,  26,  20,  24,  $FFFFFF)
      hdc = StartDrawing(ImageOutput(0))
      ImageList_Draw_(ILwnd,  index,  hdc,  6,  0,  #ILD_TRANSPARENT)
      StopDrawing()
      
      iinf\hbmMask = ImageID(0)
      iinf\hbmColor = ImageID(0)
      
      Icwnd = CreateIconIndirect_(iinf) 
      ImageList_AddIcon_(ILwnd2,  Icwnd)
    Next
    
    For index = 1 To 5 Step 2
      CreateImage(0,  26,  20,  24,  #White)
      hdc = StartDrawing(ImageOutput(0))
      ImageList_Draw_(ILwnd,  index,  hdc,  0,  0,  #ILD_TRANSPARENT)
      StopDrawing()
      
      iinf\hbmMask = ImageID(0)
      iinf\hbmColor = ImageID(0)
      Icwnd = CreateIconIndirect_(iinf) 
      ImageList_AddIcon_(ILwnd2,  Icwnd) 
    Next
    
    ImageList_Destroy_(ILwnd)  
    ProcedureReturn 1
  EndIf  
EndProcedure

If _SetHeaderColumn_Images() = 0 : MessageRequester("Special ListIcon", "Error Code: 4021. Terminating RASHAD's failed code.", #PB_MessageRequester_Ok) : EndIf


LoadFont(0,  "Broadway",  16)

If OpenWindow(0,  0,  0,  800,  600,   "Special ListIcon",   #PB_Window_ScreenCentered |#PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)       
  ListIconGadget(0,  10,  10,  780,  540,  "",  0,  #PB_ListIcon_GridLines)
  SetGadgetColor(0,  #PB_Gadget_BackColor,  $E6E6E6)
  SetGadgetColor(0,  #PB_Gadget_LineColor,  $FEC0C2)
  
  Header = SendMessage_(GadgetID(0),  #LVM_GETHEADER,  0,  0)
  
  SetGadgetFont(0,  FontID(0))
  
  AddGadgetColumn(0,  1,  "",  32)
  AddGadgetColumn(0,  2,  "",  32)
  AddGadgetColumn(0,  3,  "",  32)
  AddGadgetColumn(0,  4,  "Column 1",  200)
  AddGadgetColumn(0,  5,  "Column 2",  200)
  AddGadgetColumn(0,  6,  "Column 3",  200)
  
  SendMessage_(GadgetID(0),  #LVM_SETEXTENDEDLISTVIEWSTYLE ,  #LVS_EX_SUBITEMIMAGES,  #LVS_EX_SUBITEMIMAGES)
  
  SendMessage_(GadgetID(0),  #LVM_SETIMAGELIST,  #LVSIL_SMALL,  ILwnd2)
  
  For i = 0 To 5
    AddGadgetItem(0,  -1,  Chr(10)+Chr(10)+Chr(10)+Chr(10)+"  111"+Chr(10)+"  222"+Chr(10)+ "  333",  0)
  Next
  
  oldproc = SetWindowLongPtr_(Header,  #GWL_WNDPROC,  @Hheight())
  
  header_h = 42
  
  For cel = 0 To 5
    SetImg(cel,  1,  1)
  Next
  
  SetImg(0,  2,  3)
  SetImg(0,  3,  1)
  SetImg(0,  2,  4)
  SetImg(1,  2,  3)
  SetImg(0,  3,  5)
  SetImg(1,  3,  6)
  
  HeaderImg(1,  7)
  HeaderImg(2,  8)
  HeaderImg(3,  9)
  
  SetWindowCallback(@WinCallback())
  
  Repeat
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            Select EventType()
              Case #PB_EventType_LeftClick
                GetCursorPos_(@p.POINT)
                ScreenToClient_(GadgetID(0),   p)
                cell\pt\x = p\x
                cell\pt\y = p\y  
                SendMessage_(GadgetID(0),  #LVM_SUBITEMHITTEST,  0,  @cell)
                LI_row = cell\iItem
                LI_col = cell\iSubItem                       
                GetImg(LI_row,  LI_col)
                index = ii\iImage
                If index > 0 And index <= 6
                  If index % 2 = 1
                    SetImg(LI_row,  LI_col,  index + 1)
                  Else
                    SetImg(LI_row,  LI_col,  index - 1)
                  EndIf
                EndIf
                
            EndSelect                
            
        EndSelect             
    EndSelect
    
  Until Quit = 1
  ImageList_Destroy_(ILwnd2)
  
EndIf
End

DataSection
  CBox0:
  Data.q $0A1A0A0D474E5089,  $524448490D000000,  $1800000018000000,  $AA156F0000000208,  $41444969000000AF
  Data.q $C00A3194EDCB3854,  $8ABC45FFBD450830,  $2C7FB6B8ABD1762E,  $F57F250870534934,  $85A1459D280847FD
  Data.q $A30074C7AAA99945,  $0D2A0C7D088910D2,  $7E3111CCC6619991,  $DC8AE9518060000B,  $B3EE88BD8047E67D
  Data.q $A2D2D16D16F09E41,  $5233B2DA582915B2,  $642B2FFC777ED876,  $00004C0F8C5D0CC2,  $42AE444E45490000
  Data.q $8260
  CBox0end:
  
  CBox1:
  Data.q $0A1A0A0D474E5089, $524448490D000000, $1800000018000000, $AA156F0000000208, $414449DE000000AF
  Data.q $840E3194DDCB3854, $F195833D2D451020, $2CED057A4385DE04, $1BD42CA9044D90B5, $1B36491FDDDB1210
  Data.q $FE03BFB362958541, $A29033D1330CC0BC, $C3EDB6DAEBAD061F, $269A6A02C4233059, $CE294A202C4214F2
  Data.q $302EFCE18618A28A, $739C410E423306C0, $B33CFA0176C08C97, $77F7DF4B2CB5294A, $05B884275D74F041
  Data.q $9084415C9B1639D2, $798C620D638E251D, $40A4C4924D34D280, $639E79415CB04A52, $5B3CF35A45FBDC09
  Data.q $81FCCCB2CA0870F3, $19476AAAAA07E29A, $EBAB556732A4F1C7, $4B2CA82037CBBCDA, $2835E0ABB4D34E6C
  Data.q $6BF06E8B4D988B58, $BBFB60D8246360DA, $AF9F53C5E202FFE1, $4900000000EE3873, $826042AE444E45
  CBox1end:
  
  Circle0:
  Data.q $0A1A0A0D474E5089, $524448490D000000, $1800000018000000, $AA156F0000000208, $414449CD000000AF
  Data.q $440E31D4D5CB3854, $B5431C29E1861840, $8434E1CF635051D7, $8485615C24E34742, $C8AEC913FDDE4833
  Data.q $3CCD0AF959A233B0, $FEA3D3715FBE6331, $A157177C7D999A07, $E1E41D99198484D6, $460C0CE0E2EFD67D
  Data.q $3203FA4A4DB111D0, $8EC9D0873434D651, $A564C4D0345859B4, $42D810140D121248, $E6D3FDB6FBFCB36A
  Data.q $4E49141743DAF179, $545503DE52540F7E, $47A5B0E7BA22287B, $8F4A42FE8783CAB6, $E68C8D0F5696A0AC
  Data.q $B68DA4D759E793CA, $895CF1B4BF6C3A9B, $A47A51B491E74D89, $E9EDA8CAEE8E90FD, $0DBFF53575B90A0B
  Data.q $4D6B99AB49EE37FF, $454900000000B337, $826042AE444E
  Circle0end:
  
  Circle1:
  Data.q $0A1A0A0D474E5089, $524448490D000000, $1800000018000000, $AA156F0000000208, $414449C3000000AF
  Data.q $440E4BD4D5CB3854, $9586385AE0061040, $10D38738F6B058EB, $12102B849C6C7616, $4646499929A920CE
  Data.q $5F5BFC86F4974F75, $041E0FA5A017F5FA, $7C022EBA01061B6D, $BFF7C84214584512, $20CD9E7071C4FFFF
  Data.q $944C83FF9E4E7115, $66C476690D4EBA77, $CB250A655D6839DF, $9D070010C50C2838, $286E8178E33CDA6F
  Data.q $A825B5D504B4B294, $EA6C3A5B1C502E69, $1EA483C53CF15491, $5022CB4057BEA089, $5370A36A35DB54D2
  Data.q $18924AF51B53F6EA, $C85D88F5236A23CF, $755584D3B51ADC30, $017FF0DA7DB6BABC, $98C3C28C99AB4AF5
  Data.q $444E454900000000, $826042AE
  Circle1end:
  
  Ocircle0:
  Data.q $0A1A0A0D474E5089, $524448490D000000, $1800000018000000, $AA156F0000000208, $4144492C010000AF
  Data.q $41AE4B94D5CB3854, $2C8C32C48F861041, $26C0D7B18250D4C3, $C240633030856C4C, $F100B2308205B036
  Data.q $EDDD69D2A6EA4ADD, $F3FFA746A744C7DC, $2B4FF195FD575775, $8946835B8DD01CFB, $FC6635A2D1A64652
  Data.q $9145EFFD9A8D5033, $C6E10C502E5389E2, $DF53AEAB901BD188, $EE86432E17EFD1B0, $2815196414558AEE
  Data.q $C62A15EE775D3A78, $A7635CAE8008F07A, $69350010603D6EC5, $2B1AD96F4AE9465A, $9AE8E759AF4AB200
  Data.q $243D7A0F8381D06F, $27F2613C55F4FAB1, $20A2CC678A9E8F50, $B99CC3BD905BF4A9, $3497E93DD6D36A0F
  Data.q $DB23E2D8F533C9E5, $565554AA80497E96, $A42A91F1486E1CA6, $C76F3B4B259462EB, $EAE04D76733A0C2E
  Data.q $CA6E97448BBB2334, $F969529FCF46E26B, $8BF751525E279DC7, $8F3BC9D0EFD6D23F, $645C8457A3E28DC4
  Data.q $CA71C8F6A337FECF, $FF86D3E2C16EBA54, $2ABBDFF698AAC717, $4E454900000000C5, $826042AE44
  Ocircle0end:
  
  Ocircle1:
  Data.q $0A1A0A0D474E5089, $524448490D000000, $1800000018000000, $AA156F0000000208, $41444921010000AF
  Data.q $820E3B94D5CB3854, $1E5618E131861040, $B82C51AC449296C3, $85876160C1578D84, $5025120AE00D7024
  Data.q $D79775C638E20071, $7C3B1533FC68F8AC, $2923F028FF3BB3BB, $8F180C300A2A047F, $6FB76C2698585141
  Data.q $85550ADFFC5D7482, $71C3D442881879F3, $218419B3D9EA815E, $7D5634D9B0659EFB, $1E56A3468AF1069F
  Data.q $D555582A74C25953, $EBD4F2376A73CA07, $15C915173E681F75, $041D2FE203D58245, $A03A9D3A09E6DA03
  Data.q $DD764B36D93226CE, $69EFDE4B15AB40EF, $BCF07BF14BF4BE10, $722FD86B60B1680E, $65F11F46CBD2AF5D
  Data.q $264DA58D348917EC, $75D8191E8FA24344, $A0131C5FB1478E94, $88AB1E5A8261A5CB, $37435EA4B2C3059F
  Data.q $E7D4FF8D2F89FCB6, $B90FE8FDDA28B349, $88DD08F3C1CB97F5, $D1F24920F022EA3E, $775DEEEDD8534DA8
  Data.q $045801BFF0DBFC38, $00003DFA0EDEF698, $42AE444E45490000, $8260
  Ocircle1end:
EndDataSection
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Special ListIconGadget() [Windows]

Post by RASHAD »

Nooooo :mrgreen:
Next the code after the original GOD got some rest
You can use any symbol you like(draw it yourself)

Code: Select all

 #HDF_IMAGE = $800
 #HDI_IMAGE = $20
 
UsePNGImageDecoder()

Global oldproc, header_h ,Header,cell.LVHITTESTINFO,ii.lv_item

Procedure SetImg(Row,Col,Img)
  ii\mask     =  #LVIF_IMAGE
  ii\iItem    = Row
  ii\iSubItem = Col
  ii\iImage   = Img
  SendMessage_(GadgetID(0), #LVM_SETITEM, 0, @ii)
EndProcedure

Procedure GetImg(Row,Col)
  ii\mask     =  #LVIF_IMAGE
  ii\iItem    = Row
  ii\iSubItem = Col
  SendMessage_(GadgetID(0), #LVM_GETITEM, 0, @ii)
EndProcedure

Procedure HeaderImg(Col,Img)             
  hi.HDITEM
  hi\mask   = #HDI_IMAGE
  hi\fmt    = #HDF_IMAGE
  hi\iImage = Img
  SendMessage_(Header , #HDM_SETITEM, Col, @hi)
EndProcedure

Procedure Hheight(hWnd, uMsg, wParam, lParam)
   Select uMsg
      Case #HDM_LAYOUT
        result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
        *hdlayout.HD_LAYOUT = lParam
        If *hdlayout\prc <> 0
            *rect.RECT = *hdlayout\prc
            *rect\top = header_h
        EndIf
        If *hdlayout\pwpos <> 0
            *windowpos.WINDOWPOS = *hdlayout\pwpos
            *windowpos\cy = header_h
        EndIf
     
      Default
        result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
           
    EndSelect
    ProcedureReturn result
EndProcedure

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
result = #PB_ProcessPureBasicEvents 
  Select uMsg

   Case #WM_SIZE
        ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20, WindowHeight(0)-60)
        
   Case #WM_NOTIFY
        *NMHDR.NMHDR = lParam
           If *NMHDR\hWndFrom = GetWindow_(GadgetID(0), #GW_CHILD) And *NMHDR\code = #HDN_FIRST
              *phdn.NMHEADER = lParam
              row = *phdn\iItem                 
              If  row = 0 Or row = 1 Or row = 2  Or row = 3 
                    ProcedureReturn 1
              EndIf
           EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

LoadFont(0,"Marlett",120)
iinf.ICONINFO
iinf\fIcon = 1

ILwnd = ImageList_Create_(26,20,#ILC_COLOR32| #ILC_MASK, 0, 100)

CreateImage(0,26,20,24,#White)
iinf\hbmMask = ImageID(0)
iinf\hbmColor = ImageID(0)
Icwnd = CreateIconIndirect_(iinf)
ImageList_AddIcon_(ILwnd,Icwnd)

For img = 0 To 1
  CreateImage(0,260,200,24,#White)
  StartDrawing(ImageOutput(0))
  Box(60,0,160,160,0)
  Box(80,20,120,120,$FFFFFF)
  If img = 1
    DrawingFont(FontID(0))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(70,0,Chr($61),0)
  EndIf
  StopDrawing()
  ResizeImage(0,26,20,#PB_Image_Smooth)
  iinf\hbmMask = ImageID(0)
  iinf\hbmColor = ImageID(0)
  Icwnd = CreateIconIndirect_(iinf)
  ImageList_AddIcon_(ILwnd,Icwnd)
Next

FreeFont(0)

For img = 0 To 3
  CreateImage(0,260,200,24,#White)
  StartDrawing(ImageOutput(0))
  Circle(160,90,90,$89898A)
    If img = 0 Or img = 2
      Circle(160,90,70,$00FF00)
    Else
      Circle(160,90,70,$0000FF)
    EndIf
    If img > 1
      Circle(160,90,40,$FFFFFF)
    EndIf
  StopDrawing()
  ResizeImage(0,26,20,#PB_Image_Smooth)
  iinf\hbmMask = ImageID(0)
  iinf\hbmColor = ImageID(0)
  Icwnd = CreateIconIndirect_(iinf)
  ImageList_AddIcon_(ILwnd,Icwnd)
Next

CreateImage(0,260,200,24,#White)
StartDrawing(ImageOutput(0))
  Box(0,20,160,160,0)
  Box(20,40,120,120,$FFFFFF)
StopDrawing()
ResizeImage(0,26,20,#PB_Image_Smooth)
iinf\hbmMask = ImageID(0)
iinf\hbmColor = ImageID(0)
Icwnd = CreateIconIndirect_(iinf)
ImageList_AddIcon_(ILwnd,Icwnd)
  
For img = 0 To 1
  CreateImage(0,260,200,24,#White)
  StartDrawing(ImageOutput(0))
  Circle(100,100,90,$89898A)
  Circle(100,100,70,$00FF00)
  If img = 1
    Circle(100,100,40,$FFFFFF)
  EndIf
  StopDrawing()
  ResizeImage(0,26,20,#PB_Image_Smooth)
  iinf\hbmMask = ImageID(0)
  iinf\hbmColor = ImageID(0)
  Icwnd = CreateIconIndirect_(iinf)
  ImageList_AddIcon_(ILwnd,Icwnd)
Next

FreeImage(0)

LoadFont(0,"Broadway",16)

OpenWindow(0,0,0,800,600, "Special ListIcon", #PB_Window_ScreenCentered |#PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)       
ListIconGadget(0,10,10,780,540,"",0,#PB_ListIcon_GridLines)
SetGadgetColor(0,#PB_Gadget_BackColor,$E6E6E6)
SetGadgetColor(0,#PB_Gadget_LineColor,$FEC0C2)

Header = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)

SetGadgetFont(0,FontID(0))

AddGadgetColumn(0, 1, "",32)
AddGadgetColumn(0, 2, "",32)
AddGadgetColumn(0, 3, "",32)
AddGadgetColumn(0, 4, "Column 1",200)
AddGadgetColumn(0, 5, "Column 2",200)
AddGadgetColumn(0, 6, "Column 3",200)

SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE , #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)

SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, ILwnd)

For i = 0 To 5
  AddGadgetItem(0, -1, Chr(10)+Chr(10)+Chr(10)+Chr(10)+"  111"+Chr(10)+"  222"+Chr(10)+ "  333",0)
Next

oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())

header_h = 42

For cel = 0 To 5
   SetImg(cel,1,1)
Next

SetImg(0,2,3)
SetImg(0,3,1)
SetImg(0,2,4)
SetImg(1,2,3)
SetImg(0,3,5)
SetImg(1,3,6)

HeaderImg(1,7)
HeaderImg(2,8)
HeaderImg(3,9)

SetWindowCallback(@WinCallback())

Repeat
  Select WaitWindowEvent()
     
      Case #PB_Event_CloseWindow
            Quit = 1
     
      Case #PB_Event_Gadget
          Select EventGadget()
           Case 0
                Select EventType()
                    Case #PB_EventType_LeftClick
                        GetCursorPos_(@p.POINT)
                        ScreenToClient_(GadgetID(0), p)
                        cell\pt\x = p\x
                        cell\pt\y = p\y  
                        SendMessage_(GadgetID(0),#LVM_SUBITEMHITTEST,0,@cell)
                        LI_row = cell\iItem
                        LI_col = cell\iSubItem                       
                        GetImg(LI_row,LI_col)
                        index = ii\iImage
                        If index > 0 And index <= 6
                          If index % 2 = 1
                             SetImg(LI_row,LI_col,index + 1)
                          Else
                             SetImg(LI_row,LI_col,index - 1)
                          EndIf
                        EndIf
                        
                EndSelect                
              
          EndSelect             
  EndSelect

Until Quit = 1
End
Edit : updated for smoothing
Edit2 :Bug fixed
Last edited by RASHAD on Thu Apr 02, 2015 1:15 pm, edited 2 times in total.
Egypt my love
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: Special ListIconGadget() [Windows]

Post by Thunder93 »

Eh. you needed sleep? ;p

No cheating allowed. You are removing options / features. You suppose to try to make smaller and remove redundant code while maintaining same features. ..I told you that I was going to keep an watchful-eye on you. :shock:
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Special ListIconGadget() [Windows]

Post by RASHAD »

You are wrong :mrgreen:
I should make it as much flexible as I can and Less Executable :P
Previous post updated for smoothing :lol:
Egypt my love
Post Reply