ListIcon Header Imagination [Windows]

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

ListIcon Header Imagination [Windows]

Post by RASHAD »

Hi all
Have fun
Tested with PB 5.60 x86 - Windows 10 x64

Code: Select all

Global oldliproc,oldhproc, header_h,header

Procedure SetHeaderImage(Gadget, Image, Column)
  HwndHeader = SendMessage_(GadgetID(Gadget), #LVM_GETHEADER, 0, 0) 
  TextColumn.s = Space(255) 
  Var.LVCOLUMN\mask = #LVCF_TEXT 
  Var\pszText = @TextColumn 
  Var\cchTextMax = 255 
  SendMessage_(GadgetID(Gadget), #LVM_GETCOLUMN, Column, @Var) 
  
  VarHeader.HDITEM\mask = #HDI_BITMAP | #HDI_FORMAT; | #HDI_TEXT 
  VarHeader\fmt = #HDF_BITMAP
  VarHeader\hbm = ImageID(Image) 
  VarHeader\pszText = @TextColumn 
  VarHeader\cchTextMax = Len(TextColumn) 
  SendMessage_(HwndHeader, #HDM_SETITEM, Column, @VarHeader) 
EndProcedure 

Procedure lihCB(hWnd, uMsg, wParam, lParam)    
   Select uMsg 
      Case #HDM_LAYOUT
        result = CallWindowProc_(oldhproc, hWnd, uMsg, wParam, lParam)
        *hdlayout.HD_LAYOUT = lParam
        If *hdlayout\prc <> 0
            *rect.RECT = *hdlayout\prc
            *rect\top = header_h
        EndIf
        If *hdlayout\pwpos <> 0
            *windowpos.WINDOWPOS = *hdlayout\pwpos
            *windowpos\cy = header_h
        EndIf
      
      Default
        result = CallWindowProc_(oldhproc, hWnd, uMsg, wParam, lParam)
    
    EndSelect
    ProcedureReturn result
EndProcedure

header_h = 60
row_h = 60

LoadImage(100, #PB_Compiler_Home + "examples/Sources/Data/PureBasicLogo.bmp")

OpenWindow(0, 0, 0, 600, 400, "ListIcon Header", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)

hWnd = ListIconGadget(0, 10, 10, 580, 380, "", 300,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
AddGadgetColumn(0,1,"",200)
AddGadgetColumn(0,2,"",200)
AddGadgetColumn(0,3,"",200)

SetGadgetColor(0,#PB_Gadget_BackColor,$E2FEFE)

imageList = ImageList_Create_(1,row_h, #ILC_COLOR32, 0, 30) 
SendMessage_(hWnd, #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)

header = SendMessage_(hWnd, #LVM_GETHEADER, 0, 0)

oldhproc = SetWindowLongPtr_(header, #GWL_WNDPROC, @lihCB())

LoadFont(0,"Georgia",16,#PB_Font_Bold) 
LoadFont(1,"Tahoma",12)

SendMessage_(header,#HDM_SETBITMAPMARGIN,0,0)

CreateImage(0,600,60,24,$FFFFFF)
StartDrawing(ImageOutput(0))
  DrawImage(ImageID(100),0,0,300,60)
  DrawImage(ImageID(100),300,0,300,60)
  DrawingFont(FontID(font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,5,"RASHAD",$0000FF,$FFFFFF)
StopDrawing()

CreateImage(1,600,60,24,$FFFFFF)
StartDrawing(ImageOutput(1))
  Box(0,0,600,60,$FDF5E3)
  DrawingFont(FontID(font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10,15,"RASHAD",$000000,$FFFFFF)
StopDrawing()

CreateImage(2,600,60,24,$FFFFFF)
StartDrawing(ImageOutput(2))
  Box(0,0,600,60,$FDF5E3)
  DrawingFont(FontID(font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10,15,"RASHAD",$FF0000,$FFFFFF)
StopDrawing()

SetHeaderImage(0, 0, 0)
SetHeaderImage(0, 1, 1)
SetHeaderImage(0, 2, 2)

For l = 1 To 10
    AddGadgetItem(0, -1, "Item " + Str(l) + Chr(10)+"Item " + Str(l)+ Chr(10)+"Item " + Str(l)) 
Next

SetGadgetFont(0,FontID(1))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Egypt my love
User avatar
RSBasic
Moderator
Moderator
Posts: 1218
Joined: Thu Dec 31, 2009 11:05 pm
Location: Gernsbach (Germany)
Contact:

Re: ListIcon Header Imagination [Windows]

Post by RSBasic »

Image
Image
Image
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5353
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: ListIcon Header Imagination [Windows]

Post by Kwai chang caine »

Waooouuuhh !!! MagicalRashad !!! :shock:

Your IMAGINATION !!!

Image

Choubidaaaaaaaaaa !!!
it's just an Illusioooooooooooonnn !!!


https://www.youtube.com/watch?v=0CeDNHqnbIs

Thanks a lot for sharing 8)
ImageThe happiness is a road...
Not a destination
Dude
Addict
Addict
Posts: 1907
Joined: Mon Feb 16, 2015 2:49 pm

Re: ListIcon Header Imagination [Windows]

Post by Dude »

Thanks, Rashad. That's pretty cool! :shock:
Oma
Enthusiast
Enthusiast
Posts: 312
Joined: Thu Jun 26, 2014 9:17 am
Location: Germany

Re: ListIcon Header Imagination [Windows]

Post by Oma »

Good idea,
and i had a clown for breakfast :wink:
For Linux Gtk3 (gtk2 has no text on my quick and dirty attempt)

Code: Select all

EnableExplicit

ImportC ""
	g_signal_connect(*instance, detailed_signal.p-ascii, *c_handler, *data, destroy= 0, flags= 0) As "g_signal_connect_data"
	gtk_tree_view_column_get_tree_view(*Column.GtkTreeViewColumn)
	gtk_tree_view_get_column(*tree_view.GtkTreeView, n)
	gtk_tree_view_column_set_clickable(*tree_view.GtkTreeView, clickable)
	gtk_tree_view_column_set_widget(*tree_column.GtkTreeViewColumn, *widget.GtkWidget)
	gtk_image_new_from_pixbuf(*pixbuf)
EndImport

;Object constants
#Win_Main= 0

#LIG = 0

Global.i gEvent, gQuit
Global.i gFont= 0

LoadFont(0,"Georgia",16,#PB_Font_Bold)
LoadFont(1,"Tahoma",12)

;Set a callback for signal 'header_click'
ProcedureC Callback_TV_HeaderClicked(*Column.GtkTreeViewColumn, Colmn);        callback: LIG-column-header clicked
	If gtk_tree_view_column_get_tree_view(*Column) = GadgetID(#LIG)
		Debug "Click on column-header ..."
		Debug "Column-Index   : " + Str(Colmn)
		Debug "Column-path @  : " + Str(*Column)
		Debug "TreeView @     : " + gtk_tree_view_column_get_tree_view(*Column)
		Debug ""
	EndIf
EndProcedure

Procedure SetHeaderImage(Gadget, Image, Column)
		Protected *gImage= gtk_image_new_from_pixbuf(ImageID(Image))
		Protected *Column= gtk_tree_view_get_column(GadgetID(Gadget), Column)
		
		gtk_tree_view_column_set_clickable(*Column, #True)
		gtk_tree_view_column_set_widget(*Column, *gImage)
		g_signal_connect(*Column, "clicked", @Callback_TV_HeaderClicked(), Column); set a signal for header click
		gtk_widget_show_(*gImage)
EndProcedure

Procedure CreateWindow_Main()
	Protected.i l
	If OpenWindow(#Win_Main, 0, 0, 600, 400, "ListIcon Header", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
		ListIconGadget(#LIG, 10, 10, 580, 380, "", 300, #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines)

		AddGadgetColumn(#LIG, 1, "", 200)
		AddGadgetColumn(#LIG, 2, "", 200)
		AddGadgetColumn(#LIG, 3, "", 200)
		
		LoadImage(100, #PB_Compiler_Home + "examples/sources/Data/PureBasicLogo.bmp")
		
		CreateImage(0,600,60,24,$FFFFFF)
		StartDrawing(ImageOutput(0))
		  DrawImage(ImageID(100),0,0,300,60)
		  DrawImage(ImageID(100),300,0,300,60)
		  DrawingFont(FontID(gFont))
		  DrawingMode(#PB_2DDrawing_Transparent)
		  DrawText(5,5,"RASHAD" + #LF$ + "on Linux ;-)",$0000FF,$FFFFFF)
		StopDrawing()
		
		CreateImage(1,600,60,24,$FFFFFF)
		StartDrawing(ImageOutput(1))
		  Box(0,0,600,60,$FDF5E3)
		  DrawingFont(FontID(gFont))
		  DrawingMode(#PB_2DDrawing_Transparent)
		  DrawText(10,15,"RASHAD" + #LF$ + "on Linux ;-)",$000000,$FFFFFF)
		StopDrawing()
		
		CreateImage(2,600,60,24,$FFFFFF)
		StartDrawing(ImageOutput(2))
		  Box(0,0,600,60,$FDF5E3)
		  DrawingFont(FontID(gFont))
		  DrawingMode(#PB_2DDrawing_Transparent)
		  DrawText(10,15,"RASHAD" + #LF$ + "on Linux ;-)",$FF0000,$FFFFFF)
		StopDrawing()
		
		SetHeaderImage(#LIG, 0, 0)
		SetHeaderImage(#LIG, 1, 1)
		SetHeaderImage(#LIG, 2, 2)
		
		For l = 1 To 10
		    AddGadgetItem(#LIG, -1, "Item " + Str(l) + Chr(10)+"Item " + Str(l)+ Chr(10)+"Item " + Str(l))
		Next
		
	EndIf
	
EndProcedure

CreateWindow_Main()

Repeat
	gEvent= WaitWindowEvent()

	Select gEvent
		Case #PB_Event_CloseWindow
			gQuit= #True
			
	EndSelect
	
Until gQuit
Regards, Charly
PureBasic 5.4-5.7, Linux: (X/L/K)Ubuntus+Mint - Windows XP (32Bit)
PureBasic Linux-API-Library & Viewer: http://www.chabba.de
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4660
Joined: Sun Apr 12, 2009 6:27 am

Re: ListIcon Header Imagination [Windows]

Post by RASHAD »

@RSBasic,@KCC,@Dude & @Oma
Thanks guys
Did some changes I hope you will like it

Code: Select all

Global oldliproc,oldhproc, header_h,header,col

Procedure SetHeaderImage(Gadget, Image, Column)
  HwndHeader = SendMessage_(GadgetID(Gadget), #LVM_GETHEADER, 0, 0) 
  VarHeader.HDITEM\mask = #HDI_BITMAP | #HDI_FORMAT; | #HDI_TEXT 
  VarHeader\fmt = #HDF_BITMAP
  VarHeader\hbm = ImageID(Image) 
  SendMessage_(HwndHeader, #HDM_SETITEM, Column, @VarHeader) 
EndProcedure 

Procedure lihCB(hWnd, uMsg, wParam, lParam)    
   Select uMsg
      Case #HDM_LAYOUT
        result = CallWindowProc_(oldhproc, hWnd, uMsg, wParam, lParam)
        *hdlayout.HD_LAYOUT = lParam
        If *hdlayout\prc <> 0
            *rect.RECT = *hdlayout\prc
            *rect\top = header_h
        EndIf
        If *hdlayout\pwpos <> 0
            *windowpos.WINDOWPOS = *hdlayout\pwpos
            *windowpos\cy = header_h
        EndIf
      
      Default
        result = CallWindowProc_(oldhproc, hWnd, uMsg, wParam, lParam)
    
    EndSelect
    ProcedureReturn result
EndProcedure

Procedure MainWin_CB(hWnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents 
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lParam
      If *pnmh\hwndFrom = header
         *phdn.NMHEADER = lParam 
         col = *phdn\iItem
        If *pnmh\code = #HDN_ITEMCHANGING
          If GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,col) >= 600
            ReleaseCapture_()
          EndIf
        ElseIf *pnmh\code = #HDN_ITEMCHANGED
          If GetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,col) >= 595
            SetGadgetItemAttribute(0,0,#PB_ListIcon_ColumnWidth,590,col)
          EndIf
        EndIf
      EndIf
  
    Case #WM_SIZE
      ResizeGadget(0,10,10,WindowWidth(0)-20,WindowHeight(0)-20)
  EndSelect 
  ProcedureReturn Result
EndProcedure

header_h = 60
row_h = 30

LoadFont(0,"Georgia",16,#PB_Font_Bold) 
LoadFont(1,"Tahoma",12)

LoadImage(100, #PB_Compiler_Home + "examples/Sources/Data/PureBasicLogo.bmp")

OpenWindow(0, 0, 0, 600, 400, "ListIcon Header", #PB_Window_SystemMenu |#PB_Window_ScreenCentered|#PB_Window_SizeGadget)

hWnd = ListIconGadget(0, 10, 10, 580, 380, "", 300,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect )
AddGadgetColumn(0,1,"",200)
AddGadgetColumn(0,2,"",200)
AddGadgetColumn(0,3,"",200)

SetGadgetColor(0,#PB_Gadget_BackColor,$E2FEFE)
SetGadgetFont(0,FontID(1))

header = SendMessage_(hWnd, #LVM_GETHEADER, 0, 0)

oldhproc = SetWindowLongPtr_(header, #GWL_WNDPROC, @lihCB())

SendMessage_(header,#HDM_SETBITMAPMARGIN,1,0)

CreateImage(0,600,60,24,$FFFFFF)
StartDrawing(ImageOutput(0))
  DrawImage(ImageID(100),0,0,300,60)
  DrawImage(ImageID(100),300,0,300,60)
  DrawingFont(FontID(font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,5,"RASHAD",$0000FF,$FFFFFF)
StopDrawing()

CreateImage(1,600,60,24,$FFFFFF)
StartDrawing(ImageOutput(1))
  Box(0,0,600,60,$FDF5E3)
  DrawingFont(FontID(font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10,15,"RASHAD",$000000,$FFFFFF)
StopDrawing()

CreateImage(2,600,60,24,$FFFFFF)
StartDrawing(ImageOutput(2))
  Box(0,0,600,60,$FDF5E3)
  DrawingFont(FontID(font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10,15,"RASHAD",$FF0000,$FFFFFF)
StopDrawing()

SetHeaderImage(0, 0, 0)
SetHeaderImage(0, 1, 1)
SetHeaderImage(0, 2, 2)

For l = 1 To 100
    AddGadgetItem(0, -1, "Item " + Str(l) + Chr(10)+"Item " + Str(l)+ Chr(10)+"Item " + Str(l)) 
Next

SetWindowCallback(@MainWin_CB())

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Egypt my love
Post Reply