ListIcon Gadget with Fake Transparent[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

ListIcon Gadget with Fake Transparent[Windows]

Post by RASHAD »

Hi
Workaround
The title say it all

Code: Select all

#LVBKIF_SOURCE_NONE = 0
#LVBKIF_SOURCE_HBITMAP = 1
#LVBKIF_SOURCE_URL = 2
#LVBKIF_SOURCE_MASK = 3
#LVBKIF_STYLE_NORMAL = 0
#LVBKIF_STYLE_TILE = $10
#LVBKIF_STYLE_MASK = $10
#LVBKIF_TYPE_WATERMARK = $10000000

#LVM_GETHEADER = #LVM_FIRST + 31 

Structure LVBKIMAGE Align #PB_Structure_AlignC
  ulFlags.l
  hbm.i
  pszImage.i
  cchImageMax.l
  xOffsetPercent.l
  yOffsetPercent.l
EndStructure

; Globals 
  Global oldListIconCallback, hHeader, brush ,lbk.LVBKIMAGE
  brush=CreateSolidBrush_(#Yellow)


Procedure SubclassedListIcon(hWnd, uMsg, wParam, lParam) 
  Protected hdi.hd_item
  result = CallWindowProc_(oldListIconCallback, hWnd, uMsg, wParam, lParam) 
  Select uMsg
    Case #WM_NOTIFY 
      *pnmh.NMHDR = lparam 
      ;--> Get handle to ListIcon header control 
        If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam 
        ;--> Determine drawing stage 
        Select *pnmcd\dwDrawStage 
          Case #CDDS_PREPAINT 
            result = #CDRF_NOTIFYITEMDRAW 
          Case #CDDS_ITEMPREPAINT 
            text$=GetGadgetItemText(0, -1, *pnmcd\dwItemSpec)
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+1
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT) 
            If *pnmcd\dwItemSpec&1
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Blue) 
            Else
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Red) 
            EndIf
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf
            result = #CDRF_SKIPDEFAULT
        EndSelect 
      EndIf 
  EndSelect 
  ProcedureReturn result 
EndProcedure

Procedure liCB()
  InvalidateRect_(GadgetID(0),0,1)
EndProcedure

UsePNGImageDecoder()
LoadImage(0, GetTemporaryDirectory()+"890FX-Deluxe4(m).png", 0)
ResizeImage(0,1024,768)
If OpenWindow(0, 0, 0, 1024, 768, "", #PB_Window_ScreenCentered | #PB_Window_BorderLess|#PB_Window_Invisible)
  
  ImageGadget(1, 0, 0, 1024, 768, ImageID(0))
  DisableGadget(1,1)
  
  ListIconGadget(0, 175, 150, 700, 500, "No.", 30, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) 
  SetGadgetColor(0,#PB_Gadget_FrontColor,$FFFFFF)
  SetGadgetColor(0,#PB_Gadget_LineColor,$FFFFFF)
  imgID = GrabImage(0,1,175,178,700,500) ;The grabbed dimension is up to you
  CreateImage(2,700,500,24,$FFFFFF)
  StartDrawing(ImageOutput(2))
    DrawAlphaImage(imgID,0,0,150)
  StopDrawing()
  FreeImage(1)
  HideGadget(0,1)
  hHeader = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)   

  AddGadgetColumn(0, 1, "Player names", 150) 
  AddGadgetColumn(0, 2, "Pos", 50)
  AddGadgetColumn(0, 3, "KP", 35)
  AddGadgetColumn(0, 4, "TA", 35)
  AddGadgetColumn(0, 5, "PS", 35)
  AddGadgetColumn(0, 6, "SH", 35)
  AddGadgetColumn(0, 7, "PC", 35)
  AddGadgetColumn(0, 8, "HE", 35)
  AddGadgetColumn(0, 9, "ST", 35)
  AddGadgetColumn(0, 10, "SP", 35)
  AddGadgetColumn(0, 11, "BC", 35)
  AddGadgetColumn(0, 12, "FT", 35)
  AddGadgetColumn(0, 13, "PF", 35)
  ;Next  
;Add some data
  For b=0 To 99; Add 100 rows.
    AddGadgetItem(0,-1,"")
  Next
  For i = 0 To 99
    For j = 0 To 50
      SetGadgetItemText(0,i,Str(i+j),j)
    Next j
  Next i
  oldListIconCallback = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @SubclassedListIcon()) 
  HideGadget(0,0)
  HideWindow(0,0)
  
  lbk.LVBKIMAGE
  lbk\ulFlags =   #LVBKIF_STYLE_TILE | #LVBKIF_SOURCE_HBITMAP
  lbk\hbm = ImageID(2)
  SendMessage_(GadgetID(0), #LVM_SETBKIMAGE, 0, @lbk)
  BindGadgetEvent(0,@liCB())
  Repeat
    WaitWindowEvent(1) 
  Until GetAsyncKeyState_(#VK_ESCAPE) & $8000 = $8000
  DeleteObject_(brush)
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: ListIcon Gadget with Fake Transparent[Windows]

Post by Kwai chang caine »

Works nice with the "XP support theme", this time i have thinking to that before crying :mrgreen:

Very nice effect :shock:
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply