Another Tech. for Using The ListIcon Gadget(Windows)

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

Another Tech. for Using The ListIcon Gadget(Windows)

Post by RASHAD »

- Hheight() by MrMat for changing Header Height
- Speedy Hal & Val Scrolling
- Can use more CheckBoxes Columns
- Can use any other objects smoothly
Have fun

Code: Select all

#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT 
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT 

Global Header,oldproc,Header_H,Index
Global w.RECT,rc.RECT,lv.RECT

ExamineDesktops()


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

Procedure WndProc(hwnd, uMsg, wParam, lParam)

result = #PB_ProcessPureBasicEvents 

Select uMsg
   
  Case #WM_NOTIFY   
    *NMHDR.NMHDR = lParam    
    
      Select *NMHDR\code 
        Case #NM_CUSTOMDRAW 
         *LVCDHeader.NMLVCUSTOMDRAW = lParam
          Select *LVCDHeader\nmcd\dwDrawStage 
            Case #CDDS_PREPAINT 
               ;result = #CDRF_NOTIFYITEMDRAW                
            Case #CDDS_ITEMPREPAINT
               result = #CDRF_NOTIFYSUBITEMDRAW
            Case #CDDS_SUBITEMPREPAINT 
                Row = *LVCDHeader\nmcd\dwItemSpec
                If Row & 1 = 0 
                  *LVCDHeader\clrTextBk = $D6FFFF 
                Else 
                  *LVCDHeader\clrTextBk = $CEF6F5 
                EndIf            
                    result = #CDRF_NEWFONT 
          EndSelect 
      EndSelect     


      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING
          If *nmHEADER\iItem = 0 Or *nmHEADER\iItem = 1 
            HideGadget(2,1)
            HideGadget(3,1)
          EndIf
            
            
        Case #HDN_ITEMCHANGED
          r1.RECT\top = 1
          r1.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, r1)
          r2.RECT\top = 2
          r2.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 2, r2)
          If r1\left > 0
            MoveWindow_(GadgetID(2),r1\left+1,Header_H,20,lv\bottom - lv\top,1)
          EndIf
          MoveWindow_(GadgetID(3),r2\left+1,Header_H,20,lv\bottom - lv\top,1)
          If r2\left - r1\Left > 20
            HideGadget(2,0)
            HideGadget(3,0)
          Else
            HideGadget(3,0)
          EndIf

      EndSelect
     
   
    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
          GetClientRect_(WindowID(0),w.RECT)
          MoveWindow_(GadgetID(0),10,10,w\right-w\left-20,w\bottom-w\top-60,1)
          MoveWindow_(GadgetID(4),10,w\bottom-35,80,24,1)
          MoveWindow_(GadgetID(5),100,w\bottom-35,80,24,1)
          GetClientRect_(GadgetID(1),lv.RECT)
          MoveWindow_(Header,0,GetGadgetAttribute(0,#PB_ScrollArea_Y),DesktopWidth(0),Header_H,1)
          RedrawWindow_(GadgetID(1),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)          
          
         
   EndSelect   
  ProcedureReturn result 
EndProcedure


  
If OpenWindow(0, 0, 0, 640, 340, "ListIcon Gadget",#PB_Window_Invisible| #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget |#PB_Window_SizeGadget| #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 0,0,0,0,DesktopWidth(0),DesktopHeight(0),50,#PB_ScrollArea_Flat)
    SetGadgetColor(0,#PB_Gadget_BackColor,$D6FFFF)
    ListIconGadget(1,0, 0,1940, 1200, "Column 0",100,#LVS_EX_DOUBLEBUFFER|#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)    
    
    imageList = ImageList_Create_(1,24, #ILC_COLOR32, 0, 0)    
    SendMessage_(GadgetID(1), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    SetWindowLongPtr_(GadgetID(1),#GWL_EXSTYLE,0)
    
      For i = 1 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 100)
      Next
      
      For i = 0 To 500
        AddGadgetItem(1, i, "Item "+Str(i)+Chr(10)+Space(6)+"Item "+Str(i)+Chr(10)+Space(6)+"Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item 7")
      Next
      
      Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
      oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())
      SendMessage_(GadgetID(1), #LVM_SCROLL, 0, 0)
     
      SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
      SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    
      GetWindowRect_(Header,r.RECT)
      Header_H = r\bottom-r\top    
        
    ListIconGadget(2,101, Header_H, 20, 1200, "Column 1",20,#LVS_EX_DOUBLEBUFFER|#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER) ;Height - 20 for the hidden Hal ScrollBar    
    
    SendMessage_(GadgetID(2), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    
    SetParent_(GadgetID(2),GadgetID(1))
    SetWindowLongPtr_(GadgetID(2),#GWL_EXSTYLE,0)
    SetGadgetColor(2,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(2,#PB_Gadget_LineColor,$C5C5C5)

      For i = 0 To 500
        AddGadgetItem(2, i, " "+Chr(10)+"")
      Next
      
    ListIconGadget(3,201,  Header_H, 20, 1200, "Column 2",20,#LVS_EX_DOUBLEBUFFER| #WS_EX_TOPMOST |#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER) ;Height - 20 for the hidden Hal ScrollBar    
    
    SendMessage_(GadgetID(3), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    
    SetParent_(GadgetID(3),GadgetID(1))
    SetWindowLongPtr_(GadgetID(3),#GWL_EXSTYLE,0)
    SetGadgetColor(3,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(3,#PB_Gadget_LineColor,$C5C5C5)

      For i = 0 To 500
        AddGadgetItem(3, i, ""+Chr(10)+"")
      Next
      
    ImageList_Destroy_(imageList)  
    CloseGadgetList()
    
    ButtonGadget(4,10,305,80,24,"Previous Page")
    ButtonGadget(5,100,305,80,24,"Next Page")    
    
    SetWindowCallback(@WndProc())
    HideWindow(0,0)
    
    Repeat
    ShowScrollBar_(GadgetID(1),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
      Case  #PB_Event_Gadget
        Select EventGadget()
          Case 4
            Index = Index - 50
            If Index < 0
              Index = 0
            EndIf
            SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(2),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(3),#LVM_ENSUREVISIBLE,Index,1)
            
          Case 5
            Index = Index + 50
            SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(2),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(3),#LVM_ENSUREVISIBLE,Index,1)            
            
        EndSelect
    EndSelect
  ForEver
EndIf

Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Another Tech. for Using The ListIcon Gadget(Windows)

Post by Kwai chang caine »

Wouaaaouhh good works :D

But i have found three errors for the moment :(

1/ The checkBox in the 2e en 3e collumn can not be checked

2/ When you scrolling the checkbox is under the Title
Image

3/ And if after that, you scrolling the titleBar disappears
Image

And believe you it's possible, if it's not too hard to modify directly each cells with double clic for exampler ???
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Another Tech. for Using The ListIcon Gadget(Windows)

Post by RASHAD »

@Kwai Hi
A little update Waiting for your comments

Thanks my friend

Code: Select all

#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT 
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT 
#HDS_NOSIZING = $800

Global Header,Header_1,Header_2,Header_3,oldproc,Row_H,Header_H
Global w.RECT,rc.RECT,lv.RECT

ExamineDesktops()


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

Procedure WndProc(hwnd, uMsg, wParam, lParam)

result = #PB_ProcessPureBasicEvents 

Select uMsg
   
    Case #WM_NOTIFY   
      *NMHDR.NMHDR = lParam    
        Select *NMHDR\code 
          Case #NM_CUSTOMDRAW 
           *LVCDHeader.NMLVCUSTOMDRAW = lParam
            Select *LVCDHeader\nmcd\dwDrawStage 
              Case #CDDS_PREPAINT 
                 ;result = #CDRF_NOTIFYITEMDRAW                
              Case #CDDS_ITEMPREPAINT
                 result = #CDRF_NOTIFYSUBITEMDRAW
              Case #CDDS_SUBITEMPREPAINT 
                  Row = *LVCDHeader\nmcd\dwItemSpec
                  If Row & 1 = 0 
                    *LVCDHeader\clrTextBk = $D6FFFF 
                  Else 
                    *LVCDHeader\clrTextBk = $CEF6F5 
                  EndIf            
                      result = #CDRF_NEWFONT 
            EndSelect 
      EndSelect     


      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING           
            
        Case #HDN_ITEMCHANGED
          r1.RECT\top = 1
          r1.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, r1)
          r2.RECT\top = 2
          r2.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 2, r2)
          MoveWindow_(GadgetID(2),r1\left+1,0,27,lv\bottom - lv\top,1)
          MoveWindow_(GadgetID(3),r2\left+1,0,27,lv\bottom - lv\top,1)

      EndSelect
      
    Case #WM_WINDOWPOSCHANGING
         MoveWindow_(Header,0,GetGadgetAttribute(0,#PB_ScrollArea_Y),DesktopWidth(0),Header_H,1)
         MoveWindow_(Header_1,0,GetGadgetAttribute(0,#PB_ScrollArea_Y),DesktopWidth(0),Header_H,1)
         MoveWindow_(Header_2,0,GetGadgetAttribute(0,#PB_ScrollArea_Y),DesktopWidth(0),Header_H,1)
         MoveWindow_(Header_3,0,GetGadgetAttribute(0,#PB_ScrollArea_Y),DesktopWidth(0),Header_H,1)         
     
   
    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
          GetClientRect_(WindowID(0),w.RECT)
          MoveWindow_(GadgetID(0),10,10,w\right-w\left-27,w\bottom-w\top-60,1)
          MoveWindow_(GadgetID(8),10,w\bottom-35,80,24,1)
          MoveWindow_(GadgetID(9),100,w\bottom-35,80,24,1)
          GetClientRect_(GadgetID(1),lv.RECT)
          InvalidateRect_(GadgetID(1),0,1)
          
         
   EndSelect   
  ProcedureReturn result 
EndProcedure

Page = 10

If OpenWindow(0, 0, 0, 640, 340, "ListIcon Gadget",#PB_Window_Invisible| #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget |#PB_Window_SizeGadget| #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 0,0,0,0,DesktopWidth(0),DesktopHeight(0),50,#PB_ScrollArea_Flat)
    SetGadgetColor(0,#PB_Gadget_BackColor,$D6FFFF)
    ListIconGadget(1,0, 0,DesktopWidth(0), DesktopHeight(0), Space(8)+"Column 0",150,#LVS_EX_DOUBLEBUFFER|#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)    
    
    imageList = ImageList_Create_(1,24, #ILC_COLOR32, 0, 0)    
    SendMessage_(GadgetID(1), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    SetWindowLongPtr_(GadgetID(1),#GWL_EXSTYLE,0)    
    
      AddGadgetColumn(1, 1, Space(8)+"Column " + Str(1), 150)
      AddGadgetColumn(1, 2,Space(8)+ "Column " + Str(2), 150)
    
      For i = 3 To 5
        AddGadgetColumn(1, i,"Column " + Str(i), 80)
      Next
      
      For i = 0 To 500
        AddGadgetItem(1, i, "Item "+Str(i)+Chr(10)+Space(8)+"Item "+Str(i)+Chr(10)+Space(8)+"Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item 7")
      Next
      
      Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
      SetWindowLongPtr_(header, #GWL_STYLE, #HDS_HORZ)
      oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())
      SendMessage_(GadgetID(1), #LVM_SCROLL, 0, 0)
     
      SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
      SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    
      Row_H = SendMessage_(GadgetID(1), #LVM_GETITEMSPACING, #True, 0) >> 16 + 2
      GetWindowRect_(Header,r.RECT)
      Header_H = r\bottom-r\top    
        
     ListIconGadget(2,151, 0, 27, 1200, "",27,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes) ;Height - 27 for the hidden Hal ScrollBar
    
    SendMessage_(GadgetID(2), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    
    SetParent_(GadgetID(2),GadgetID(1))
    SetWindowLongPtr_(GadgetID(2),#GWL_EXSTYLE,0)
    SetGadgetColor(2,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(2,#PB_Gadget_LineColor,$C5C5C5)

    For i = 0 To 500
      AddGadgetItem(2, i, " "+Chr(10)+"")
    Next
      
    Header_1 = SendMessage_(GadgetID(2), #LVM_GETHEADER, 0, 0)
    SetWindowLongPtr_(header_1, #GWL_STYLE, #HDS_NOSIZING)
    oldproc = SetWindowLongPtr_(Header_1, #GWL_WNDPROC, @Hheight())
      
    ListIconGadget(3,301, 0, 27, 1200, "",27, #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes) ;Height - 27 for the hidden Hal ScrollBar    
    
    SendMessage_(GadgetID(3), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    
    SetParent_(GadgetID(3),GadgetID(1))
    SetWindowLongPtr_(GadgetID(3),#GWL_EXSTYLE,0)
    SetGadgetColor(3,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(3,#PB_Gadget_LineColor,$C5C5C5)

    For i = 0 To 500
      AddGadgetItem(3, i, ""+Chr(10)+"")
    Next
      
    Header_2 = SendMessage_(GadgetID(3), #LVM_GETHEADER, 0, 0)
    SetWindowLongPtr_(header_2, #GWL_STYLE, #HDS_NOSIZING)
    
    oldproc = SetWindowLongPtr_(Header_2, #GWL_WNDPROC, @Hheight())
    
    ImageList_Destroy_(imageList)
    
    CloseGadgetList()
    
    ButtonGadget(8,10,305,80,24,"Previous Page")
    ButtonGadget(9,100,305,80,24,"Next Page")    
    
    SetWindowCallback(@WndProc())
    HideWindow(0,0)
    
    Repeat
    ShowScrollBar_(GadgetID(1),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
        
      Case  #PB_Event_Gadget
        Select EventGadget()
            
            
          Case 8
            SendMessage_(GadgetID(1), #LVM_SCROLL, 0, - Page * Row_H )
            SendMessage_(GadgetID(2), #LVM_SCROLL, 0, - Page * Row_H )
            SendMessage_(GadgetID(3), #LVM_SCROLL, 0, - Page * Row_H )
            
            
          Case 9
            SendMessage_(GadgetID(1), #LVM_SCROLL, 0, Page * Row_H )
            SendMessage_(GadgetID(2), #LVM_SCROLL, 0, Page * Row_H )
            SendMessage_(GadgetID(3), #LVM_SCROLL, 0, Page * Row_H )
            
        EndSelect
        
      Case #WM_VSCROLL
        
        
    EndSelect
  ForEver
EndIf

Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Another Tech. for Using The ListIcon Gadget(Windows)

Post by Kwai chang caine »

You have fix the bugs 8)

But KCC is the better for found bugs, even in a final version :lol: :lol:

1/ At the beginning there are two collumn for Column 1 and two for column 2 in the head
If you resize the column 3 the two columns 1 and 2 disappears :shock:

2/ Run your splendid code
Scroll down until line 8 for exampler
Resize the column 2 outside the windows with the mouse (I know it's not a normal behaviour for a user, but it's possible another user do that :D)
The head disappears :shock:
And if you lost the focus of your windows, the head appears again :shock:

After this strange behaviour not appears
If you scroll another time and resizing the column 3 another time, the head disappears another time, etc ..

I say all that just for help you...not for breaking your nuts :lol:
ImageThe happiness is a road...
Not a destination
Post Reply