Get Treeview Node Icon?

BlitzMax Forums/BlitzMax GUI Programming/Get Treeview Node Icon?

For windows. I'm not sure how much of this header you'll need, don't have a lot of time to filter it out for you, but the two functions below should do what you want.

Extern "win32"
	Function SendMessage:Int(hWnd:Int,MSG:Int,wParam:Int,lParam:Int) = "SendMessageA@16"
	Function SetWindowLong:Int(hWnd:Int,nIndex:Int,lNewLong:Long)= "SetWindowLongA@12"
	Function GetModuleHandleA:Int(lMod:Long)'Function CreateWindowExA(dwExStyle:Double,lpClassName:Byte Ptr,lpWindowName:Byte Ptr,dwStyle:Double,x:Int,y:Int,nWidth:Int,nHeight:Int,hWndParent:Int,HMENU:Int,HINSTANCE:Int,LPVOID:Int)
	Function GetWindowLong:Int(hWnd:Int,nIndex:Int)= "GetWindowLongA@8"
	Function MoveWindow(hWnd:Int,X:Int,Y:Int,nWidth:Int,nHeight:Int,bRepaint:Byte)
	Function SetWindowPos:Int( hwnd:Int, hwndafter:Int, x:Int,y:Int, cx:Int,cy:Int, flags:Int)
	Function RedrawWindow:Int( hwnd:Int, rect:Byte Ptr, region:Int, flags:Int)
End Extern

Const SWP_DRAWFRAME:Int = 32
Const SWP_FRAMECHANGED:Int = 32
Const SWP_HIDEWINDOW:Int = 128
Const SWP_NOACTIVATE:Int = 16
Const SWP_NOCOPYBITS:Int = 256
Const SWP_NOMOVE:Int = 2
Const SWP_NOSIZE:Int = 1
Const SWP_NOREDRAW:Int = 8
Const SWP_NOZORDER:Int = 4
Const SWP_SHOWWINDOW:Int = 64
Const SWP_NOOWNERZORDER:Int = 512
Const SWP_NOREPOSITION:Int = 512
Const SWP_NOSENDCHANGING:Int = 1024
Const SWP_DEFERERASE:Int = 8192
Const SWP_ASYNCWINDOWPOS:Int =  16384

Const RDW_ERASE:Int = 4
Const RDW_FRAME:Int = 1024
Const RDW_INTERNALPAINT:Int = 2
Const RDW_INVALIDATE:Int = 1
Const RDW_NOERASE:Int = 32
Const RDW_NOFRAME:Int = 2048
Const RDW_NOINTERNALPAINT:Int = 16
Const RDW_VALIDATE:Int = 8
Const RDW_ERASENOW:Int = 512
Const RDW_UPDATENOW:Int = 256
Const RDW_ALLCHILDREN:Int = 128
Const RDW_NOCHILDREN:Int = 64

Const WS_BORDER:Int = $800000 ' thin border
Const WS_EX_CLIENTEDGE:Int = 512 ' 3d border


' Tree view
Const TVS_HASBUTTONS:Int        = $0001
Const TVS_HASLINES:Int          = $0002
Const TVS_LINESATROOT:Int       = $0004
Const TVS_EDITLABELS:Int        = $0008
Const TVS_DISABLEDRAGDROP:Int   = $0010
Const TVS_SHOWSELALWAYS:Int     = $0020
Const TVS_RTLREADING:Int        = $0040
Const TVS_NOTOOLTIPS:Int        = $0080
Const TVS_CHECKBOXES:Int        = $0100
Const TVS_TRACKSELECT:Int       = $0200
Const TVS_SINGLEEXPAND:Int 	    = $0400
Const TVS_INFOTIP:Int      	    = $0800
Const TVS_FULLROWSELECT:Int	    = $1000
Const TVS_NOSCROLL:Int     	    = $2000
Const TVS_NONEVENHEIGHT:Int	    = $4000

Const TVS_SHAREDIMAGELISTS:Int  = $0000
Const TVS_PRIVATEIMAGELISTS:Int = $0400

Const TV_FIRST:Int				= $1100
Const TVM_GETITEMRECT:Int 		= (TV_FIRST + 4)
Const TVM_SETIMAGELIST:Int 		= (TV_FIRST + 9)
Const TVM_HITTEST:Int 			= (TV_FIRST + 17)
Const TVM_SORTCHILDRENCB:Int 	= (TV_FIRST + 21)
Const TVM_GETITEMW:Int 			= (TV_FIRST + 62)
Const TVM_SETITEMW:Int 			= (TV_FIRST + 63)
Const TVM_INSERTITEMW:Int 		= (TV_FIRST + 50)
Const TVM_GETITEM:Int 			= TV_FIRST + 62
Const TVM_SETITEM:Int 			= TV_FIRST + 13
Const TVM_GETNEXTITEM:Int 		= TV_FIRST + 10
Const TVM_GETITEMSTATE:Int 		= TV_FIRST + 39
Const TVM_GETITEM32A:Int 		= (TV_FIRST+12)
Const TVM_GETITEM32W:Int 		= (TV_FIRST+62)
Const TVM_GETCOUNT:Int 			= (TV_FIRST+5)
Const TVM_SELECTITEM:Int 		= (TV_FIRST+11)
Const TVM_SORTCHILDREN:Int 		= (TV_FIRST+19)
Const TVIS_EXPANDED:Int 		= $20
Const TVSIL_NORMAL:Int 			= 0
Const TVSIL_STATE:Int 			= 2
Const TVGN_NEXT:Int 			= 1
Const TVGN_CHILD:Int 			= 4
Const TVGN_CARET:Int 			= $9

Const GWL_STYLE:Int 			= -$10

Type TVITEM
    Field mask:Int
    Field hItem:Int			'HTREEITEM 
    Field state:Int
    Field stateMask:Int
    Field pszText:Byte Ptr 	'LPTSTR 
    Field cchTextMax:Int
    Field iImage:Int
    Field iSelectedImage:Int
    Field cChildren:Int
    Field lParam:Int			'LPARAM
EndType


' List box
Const LBS_NOTIFY:Int            = $1
Const LBS_SORT:Int              = $2
Const LBS_NOREDRAW:Int          = $4
Const LBS_MULTIPLESEL:Int       = $8
Const LBS_OWNERDRAWFIXED:Int    = $10
Const LBS_OWNERDRAWVARIABLE:Int = $20
Const LBS_HASSTRINGS:Int        = $40
Const LBS_USETABSTOPS:Int       = $70
Const LBS_NOINTEGRALHEIGHT:Int  = $100
Const LBS_MULTICOLUMN:Int       = $200
Const LBS_WANTKEYBOARDINPUT:Int = $400
Const LBS_EXTENDEDSEL:Int       = $800
Const LBS_DISABLENOSCROLL:Int   = $100
Const LBS_NODATA:Int            = $2000
Const LBS_NOSEL:Int             = $4000
Const LBS_STANDARD:Int          = $a00003


Const LVM_FIRST:Int = $1000
Const LVM_GETITEMA:Int          = (LVM_FIRST+5)
Const LVM_SETITEMA:Int          = (LVM_FIRST+6)
Const LVM_INSERTITEMA:Int       = (LVM_FIRST+7)
Const LVM_DELETEITEM:Int        = (LVM_FIRST+8)
Const LVM_DELETEALLITEMS:Int    = (LVM_FIRST+9)
Const LVM_GETCALLBACKMASK:Int   = (LVM_FIRST+10)
Const LVM_SETCALLBACKMASK:Int   = (LVM_FIRST+11)
Const LVM_GETCOLUMNA:Int        = (LVM_FIRST+25)
Const LVM_SETCOLUMNA:Int        = (LVM_FIRST+26)
Const LVM_INSERTCOLUMNA:Int     = (LVM_FIRST+27)
Const LVM_DELETECOLUMN:Int      = (LVM_FIRST+28)
Const LVM_GETCOLUMNWIDTH:Int    = (LVM_FIRST+29)
Const LVM_SETCOLUMNWIDTH:Int    = (LVM_FIRST+30)
Const LVM_GETTEXTCOLOR:Int      = (LVM_FIRST+35)
Const LVM_SETTEXTCOLOR:Int      = (LVM_FIRST+36)
Const LVM_GETTEXTBKCOLOR:Int    = (LVM_FIRST+37)
Const LVM_SETTEXTBKCOLOR:Int    = (LVM_FIRST+38)
Const LVM_SORTITEMS:Int         = (LVM_FIRST+48)
Const LVM_SETLISTBOXEXSTYLE:Int = (LVM_FIRST+54)
Const LVM_GETITEMW:Int          = (LVM_FIRST+75)
Const LVM_SETITEMW:Int          = (LVM_FIRST+76)
Const LVM_INSERTITEMW:Int       = (LVM_FIRST+77)
Const LVM_GETCOLUMNW:Int        = (LVM_FIRST+95)
Const LVM_SETCOLUMNW:Int        = (LVM_FIRST+96)
Const LVM_INSERTCOLUMNW:Int     = (LVM_FIRST+97)

Const LVCF_FMT:Int     = $1
Const LVCF_WIDTH:Int   = $2
Const LVCF_TEXT:Int    = $4
Const LVCF_SUBITEM:Int = $8
Const LVCF_IMAGE:Int   = $10
Const LVCF_ORDER:Int   = $20

