Updated :Virtual ListIcon with ChechBoxes [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

Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

Hi

Code: Select all


#ItemCount = 10000 

#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2 
#LVN_ODCACHEHINT = #LVN_FIRST - 13


Global Dim myItems.s(#ItemCount,1) 
Global Dim CheckFlag(#ItemCount)

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY                             
      *nmh.NMHDR = lParam 
      Select *nmh\code
                            
        Case #LVN_ODCACHEHINT 
          result = 0
          
        Case #LVN_ODFINDITEM
          result = -1   
           
        Case #LVN_GETDISPINFO 
          *nmlvd.NMLVDISPINFO = lParam
          If *nmlvd\item\mask & #LVIF_TEXT
            *nmlvd\item\pszText = @myItems(*nmlvd\item\iItem,*nmlvd\item\iSubItem)
          EndIf
          
          If *nmlvd\item\mask & #LVIF_IMAGE
              *nmlvd\item\mask & #LVIF_STATE|#LVIF_TEXT
              *nmlvd\item\stateMask = #LVIS_STATEIMAGEMASK
          EndIf
          
          If *nmlvd\item\mask & #LVIF_STATE
            Select CheckFlag(*nmlvd\item\iItem)
              Case 0
                  *nmlvd\item\state = 1 << 12
               
              Case 1
                  *nmlvd\item\state = 2 << 12
                  
            EndSelect
          EndIf
          SendMessage_(GadgetID(0), #LVM_UPDATE , *nmlvd\item\iItem, 0)
          
        Case #NM_CLICK
          *nmlv.NM_LISTVIEW = lParam
          If *nmlv\iSubItem = 0
            CheckFlag(*nmlv\iItem) = CheckFlag(*nmlv\iItem) ! 1
          EndIf

      EndSelect      

  EndSelect 
  ProcedureReturn result 
EndProcedure 

  OpenWindow(0, 0, 0, 640, 300, "Virtual ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  ListIconGadget(0,10,10,620,280,"ID",100,#LVS_OWNERDATA|#PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines)
  SetGadgetColor(0,#PB_Gadget_BackColor, $E1FEFD) 
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, #ItemCount, #LVSICF_NOINVALIDATEALL|#LVSICF_NOSCROLL) 
  AddGadgetColumn(0,2,"Name",100) 
  For i=0 To #ItemCount 
    myItems(i,0) = Str(i) 
    myItems(i,1) = "Name "+Str(i) 
  Next i 
  
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 

; (INDEX SHL 12)  INDEX can be 0,1 or 2:
;0 = no checkbox
;1 = unchecked checkbox
;2 = checked checkbox
;    mov lvi.stateMask, LVIS_STATEIMAGEMASK
;    mov lvi.state,(2 SHL 12)
;    invoke SendMessage, _hListView, LVM_SETITEMSTATE, lvi.iItem, ADDR lvi.LV_ITEM 

Last edited by RASHAD on Mon Sep 12, 2011 5:00 pm, edited 1 time in total.
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: Virtual ListIcon with ChechBoxes [Windows]

Post by Kwai chang caine »

Thanks RASHAD for your great code 8)

But i have a little problem.
The grid flikering and i can't use the scrollbar :(

And it's very difficult to close the program ....
I'm under XP SP3, PB v4.51
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

Hi KCC
The problem confirmed and addressed
I will see what I can do to solve it

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

Re: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

Tested with Win 7 x86 - Win XP SP2 x86

Code: Select all


#ItemCount = 10000 

#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2 
#LVN_ODCACHEHINT = #LVN_FIRST - 13


Global Dim myItems.s(#ItemCount,1) 
Global Dim CheckFlag(#ItemCount)


Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY                             
      *nmh.NMHDR = lParam 
      Select *nmh\code
                            
        Case #LVN_ODCACHEHINT 
          result = 0
          
        Case #LVN_ODFINDITEM
          result = -1   
           
        Case #LVN_GETDISPINFO 
          *nmlvd.NMLVDISPINFO = lParam
          If *nmlvd\item\mask & #LVIF_TEXT
            *nmlvd\item\pszText = @myItems(*nmlvd\item\iItem,*nmlvd\item\iSubItem)
          EndIf
          
          If *nmlvd\item\mask & #LVIF_IMAGE
              *nmlvd\item\mask & #LVIF_IMAGE|#LVIF_STATE|#LVIF_TEXT
              *nmlvd\item\stateMask = #LVIS_STATEIMAGEMASK
          EndIf            

          If *nmlvd\item\mask & #LVIF_STATE
            *nmlvd\item\stateMask = #LVIS_STATEIMAGEMASK

            Select CheckFlag(*nmlvd\item\iItem)
              Case 0
                  *nmlvd\item\state = 1<<12               
              Case 1
                  *nmlvd\item\state = 2<<12
            EndSelect
          EndIf
          SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,*nmlvd\item\iItem,*nmlvd\item\iItem)
          
        Case #NM_CLICK
          *nmlv.NM_LISTVIEW = lParam
          If *nmlv\iSubItem = 0
            CheckFlag(*nmlv\iItem) = CheckFlag(*nmlv\iItem) ! 1
          EndIf

      EndSelect      

  EndSelect 
  ProcedureReturn result 
EndProcedure 

  OpenWindow(0, 0, 0, 640, 300, "Virtual ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  ListIconGadget(0,10,10,620,280,"ID",100,#LVS_OWNERDATA|#PB_ListIcon_CheckBoxes| #PB_ListIcon_GridLines)
  SetGadgetColor(0,#PB_Gadget_BackColor, $E1FEFD) 
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, #ItemCount, #LVSICF_NOINVALIDATEALL|#LVSICF_NOSCROLL) 
  AddGadgetColumn(0,2,"Name",100) 
  For i=0 To #ItemCount 
    myItems(i,0) = Str(i) 
    myItems(i,1) = "Name "+Str(i) 
  Next i 
  
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow

; (INDEX SHL 12)  INDEX can be 0,1 or 2:
;0 = no checkbox
;1 = unchecked checkbox
;2 = checked checkbox
;    mov lvi.stateMask, LVIS_STATEIMAGEMASK
;    mov lvi.state,(2 SHL 12)
;    invoke SendMessage, _hListView, LVM_SETITEMSTATE, lvi.iItem, ADDR lvi.LV_ITEM 

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

Re: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

Code optimized

Code: Select all

#ItemCount = 10000 

#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2 
#LVN_ODCACHEHINT = #LVN_FIRST - 13


Global Dim myItems.s(#ItemCount,1) 
Global Dim CheckFlag(#ItemCount)


Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY                             
      *nmh.NMHDR = lParam 
      Select *nmh\code
                            
        Case #LVN_ODCACHEHINT 
          result = 0
          
        Case #LVN_ODFINDITEM
          result = -1   
           
        Case #LVN_GETDISPINFO 
          *nmlvd.NMLVDISPINFO = lParam
           *nmlvd\item\mask & #LVIF_IMAGE|#LVIF_STATE|#LVIF_TEXT
            *nmlvd\item\stateMask = #LVIS_STATEIMAGEMASK
            *nmlvd\item\pszText = @myItems(*nmlvd\item\iItem,*nmlvd\item\iSubItem)
            
            Select CheckFlag(*nmlvd\item\iItem)
              Case 0
                  *nmlvd\item\state = 1<<12               
              Case 1
                  *nmlvd\item\state = 2<<12
            EndSelect

          SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,*nmlvd\item\iItem,*nmlvd\item\iItem)
          
        Case #NM_CLICK
          *nmlv.NM_LISTVIEW = lParam
          If *nmlv\iSubItem = 0
            CheckFlag(*nmlv\iItem) = CheckFlag(*nmlv\iItem) ! 1
          EndIf

      EndSelect      

  EndSelect 
  ProcedureReturn result 
EndProcedure 

  OpenWindow(0, 0, 0, 640, 300, "Virtual ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  ListIconGadget(0,10,10,620,280,"ID",100,#LVS_OWNERDATA|#PB_ListIcon_CheckBoxes| #PB_ListIcon_GridLines)
  SetGadgetColor(0,#PB_Gadget_BackColor, $E1FEFD) 
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, #ItemCount, #LVSICF_NOINVALIDATEALL|#LVSICF_NOSCROLL) 
  AddGadgetColumn(0,2,"Name",100) 
  For i=0 To #ItemCount 
    myItems(i,0) = Str(i) 
    myItems(i,1) = "Name "+Str(i) 
  Next i 
  
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow

; (INDEX SHL 12)  INDEX can be 0,1 or 2:
;0 = no checkbox
;1 = unchecked checkbox
;2 = checked checkbox
;    mov lvi.stateMask, LVIS_STATEIMAGEMASK
;    mov lvi.state,(2 SHL 12)
;    invoke SendMessage, _hListView, LVM_SETITEMSTATE, lvi.iItem, ADDR lvi.LV_ITEM 

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: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by Kwai chang caine »

I'm desolate but the flickering is always here with XP
With the two code, optimized or not :(
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

Kwaï Hi
I am afraid I can not simulate your case
Everything works 100% fine with PB 4.6 XP SP2 x86
No flicker at all

Now this is your turn
Try to comment
SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,*nmlvd\item\iItem,*nmlvd\item\iItem)
and see if the flicker stops
If not try to comment any other part of the code until the flicker stops
then tell me
Unless it is your eye glasses :mrgreen:
BTW what is your configuration?
I'm desolate
Keep the spirit KCC
Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

KCC Hi
See if the next canceled the flicker or not
Hope YES

Code: Select all

#ItemCount = 10000 

#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2 
#LVN_ODCACHEHINT = #LVN_FIRST - 13


Global Dim myItems.s(#ItemCount,1) 
Global Dim CheckFlag(#ItemCount)

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY                             
      *nmh.NMHDR = lParam 
      Select *nmh\code
                            
        Case #LVN_ODCACHEHINT 
          result = 0
          
        Case #LVN_ODFINDITEM
          result = -1   
           
        Case #LVN_GETDISPINFO 
          *nmlvd.NMLVDISPINFO = lParam
           *nmlvd\item\mask & #LVIF_IMAGE|#LVIF_STATE|#LVIF_TEXT
            *nmlvd\item\stateMask = #LVIS_STATEIMAGEMASK
            *nmlvd\item\pszText = @myItems(*nmlvd\item\iItem,*nmlvd\item\iSubItem)
            
            Select CheckFlag(*nmlvd\item\iItem)
              Case 0
                  *nmlvd\item\state = 1<<12               
              Case 1
                  *nmlvd\item\state = 2<<12
            EndSelect
          
        Case #NM_CLICK
          *nmlv.NM_LISTVIEW = lParam
          If *nmlv\iSubItem = 0 And *nmlv\iItem >= 0
              CheckFlag(*nmlv\iItem) = CheckFlag(*nmlv\iItem) ! 1
              SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,*nmlv\iItem,*nmlv\iItem)
          EndIf

      EndSelect      

  EndSelect 
  ProcedureReturn result 
EndProcedure 

  OpenWindow(0, 0, 0, 640, 300, "Virtual ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  ListIconGadget(0,10,10,620,280,"ID",100,#LVS_OWNERDATA|#PB_ListIcon_CheckBoxes| #PB_ListIcon_GridLines)
  SetGadgetColor(0,#PB_Gadget_BackColor, $E1FEFD) 
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, #ItemCount, #LVSICF_NOINVALIDATEALL|#LVSICF_NOSCROLL) 
  AddGadgetColumn(0,2,"Name",100) 
  For i=0 To #ItemCount 
    myItems(i,0) = Str(i) 
    myItems(i,1) = "Name "+Str(i) 
  Next i 
  
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow

; (INDEX SHL 12)  INDEX can be 0,1 or 2:
;0 = no checkbox
;1 = unchecked checkbox
;2 = checked checkbox
;    mov lvi.stateMask, LVIS_STATEIMAGEMASK
;    mov lvi.state,(2 SHL 12)
;    invoke SendMessage, _hListView, LVM_SETITEMSTATE, lvi.iItem, ADDR lvi.LV_ITEM 


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: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by Kwai chang caine »

Unless it is your eye glasses :mrgreen:
:lol: :lol: :lol:
I follow your advice and have cleaned my glasses...and it's the same effect :mrgreen:
Now this is your turn
Try to comment
SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,*nmlvd\item\iItem,*nmlvd\item\iItem)
and see if the flicker stops
You are a king :D
When i commented this line that's works in v4.51 XP SP3 ...coool !!!!
KCC Hi
See if the next canceled the flicker or not
Hope YES
Yeeeeeeeeeessssss !!!!
Your last code works fine too 8)

Thanks a lot RASHAD for your sharing
Have a very good day
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Updated :Virtual ListIcon with ChechBoxes [Windows]

Post by RASHAD »

Thanks KCC
Glad that you got it at last :mrgreen:
Egypt my love
Post Reply