Seite 1 von 1

Listicongadget flackert bei SetGadgetItemColor+#LVN_HOTTRACK

Verfasst: 06.03.2009 22:45
von hjbremer
kleines Problem beim Farbenwechsel im Callback mit #LVN_HOTTRACK

liegt es an PB ?, weil immer die ganze Liste bei Verwendung von SetGadgetItemColor neu gezeichnet wird oder wie kann man das Problem lösen ?

Code: Alles auswählen

Declare myCback(hwnd, message, wParam, lParam) 

Structure myprgVar
 win.i
 lvnr.i
 lvid.i
EndStructure

Global vlv.myprgvar

vlv\win = OpenWindow(0,50,50,640,480,"ListIcon Gadget",#PB_Window_SystemMenu) 
       ;CreateGadgetList(vlv\win) 

       flags = #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines 
       vlv\lvnr = 1
       vlv\lvid = ListIconGadget(1,10,12,600,400,"",0,flags) 
                  AddGadgetColumn(1,1,"Spalte 1",140) 
                  AddGadgetColumn(1,2,"Spalte 2",140) 
                  AddGadgetColumn(1,3,"Spalte 3",140) 
                  AddGadgetColumn(1,4,"Spalte 4",159) 

       For i = 1 To 62 
          nr$ = RSet(Str(i),3," ") 
          txt$ = #LF$+nr$+#LF$+"Text in Zeile "+nr$+#LF$+"Spalte 3"+#LF$+"Spalte 4"
          AddGadgetItem(1, -1, txt$) 
       Next
       
  SetWindowCallback(@myCback()) 
             
;=====================================================

Procedure myCback(hwnd, message, wParam, lParam) 
result = #PB_ProcessPureBasicEvents 
    
;*vlv ist global
Static iitem, isubitem, oldiitem, oldisubitem

If message = #WM_NOTIFY 

     *nmhdr.NMHDR = lParam 

     ;Headerbreite sperren, egal welcher Header
     If *nmhdr\code = #HDN_ITEMCHANGING: result = #True: EndIf 
     
     ;Id der Liste abfragen
     If *nmhdr\hwndFrom = vlv\lvid 

        *nmlv.NM_LISTVIEW = lParam
        If *nmlv\hdr\code = #LVN_HOTTRACK   
           
           iitem = *nmlv\iitem             
           isubitem = *nmlv\isubitem
                      
           If iitem <> oldiitem Or isubitem <> oldisubitem
              ;DisableGadget(vlv\lvnr,1)
              SetGadgetItemColor(vlv\lvnr,oldiitem,#PB_Gadget_BackColor,-1,oldisubitem)
              SetGadgetItemColor(vlv\lvnr,iitem,#PB_Gadget_BackColor,#Red,isubitem)
              oldiitem = iitem: oldisubitem = isubitem
              ;DisableGadget(vlv\lvnr,0)
           EndIf
                     
        EndIf  

     EndIf 
     
EndIf 

ProcedureReturn result 
EndProcedure 

Repeat
  event = WaitWindowEvent() 
Until event = #PB_Event_CloseWindow 

End