Const LVS_ALIGNTOP:Int        = $0
Const LVS_ICON:Int            = $0
Const LVS_REPORT:Int          = $1
Const LVS_SMALLICON:Int       = $2
Const LVS_LIST:Int            = $3
Const LVS_TYPEMASK:Int        = $3
Const LVS_SINGLESEL:Int       = $4
Const LVS_SHOWSELALWAYS:Int   = $8
Const LVS_SORTASCENDING:Int   = $10
Const LVS_SORTDESCENDING:Int  = $20
Const LVS_SHAREIMAGELISTS:Int = $40
Const LVS_NOLABELWRAP:Int     = $80
Const LVS_AUTOARRANGE:Int     = $100
Const LVS_EDITLABELS:Int      = $200
Const LVS_OWNERDRAWFIXED:Int  = $400
Const LVS_ALIGNLEFT:Int       = $800
Const LVS_ALIGNMASK:Int       = $C00
Const LVS_NOSCROLL:Int        = $2000
Const LVS_NOCOLUMNHEADER:Int  = $4000
Const LVS_NOSORTHEADER:Int    = $8000
Const LVS_TYPESTYLEMASK:Int   = $FC00

Const LVS_EX_GRIDLINES:Int        = $1
Const LVS_EX_SUBITEMIMAGES:Int    = $2
Const LVS_EX_CHECKBOXES:Int       = $4
Const LVS_EX_TRACKSELECT:Int      = $8
Const LVS_EX_HEADERDRAGDROP:Int   = $10
Const LVS_EX_FULLROWSELECT:Int    = $20
Const LVS_EX_ONECLICKACTIVATE:Int = $40
Const LVS_EX_TWOCLICKACTIVATE:Int = $80
Const LVS_EX_FLATSB:Int           = $100
Const LVS_EX_REGIONAL:Int         = $200
Const LVS_EX_INFOTIP:Int          = $400
Const LVS_EX_UNDERLINEHOT:Int     = $800
Const LVS_EX_UNDERLINECOLD:Int    = $1000
Const LVS_EX_MULTIWORKAREAS:Int   = $2000
Const LVS_EX_LABELTIP:Int         = $4000
Const LVS_EX_BORDERSELECT:Int     = $8000
Const LVS_EX_DOUBLEBUFFER:Int     = $10000
Const LVS_EX_HIDELABELS:Int       = $20000
Const LVS_EX_SINGLEROW:Int        = $40000
Const LVS_EX_SNAPTOGRID:Int       = $80000
Const LVS_EX_SIMPLESELECT:Int     = $100000

Const LVIF_TEXT:Int        = $1
Const LVIF_IMAGE:Int       = $2
Const LVIF_PARAM:Int       = $4
Const LVIF_STATE:Int       = $8
Const LVIF_INDENT:Int      = $10
Const LVIF_GROUPID:Int     = $100
Const LVIF_COLUMNS:Int     = $200
Const LVIF_NORECOMPUTE:Int = $800 
Const LVIF_DI_SETITEM:Int  = $1000

Type  LVCOLUMN  
	Field mask:Int
	Field fmt:Int
	Field cx:Int
	Field pszText:Byte Ptr
	Field cchTextMax:Int
	Field iSubItem:Int
EndType

Type LVITEM 
	Field mask:Int
	Field iItem:Int
	Field iSubItem:Int
	Field iState:Int
	Field stateMask:Int
	Field pszText:Byte Ptr
	Field cchTextMax:Int
	Field iImage:Int
	Field lParam:Int
	Field iIndent:Int
	Field iGroupId:Int
	Field cColumns:Int
	Field puColumns:Int
EndType


The functions:

Function TreeViewGetNodeImage:Int(TreeView:TGadget, Node:TGadget)
	Local Item:TVITEM = New TVITEM, pItem:Byte Ptr = Item
	Local hwndView:Int, hwndNode:Int

	hwndView = QueryGadget(TreeView, QUERY_HWND)
'	hwndNode = QueryGadget(Node, 1)
	hwndNode = SendMessage(hwndView, TVM_GETNEXTITEM, TVGN_CARET, 0)

	Print "hwndView = " + String(hwndView) + " hwndNode = " + String(hwndNode)
	Item.hItem = hwndNode
	Item.Mask = TVIF_IMAGE
	
	SendMessage(hwndView, TVM_GETITEM, 0, Int(pItem))
	Return Item.iImage
EndFunction

Function TreeViewSetNodeImage:Int(TreeView:TGadget, Node:TGadget, Image:Int)
	Local Item:TVITEM = New TVITEM, pItem:Byte Ptr = Item
	Local hwndView:Int, hwndNode:Int
	
	hwndView = QueryGadget(TreeView, QUERY_HWND)
'	hwndNode = QueryGadget(Node, 1)
	hwndNode = SendMessage(hwndView, TVM_GETNEXTITEM, TVGN_CARET, 0)


	Print "hwndView = " + String(hwndView) + " hwndNode = " + String(hwndNode)
	Item.hItem = hwndNode
	Item.Mask = TVIF_IMAGE
	Item.iImage = Image

	SendMessage(hwndView, TVM_SETITEM, 0, Int(pItem))
	Print "Set icon to " + Item.iImage
	Return Item.iImage
EndFunction


I might of gotten these somewhere on this forum - might not have. I don't have a note of it but it is in a pile of Win32 API code that I have gotten from various places and written myself. Apologies if this is verbatim copied without attribution!

You'll want to remove the Print lines from these in production code.