Update :ListIcon with more than one column with CheckBoxes

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

Update :ListIcon with more than one column with CheckBoxes

Post by RASHAD »

Hi
The rest is yours

You can adapt this tech. with endless options
1- More than one column with CheckBoxes
2- More than one column with ImageList
etc.....
And at least you can use the native ListIcon commands

Code: Select all

  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ContainerGadget(0,10,25,620,260,#PB_Container_Flat)
    ListIconGadget(1,  0,  0, 140, 200, "Column 1", 136,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    SetWindowLongPtr_(GadgetID(1),#GWL_EXSTYLE,0)
    SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    ListIconGadget(2,  150,  0, 480, 200, "Column 2", 150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    SetWindowLongPtr_(GadgetID(2),#GWL_EXSTYLE,0)
    SetGadgetColor(2,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(2,#PB_Gadget_LineColor,$C5C5C5)
      For i = 0 To 6
        AddGadgetItem(1, i, "Item 1")
      Next
      For i = 1 To 4
        AddGadgetColumn(2, i, "Column " + Str(i+2), 65)
      Next
      For i = 0 To 6
        AddGadgetItem(2, i, "Item 2"+Chr(10)+"Item 3"+Chr(10)+"Item 4"+Chr(10)+"Item 5")
      Next
      ResizeGadget(1,0,0,140,260)
      ResizeGadget(2,140,0,480,260)
      CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Update :ListIcon with more than one column with CheckBox

Post by RASHAD »

Using new tech.

Some glitches need to fix
But it looks OK

Code: Select all

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

Global header_1,header_2,oldCallback
Global w.RECT,rc.RECT

Procedure LIcallback(hwnd, msg, wparam, lparam)
 If IsGadget(3)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
 EndIf
; 
 result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
;   
  Select msg
  
    Case #WM_NOTIFY     
       *NMHDR.NMHDR = lparam
         *NMHDR\code = #NM_CUSTOMDRAW
          *pnmcd.NMCUSTOMDRAW = lparam
            Select *pnmcd\dwDrawStage
              Case #CDDS_PREPAINT
                result = #CDRF_NOTIFYITEMDRAW
              Case #CDDS_ITEMPREPAINT
                If *pnmcd\dwItemSpec & 1 Or *NMHDR\hwndFrom = SendMessage_(GadgetID(2), #LVM_GETHEADER, 0, 0)
                  SetTextColor_(*pnmcd\hdc,$F22A18)
                Else
                  SetTextColor_(*pnmcd\hdc,$0C17FE)
                EndIf
                result = #CDRF_NEWFONT
            EndSelect

; 
;     Case #WM_RBUTTONDOWN
;           
;     Case #WM_RBUTTONDBLCLK
;   
;     Case #WM_LBUTTONDBLCLK
;      
;     Case #WM_LBUTTONDOWN
;        
;     Case #WM_CTLCOLOREDIT 

;        
    Case #WM_VSCROLL,#WM_MOUSEWHEEL
       Item_Sp = SendMessage_(GadgetID(1), #LVM_GETITEMSPACING, #True, 0) >> 16 
       SelItem = GetScrollPos_(GadgetID(1),#SB_VERT) - GetScrollPos_(GadgetID(3),#SB_VERT)  
       SendMessage_(GadgetID(2), #LVM_SCROLL, 0, SelItem * Item_Sp)
       SendMessage_(GadgetID(3), #LVM_SCROLL, 0, SelItem * Item_Sp)
       InvalidateRect_(GadgetID(2),0,1)
       InvalidateRect_(GadgetID(3),0,1)


    Case #WM_HSCROLL
         rc.RECT\top = 1
         rc.RECT\left = #LVIR_BOUNDS
         SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
         MoveWindow_(GadgetID(2),rc\left+1,0,149,w\bottom-w\top-40,1)
         MoveWindow_(GadgetID(3),rc\right+1,0,149,w\bottom-w\top-40,1)
         UpdateWindow_(WindowID(0))
         RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
; 
;           
;      Case #WM_KEYDOWN,#WM_MENUSELECT
;           SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
;           If wParam=#VK_NEXT                       
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEDOWN,0)
;           ElseIf wParam=#VK_PRIOR
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEUP,0)
;           ElseIf wParam=#VK_UP
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
;           ElseIf wParam=#VK_DOWN
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
;           ElseIf wParam=#VK_HOME
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_TOP,0)
;           ElseIf wParam=#VK_END
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_BOTTOM,0)
;           ElseIf wParam=#VK_LEFT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINELEFT,0)
;           ElseIf wParam=#VK_RIGHT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINERIGHT,0)
;           EndIf

    EndSelect
 ProcedureReturn result
EndProcedure
; 
Procedure WndProc(hwnd, uMsg, wParam, lParam)

 GetClientRect_(WindowID(0),w.RECT)

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 
                  Col = *LVCDHeader\iSubItem 
                  If (Row/2) * 2 = Row 
                    *LVCDHeader\clrTextBk = $D6FFFF 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  Else 
                    *LVCDHeader\clrTextBk = $CEF6F5 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  EndIf            
                      result = #CDRF_NEWFONT 
            EndSelect 
      EndSelect     


      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING,#HDN_ITEMCHANGED
          If *nmHEADER\hdr\hwndFrom = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
            MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
            rc.RECT\top = 1
            rc.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
            MoveWindow_(GadgetID(2),rc\left+1,0,149,w\bottom-w\top-40,1)
            MoveWindow_(GadgetID(3),rc\right+1,0,149,w\bottom-w\top-40,1)
            UpdateWindow_(WindowID(0))
            RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
            RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
          EndIf
      EndSelect



    Case #WM_SIZE,#WM_MOVE
         MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
         rc.RECT\top = 1
         rc.RECT\left = #LVIR_BOUNDS
         SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
         MoveWindow_(GadgetID(2),rc\left+1,0,149,w\bottom-w\top-40,1)
         MoveWindow_(GadgetID(3),rc\right+1,0,149,w\bottom-w\top-40,1)
         UpdateWindow_(WindowID(0))
         RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
 
   EndSelect   
  ProcedureReturn result 
EndProcedure
  
  
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_SizeGadget |#PB_Window_ScreenCentered)
    ListIconGadget(1,10, 10,620, 260, "Column 0",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    AddGadgetColumn(1, 1, "Column 1",150)
    AddGadgetColumn(1, 2, "Column 2",150)
      For i = 3 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 65)
      Next
      For i = 0 To 30
        AddGadgetItem(1, i, "Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item 7")
      Next
    SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    
    ListIconGadget(2,151,  0, 150, 260, "Column 1",149,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)    ;Height - 20 for the hidden Hal ScrollBar
    AddGadgetColumn(2, 1, "", 1)
    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 30
        AddGadgetItem(2, i, "Item "+Str(i) +Chr(10)+"Item "+Str(i) +Chr(10))
      Next
      
    ListIconGadget(3,300,  0, 150, 260, "Column 2",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)    ;Height - 20 for the hidden Hal ScrollBar
    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 30
        AddGadgetItem(3, i, "Item "+Str(i) +Chr(10)+"Item "+Str(i) +Chr(10))
      Next
      
    oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @LIcallback())
   
    SetWindowCallback(@WndProc())
    UpdateWindow_(WindowID(0))

    Repeat

      Select WaitWindowEvent()
      
        Case #PB_Event_CloseWindow
            Q = 1
       
        Case #WM_CLOSE     
      
        Case #PB_Event_Gadget
          Select EventGadget()
           Case 1            
          EndSelect
    
EndSelect
    Until Q = 1
  EndIf

Have fun
Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Update :ListIcon with more than one column with CheckBox

Post by RASHAD »

New update
Less headache
Full functioning (I think)

Code: Select all

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

Global header_1,header_2,oldCallback
Global w.RECT,rc.RECT

Procedure LIcallback(hwnd, msg, wparam, lparam)
If IsGadget(3)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
EndIf
; 
result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
;   
  Select msg
  
;     Case #WM_NOTIFY
; 
;     Case #WM_RBUTTONDOWN
;           
;     Case #WM_RBUTTONDBLCLK
;   
;     Case #WM_LBUTTONDBLCLK
;      
;     Case #WM_LBUTTONDOWN
;        
;     Case #WM_CTLCOLOREDIT 

;        
    Case #WM_VSCROLL,#WM_MOUSEWHEEL
       Item_Sp = SendMessage_(GadgetID(1), #LVM_GETITEMSPACING, #True, 0) >> 16 
       SelItem = GetScrollPos_(GadgetID(1),#SB_VERT) - GetScrollPos_(GadgetID(3),#SB_VERT)  
       SendMessage_(GadgetID(2), #LVM_SCROLL, 0, SelItem * Item_Sp)
       SendMessage_(GadgetID(3), #LVM_SCROLL, 0, SelItem * Item_Sp)
       InvalidateRect_(GadgetID(2),0,1)
       InvalidateRect_(GadgetID(3),0,1)


    Case #WM_HSCROLL
         rc.RECT\top = 1
         rc.RECT\left = #LVIR_BOUNDS
         SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
         MoveWindow_(GadgetID(2),rc\left+1,24,18,w\bottom-w\top-40,1)
         MoveWindow_(GadgetID(3),rc\right+1,24,18,w\bottom-w\top-40,1)
         UpdateWindow_(WindowID(0))
         RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
; 
;           
;      Case #WM_KEYDOWN,#WM_MENUSELECT
;           SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
;           If wParam=#VK_NEXT                       
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEDOWN,0)
;           ElseIf wParam=#VK_PRIOR
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEUP,0)
;           ElseIf wParam=#VK_UP
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
;           ElseIf wParam=#VK_DOWN
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
;           ElseIf wParam=#VK_HOME
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_TOP,0)
;           ElseIf wParam=#VK_END
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_BOTTOM,0)
;           ElseIf wParam=#VK_LEFT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINELEFT,0)
;           ElseIf wParam=#VK_RIGHT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINERIGHT,0)
;           EndIf

    EndSelect
ProcedureReturn result
EndProcedure
; 
Procedure WndProc(hwnd, uMsg, wParam, lParam)

GetClientRect_(WindowID(0),w.RECT)

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 
                  Col = *LVCDHeader\iSubItem 
                  If (Row/2) * 2 = Row 
                    *LVCDHeader\clrTextBk = $D6FFFF 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  Else 
                    *LVCDHeader\clrTextBk = $CEF6F5 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  EndIf            
                      result = #CDRF_NEWFONT 
            EndSelect 
      EndSelect     


      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING,#HDN_ITEMCHANGED
          If *nmHEADER\hdr\hwndFrom = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
            MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
            rc.RECT\top = 1
            rc.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
            MoveWindow_(GadgetID(2),rc\left+1,24,18,w\bottom-w\top-40,1)
            MoveWindow_(GadgetID(3),rc\right+1,24,18,w\bottom-w\top-40,1)
            UpdateWindow_(WindowID(0))
            RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
            RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
          EndIf
      EndSelect



    Case #WM_SIZE,#WM_MOVE
         MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
         rc.RECT\top = 1
         rc.RECT\left = #LVIR_BOUNDS
         SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
         MoveWindow_(GadgetID(2),rc\left+1,24,18,w\bottom-w\top-40,1)
         MoveWindow_(GadgetID(3),rc\right+1,24,18,w\bottom-w\top-40,1)
         UpdateWindow_(WindowID(0))
         RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)

   EndSelect   
  ProcedureReturn result 
EndProcedure
  
  
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_SizeGadget |#PB_Window_ScreenCentered)
    ListIconGadget(1,10, 10,620, 260, "Column 0",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    AddGadgetColumn(1, 1, "Column 1",150)
    AddGadgetColumn(1, 2, "Column 2",150)
      For i = 3 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 65)
      Next
      For i = 0 To 30
        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
    SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    
    ListIconGadget(2,151,  24, 18, 260, "Column 1",18,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar
    AddGadgetColumn(2, 1, "", 1)
    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 30
        AddGadgetItem(2, i, "")
      Next
      
    ListIconGadget(3,301,  24, 18, 260, "Column 2",18,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 30
        AddGadgetItem(3, i, "")
      Next
      
    oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @LIcallback())
   
    SetWindowCallback(@WndProc())
    UpdateWindow_(WindowID(0))

    Repeat

      Select WaitWindowEvent()
      
        Case #PB_Event_CloseWindow
            Q = 1
       
        Case #WM_CLOSE     
      
        Case #PB_Event_Gadget
          Select EventGadget()
           Case 1            
          EndSelect
    
EndSelect
    Until Q = 1
  EndIf

Egypt my love
kvitaliy
Enthusiast
Enthusiast
Posts: 162
Joined: Mon May 10, 2010 4:02 pm

Re: Update :ListIcon with more than one column with CheckBox

Post by kvitaliy »

RASHAD wrote:New update
Less headache
Full functioning (I think)
Offset lines :(
Image
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Update :ListIcon with more than one column with CheckBox

Post by RASHAD »

kvitaliy Hi
I can not get your supplied image
But I think I got what you mean
See the next code and I am waitng for your comments
Thanks mate

Code: Select all

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

Global header_1,header_2,oldCallback,Row_H ,Header_H,dY
Global w.RECT,rc.RECT,lv.RECT

Procedure LIcallback(hwnd, msg, wparam, lparam)
If IsGadget(3)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
EndIf
result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
;   
  Select msg

    Case #WM_VSCROLL,#WM_MOUSEWHEEL
        SelItem = GetScrollPos_(GadgetID(1),#SB_VERT) - GetScrollPos_(GadgetID(2),#SB_VERT)
        SendMessage_(GadgetID(2), #LVM_SCROLL, 0, SelItem * Row_H)
        SendMessage_(GadgetID(3), #LVM_SCROLL, 0, SelItem * Row_H)
        RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)


    Case #WM_HSCROLL
        rc.RECT\top = 1
        rc.RECT\left = #LVIR_BOUNDS
        SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
        MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
        MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
        RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        

    Case #WM_KEYDOWN,#WM_MENUSELECT
;           SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
;           If wParam=#VK_NEXT                       
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEDOWN,0)
;           ElseIf wParam=#VK_PRIOR
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEUP,0)
;           ElseIf wParam=#VK_UP
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
;           ElseIf wParam=#VK_DOWN
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
;           ElseIf wParam=#VK_HOME
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_TOP,0)
;           ElseIf wParam=#VK_END
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_BOTTOM,0)
;           ElseIf wParam=#VK_LEFT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINELEFT,0)
;           ElseIf wParam=#VK_RIGHT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINERIGHT,0)
;           EndIf

    EndSelect
ProcedureReturn result
EndProcedure
; 
Procedure WndProc(hwnd, uMsg, wParam, lParam)

GetClientRect_(WindowID(0),w.RECT)

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 
                  Col = *LVCDHeader\iSubItem 
                  If (Row/2) * 2 = Row 
                    *LVCDHeader\clrTextBk = $D6FFFF 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  Else 
                    *LVCDHeader\clrTextBk = $CEF6F5 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  EndIf            
                      result = #CDRF_NEWFONT 
            EndSelect 
      EndSelect     


      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING,#HDN_ITEMCHANGED
          If *nmHEADER\hdr\hwndFrom = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
            MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
            rc.RECT\top = 1
            rc.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
            MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
            MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
            RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
            RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)             
            
          EndIf
      EndSelect


    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
         MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
         rc.RECT\top = 1
         rc.RECT\left = #LVIR_BOUNDS
         SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
         GetClientRect_(GadgetID(1),lv.RECT)
         MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
         MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
         RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)

   EndSelect   
  ProcedureReturn result 
EndProcedure
  
  
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget|#PB_Window_SizeGadget |#PB_Window_ScreenCentered)
    ListIconGadget(1,10, 10,620, 266, "Column 0",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
    AddGadgetColumn(1, 1, "Column 1",150)
    AddGadgetColumn(1, 2, "Column 2",150)
      For i = 3 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 65)
      Next
      For i = 0 To 30
        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
    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
    
    If OSVersion() > #PB_OS_Windows_Server_2003
      dY = 7
    Else
      dY = 2
    EndIf
        
    ListIconGadget(2,151,  Header_H, Row_H, 266, "Column 1",Row_H,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 30
        AddGadgetItem(2, i, ""+Chr(10)+"")
      Next
      
    ListIconGadget(3,301,  Header_H, Row_H, 266, "Column 2",Row_H,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 30
        AddGadgetItem(3, i, ""+Chr(10)+"")
      Next
      
    oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @LIcallback())
   
    SetWindowCallback(@WndProc())
    SetActiveGadget(1)

Repeat

      Select WaitWindowEvent()
      
        Case #PB_Event_CloseWindow
            Q = 1
       
        Case #WM_CLOSE     
      
        Case #PB_Event_Gadget
          Select EventGadget()
           Case 1            
          EndSelect
    
EndSelect
    Until Q = 1
  EndIf

Edit : Bug fixed for compatibility
Egypt my love
kvitaliy
Enthusiast
Enthusiast
Posts: 162
Joined: Mon May 10, 2010 4:02 pm

Re: Update :ListIcon with more than one column with CheckBox

Post by kvitaliy »

RASHAD wrote: Edit : Bug fixed for compatibility
It works. Thank you.
User avatar
Michael Vogel
Addict
Addict
Posts: 2797
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Update :ListIcon with more than one column with CheckBox

Post by Michael Vogel »

When the rightmost column (#2 in the example) with a checkbox will be resized to nearly 0 pixel, the checkbox will be seen in the column beside :?
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Update :ListIcon with more than one column with CheckBox

Post by RASHAD »

Hi Michael
Thanks for the comments

Code: Select all

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

Global header_1,header_2,oldCallback,Row_H ,Header_H,dY
Global w.RECT,rc.RECT,lv.RECT

Procedure LIcallback(hwnd, msg, wparam, lparam)
If IsGadget(3)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
EndIf
result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
;   
  Select msg

    Case #WM_VSCROLL,#WM_MOUSEWHEEL
        SelItem = GetScrollPos_(GadgetID(1),#SB_VERT) - GetScrollPos_(GadgetID(2),#SB_VERT)
        SendMessage_(GadgetID(2), #LVM_SCROLL, 0, SelItem * Row_H)
        SendMessage_(GadgetID(3), #LVM_SCROLL, 0, SelItem * Row_H)
        RedrawWindow_(GadgetID(1),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        ;RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)


    Case #WM_HSCROLL
        rc.RECT\top = 1
        rc.RECT\left = #LVIR_BOUNDS
        SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
        MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
        MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
        ;RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        RedrawWindow_(GadgetID(1),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)

    EndSelect
ProcedureReturn result
EndProcedure
; 
Procedure WndProc(hwnd, uMsg, wParam, lParam)

GetClientRect_(WindowID(0),w.RECT)

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 
                  Col = *LVCDHeader\iSubItem 
                  If (Row/2) * 2 = Row 
                    *LVCDHeader\clrTextBk = $D6FFFF 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  Else 
                    *LVCDHeader\clrTextBk = $CEF6F5 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  EndIf            
                      result = #CDRF_NEWFONT 
            EndSelect 
      EndSelect     


      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING
          ;If *nmHEADER\hdr\hwndFrom = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
            ;If *nmHEADER\iItem = 0 :endif;
            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)
          MoveWindow_(GadgetID(2),r1\left+1,Header_H,Row_H,lv\bottom-dY,1)
          MoveWindow_(GadgetID(3),r2\left+1,Header_H,Row_H,lv\bottom-dY,1)
          If r2\left - r1\Left > 24
            HideGadget(2,0)
            HideGadget(3,0)
          Else
            HideGadget(3,0)
          EndIf         

     EndSelect

    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
         MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
         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)
         GetClientRect_(GadgetID(1),lv.RECT)
         MoveWindow_(GadgetID(2),r1\left+1,Header_H,Row_H,lv\bottom-dY,1)
         MoveWindow_(GadgetID(3),r2\left+1,Header_H,Row_H,lv\bottom-dY,1)
         ;InvalidateRect_(GadgetID(1),0,1)
         RedrawWindow_(GadgetID(1),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         
   EndSelect   
  ProcedureReturn result 
EndProcedure
  
  Item_C = 500
  
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget|#PB_Window_SizeGadget |#PB_Window_ScreenCentered)
    ListIconGadget(1,10, 10,620, 266, "Column 0",100,#LVS_EX_DOUBLEBUFFER|#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)

      For i = 1 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 100)
      Next
      
      For i = 0 To Item_C
        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
      
    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
    
    If OSVersion() > #PB_OS_Windows_Server_2003
      dY = 7
    Else
      dY = 3
    EndIf
        
    ListIconGadget(2,151,  Header_H, Row_H, 266, "Column 1",Row_H,#LVS_EX_DOUBLEBUFFER| #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 Item_C
        AddGadgetItem(2, i, ""+Chr(10)+"")
      Next
      
    ListIconGadget(3,301,  Header_H, Row_H, 266, "Column 2",Row_H,#LVS_EX_DOUBLEBUFFER| #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 Item_C
        AddGadgetItem(3, i, ""+Chr(10)+"")
      Next
      
    oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @LIcallback())
   
    SetWindowCallback(@WndProc())
    SetActiveGadget(1)

Repeat

      Select WaitWindowEvent()
      
        Case #PB_Event_CloseWindow
            Q = 1
       
        Case #WM_CLOSE     
      
        Case #PB_Event_Gadget
          Select EventGadget()
           Case 1            
          EndSelect
    
EndSelect
    Until Q = 1
  EndIf

Edit : Bug fixed
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: Update :ListIcon with more than one column with CheckBox

Post by Kwai chang caine »

This time that's works fine for me under XP :D

Thanks a lot for your great job and the sharing 8)
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Update :ListIcon with more than one column with CheckBox

Post by RASHAD »

Thanks KCC
Egypt my love
Post Reply