ListIconGadget Selection color

Just starting out? Need help? Post your questions and find answers here.
Nubcake
Enthusiast
Enthusiast
Posts: 195
Joined: Thu Feb 03, 2011 7:44 pm

ListIconGadget Selection color

Post by Nubcake »

With the ListIconGadget you get the default dark blue colour. Is there a way to change it so it looks like this:

Image From Windows Task Manager
Is is owner drawn or are there some simple API calls I can make ;)

Nubcake
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4953
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget Selection color

Post by RASHAD »

Code: Select all

CreateImage(0,16,16)
StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($FEFBF7)
      FrontColor($FDF5E7)      
      LinearGradient(0, 0, 0, 16)    
      Box(0,0,16,16)      
 StopDrawing()  

Global ColorBrush,PlainBrush

ColorBrush = CreatePatternBrush_(ImageID(0))

Procedure WindowCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *nmhdr.NMHDR = lParam
      *lvCD.NMLVCUSTOMDRAW = lParam
      If *lvCD\nmcd\hdr\hwndFrom=GadgetID(0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW   
        Select *lvCD\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            ;result = #CDRF_NOTIFYITEMDRAW
            
          Case #CDDS_ITEMPREPAINT
            result = #CDRF_NOTIFYSUBITEMDRAW
            
          Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
            thisRow = *lvCD\nmcd\dwItemSpec
            thisCol = *lvCD\iSubItem
            
            subItemRect.RECT\left = #LVIR_LABEL
            subItemRect.RECT\top = *lvCD\iSubItem
            
            SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect)
            text$ = GetGadgetItemText(0, thisRow)

            If *lvCD\iSubItem = 0
              subItemRect\left = 0
            EndIf
            If GetGadgetState(0) = thisRow
              FillRect_(*lvCD\nmcd\hdc, subItemRect, ColorBrush)
            EndIf
            InflateRect_(subItemRect,-2,0)           

            For c = 1 To Len(text$)
              c$ = Mid(text$, c, 1)
                For i = c + 1 To Len(text$)
                    c$ + Mid(text$, i, 1)
                    c + 1
                Next             
              SetTextColor_(*lvCD\nmcd\hdc, #Black)
              DrawText_(*lvCD\nmcd\hdc, c$, Len(c$), subItemRect, #DT_END_ELLIPSIS)
             ; subItemRect\left + SendMessage_(*nmhdr\hwndFrom, #LVM_GETSTRINGWIDTH, 0, @c$)
            Next c
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 500, 300, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  SetWindowCallback(@WindowCallback())
  CreateStatusBar(0, WindowID(0))
  ListIconGadget(0, 10, 10, 480, 255, "Column 0", 150, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 1, "Column 1", 150)
  AddGadgetColumn(0, 2, "Column 2", 150)
  
  For a=0 To 9
    addtext$ = "Column 0  item # " + Str(a) + Chr(10) + "Column 1  item # " + Str(a) + Chr(10) + "Column 2  item # " + Str(a)
    AddGadgetItem(0,-1, addtext$)
  Next 

  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
 
EndIf
End 

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

Re: ListIconGadget Selection color

Post by RASHAD »

Revised version

Code: Select all

CreateImage(0,16,16)
StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Gradient)     
      BackColor($FEFBF7)
      FrontColor($FDF5E7)     
      LinearGradient(0, 0, 0, 16)   
      Box(0,0,16,16)     
 StopDrawing() 

Global ColorBrush,PlainBrush

ColorBrush = CreatePatternBrush_(ImageID(0))
PlainBrush = CreateSolidBrush_($F6DCBD)

Procedure WindowCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *nmhdr.NMHDR = lParam
      *lvCD.NMLVCUSTOMDRAW = lParam
      If *lvCD\nmcd\hdr\hwndFrom=GadgetID(0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW   
        Select *lvCD\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            ;result = #CDRF_NOTIFYITEMDRAW
           
          Case #CDDS_ITEMPREPAINT
            result = #CDRF_NOTIFYSUBITEMDRAW
           
          Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
            thisRow = *lvCD\nmcd\dwItemSpec
            thisCol = *lvCD\iSubItem
           
            subItemRect.RECT\left = #LVIR_LABEL
            subItemRect.RECT\top = *lvCD\iSubItem
           
            SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect)
            
            If GetGadgetState(0) = thisRow
              If thisCol = 0
                 subItemRect\left - 3
              EndIf
              FillRect_(*lvCD\nmcd\hdc, subItemRect, PlainBrush)
              subItemRect.RECT\left + 1
              subItemRect.RECT\top + 1              
              subItemRect.RECT\bottom - 2             
              If thisCol = 2
                 subItemRect.RECT\right - 1
              Else
                 subItemRect.RECT\right + 2
              EndIf 
              FillRect_(*lvCD\nmcd\hdc, subItemRect, ColorBrush)
            EndIf
            InflateRect_(subItemRect,-2,0)
                        
            Text$ = GetGadgetItemText(0,thisRow,thisCol)
            SetTextColor_(*lvCD\nmcd\hdc, $373738)
            DrawText_(*lvCD\nmcd\hdc, Text$, Len(Text$), subItemRect, #DT_VCENTER | #DT_END_ELLIPSIS)
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 500, 300, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  SetWindowCallback(@WindowCallback())
  CreateStatusBar(0, WindowID(0))
  ListIconGadget(0, 10, 10, 480, 255, "Column 0", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 1, "Column 1", 200)
  AddGadgetColumn(0, 2, "Column 2", 200)
 
  For a=0 To 9
    addtext$ = "Column 0  item # " + Str(a) + Chr(10) + "Column 1  item # " + Str(a) + Chr(10) + "Column 2  item # " + Str(a)
    AddGadgetItem(0,-1, addtext$)
  Next

  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
 
EndIf
End 
Egypt my love
Fred
Administrator
Administrator
Posts: 18204
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: ListIconGadget Selection color

Post by Fred »

@Rashad: you should edit your post if it's only a resivion :)
Nubcake
Enthusiast
Enthusiast
Posts: 195
Joined: Thu Feb 03, 2011 7:44 pm

Re: ListIconGadget Selection color

Post by Nubcake »

Very nice RASHAD thanks !
dige
Addict
Addict
Posts: 1405
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Re: ListIconGadget Selection color

Post by dige »

Seems not work correctly, if images are added...

Code: Select all

AddGadgetItem(0,-1, addtext$, ImageID(0))
"Daddy, I'll run faster, then it is not so far..."
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: ListIconGadget Selection color

Post by Kwai chang caine »

Very nice, thanks API MASTER 8)
Just a little problem, when i click the first time it's fine
But when i clic another item, the last item clicked is in double (blurred) :shock:
I'm under W7 with 5.23, but it's the same thing in 5.31
ImageThe happiness is a road...
Not a destination
User avatar
chi
Addict
Addict
Posts: 1087
Joined: Sat May 05, 2007 5:31 pm
Location: Austria

Re: ListIconGadget Selection color

Post by chi »

@Nubcake's original question:

Code: Select all

If OpenWindow(0, 0, 0, 500, 300, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  CreateStatusBar(0, WindowID(0))
  ListIconGadget(0, 10, 10, 480, 255, "Column 0", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 1, "Column 1", 200)
  AddGadgetColumn(0, 2, "Column 2", 200)
  For a=0 To 9
    addtext$ = "Column 0  item # " + Str(a) + Chr(10) + "Column 1  item # " + Str(a) + Chr(10) + "Column 2  item # " + Str(a)
    AddGadgetItem(0,-1, addtext$)
  Next
  
  SetWindowTheme_(GadgetID(0), "Explorer", #Null)
  
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow  
EndIf
Et cetera is my worst enemy
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4953
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIconGadget Selection color

Post by RASHAD »

Hi chi
For Ascii & Unicode

Code: Select all

LoadImage(0,"e:\girl24.bmp")

ProcedureDLL.l Ansi2Uni(string.s) ; Converts normal (Ansi) string To Unicode 
  *out = AllocateMemory(Len(string)*4) 
  MultiByteToWideChar_(#CP_ACP, 0, string, -1, *out, Len(string))  
  ProcedureReturn *out  
EndProcedure 

If OpenWindow(0, 0, 0, 500, 300, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  CreateStatusBar(0, WindowID(0))
  ListIconGadget(0, 10, 10, 480, 255, "Column 0", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 1, "Column 1", 200)
  AddGadgetColumn(0, 2, "Column 2", 200)
  For a=0 To 9
    addtext$ = "Column 0  item # " + Str(a) + Chr(10) + "Column 1  item # " + Str(a) + Chr(10) + "Column 2  item # " + Str(a)
    AddGadgetItem(0,-1, addtext$,ImageID(0))
  Next
  
CompilerIf #PB_Compiler_Unicode   
   SetWindowTheme_(GadgetID(0), "Explorer", #Null)
CompilerElse
   SetWindowTheme_(GadgetID(0), Ansi2Uni("Explorer"), #Null)
CompilerEndIf
  
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow  
EndIf

Egypt my love
User avatar
chi
Addict
Addict
Posts: 1087
Joined: Sat May 05, 2007 5:31 pm
Location: Austria

Re: ListIconGadget Selection color

Post by chi »

Hi Rashad! This one works for Ascii & Unicode too... Just let PB do the work :)

Code: Select all

Import "UxTheme.lib"
  SetWindowTheme(hwnd, pszSubAppName.p-Unicode, pszSubIdList)
EndImport

If OpenWindow(0, 0, 0, 500, 300, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  CreateStatusBar(0, WindowID(0))
  ListIconGadget(0, 10, 10, 480, 255, "Column 0", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 1, "Column 1", 200)
  AddGadgetColumn(0, 2, "Column 2", 200)
  For a=0 To 9
    addtext$ = "Column 0  item # " + Str(a) + Chr(10) + "Column 1  item # " + Str(a) + Chr(10) + "Column 2  item # " + Str(a)
    AddGadgetItem(0,-1, addtext$)
  Next
 
  SetWindowTheme(GadgetID(0), "Explorer", #Null)
 
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow 
EndIf
Et cetera is my worst enemy
Post Reply