2
0
Эх сурвалжийг харах

Merge pull request #4815 from NotKyon/master

Win32 API: Add common comctl32 definitions and surrounding support structures.
gingerBill 7 сар өмнө
parent
commit
4678186cd2

+ 2063 - 0
core/sys/windows/comctl32.odin

@@ -32,3 +32,2066 @@ INITCOMMONCONTROLSEX :: struct {
 	dwSize: DWORD,
 	dwICC: DWORD,
 }
+
+COMCTL32_VERSION :: 6
+HINST_COMMCTRL   :: cast(HINSTANCE)(~uintptr(0))
+
+// Common Control Class Names
+WC_HEADER        :: "SysHeader32"
+WC_LISTVIEW      :: "SysListView32"
+WC_TREEVIEW      :: "SysTreeView32"
+WC_COMBOBOXEX    :: "ComboBoxEx32"
+WC_TABCONTROL    :: "SysTabControl32"
+WC_IPADDRESS     :: "SysIPAddress32"
+WC_PAGESCROLLER  :: "SysPager"
+WC_NATIVEFONTCTL :: "NativeFontCtl"
+WC_BUTTON        :: "Button"
+WC_STATIC        :: "Static"
+WC_EDIT          :: "Edit"
+WC_LISTBOX       :: "ListBox"
+WC_COMBOBOX      :: "ComboBox"
+WC_SCROLLBAR     :: "ScrollBar"
+WC_LINK          :: "SysLink"
+
+TOOLBARCLASSNAME :: "ToolbarWindow32"
+REBARCLASSNAME   :: "ReBarWindow32"
+STATUSCLASSNAME  :: "msctls_statusbar32"
+
+TOOLTIPS_CLASS     :: "tooltips_class32"
+TRACKBAR_CLASS     :: "msctls_trackbar32"
+UPDOWN_CLASS       :: "msctls_updown32"
+PROGRESS_CLASS     :: "msctls_progress32"
+HOTKEY_CLASS       :: "msctls_hotkey32"
+ANIMATE_CLASS      :: "SysAnimate32"
+MONTHCAL_CLASS     :: "SysMonthCal32"
+DATETIMEPICK_CLASS :: "SysDateTimePick32"
+
+// Common Control Constants
+MSGF_COMMCTRL_BEGINDRAG   :: 0x4200
+MSGF_COMMCTRL_SIZEHEADER  :: 0x4201
+MSGF_COMMCTRL_DRAGSELECT  :: 0x4202
+MSGF_COMMCTRL_TOOLBARCUST :: 0x4203
+
+// Custom Draw Constants
+CDRF_DODEFAULT         :: 0x00
+CDRF_NEWFONT           :: 0x02
+CDRF_SKIPDEFAULT       :: 0x04
+CDRF_NOTIFYPOSTPAINT   :: 0x10
+CDRF_NOTIFYITEMDRAW    :: 0x20
+CDRF_NOTIFYSUBITEMDRAW :: 0x20
+CDRF_NOTIFYPOSTERASE   :: 0x40
+
+CDDS_PREPAINT      :: 0x00001
+CDDS_POSTPAINT     :: 0x00002
+CDDS_PREERASE      :: 0x00003
+CDDS_POSTERASE     :: 0x00004
+CDDS_ITEM          :: 0x10000
+CDDS_ITEMPREPAINT  :: (CDDS_ITEM | CDDS_PREPAINT)
+CDDS_ITEMPOSTPAINT :: (CDDS_ITEM | CDDS_POSTPAINT)
+CDDS_ITEMPREERASE  :: (CDDS_ITEM | CDDS_PREERASE)
+CDDS_ITEMPOSTERASE :: (CDDS_ITEM | CDDS_POSTERASE)
+CDDS_SUBITEM       :: 0x20000
+
+CDIS_SELECTED         :: 0x001
+CDIS_GRAYED           :: 0x002
+CDIS_DISABLED         :: 0x004
+CDIS_CHECKED          :: 0x008
+CDIS_FOCUS            :: 0x010
+CDIS_DEFAULT          :: 0x020
+CDIS_HOT              :: 0x040
+CDIS_MARKED           :: 0x080
+CDIS_INDETERMINATE    :: 0x100
+CDIS_SHOWKEYBOARDCUES :: 0x200
+
+// Image Lists
+CLR_NONE    :: 0xFFFFFFFF
+CLR_DEFAULT :: 0xFF000000
+
+ILC_MASK             :: 0x00000001
+ILC_COLOR            :: 0x00000000
+ILC_COLORDDB         :: 0x000000FE
+ILC_COLOR4           :: 0x00000004
+ILC_COLOR8           :: 0x00000008
+ILC_COLOR16          :: 0x00000010
+ILC_COLOR24          :: 0x00000018
+ILC_COLOR32          :: 0x00000020
+ILC_PALETTE          :: 0x00000800
+ILC_MIRROR           :: 0x00002000
+ILC_PERITEMMIRROR    :: 0x00008000
+ILC_ORIGINALSIZE     :: 0x00010000
+ILC_HIGHQUALITYSCALE :: 0x00020000
+
+ILD_NORMAL        :: 0x00000000
+ILD_TRANSPARENT   :: 0x00000001
+ILD_MASK          :: 0x00000010
+ILD_IMAGE         :: 0x00000020
+ILD_ROP           :: 0x00000040
+ILD_BLEND25       :: 0x00000002
+ILD_BLEND50       :: 0x00000004
+ILD_OVERLAYMASK   :: 0x00000F00
+ILD_PRESERVEALPHA :: 0x00001000
+ILD_SCALE         :: 0x00002000
+ILD_DPISCALE      :: 0x00004000
+ILD_ASYNC         :: 0x00008000
+
+ILD_SELECTED :: ILD_BLEND50
+ILD_FOCUS    :: ILD_BLEND25
+ILD_BLEND    :: ILD_BLEND50
+CLR_HILIGHT  :: CLR_DEFAULT
+
+ILS_NORMAL   :: 0x00000000
+ILS_GLOW     :: 0x00000001
+ILS_SHADOW   :: 0x00000002
+ILS_SATURATE :: 0x00000004
+ILS_ALPHA    :: 0x00000008
+
+ILGT_NORMAL :: 0x00000000
+ILGT_ASYNC  :: 0x00000001
+
+ILCF_MOVE :: 0x00000000
+ILCF_SWAP :: 0x00000001
+
+ILP_NORMAL    :: 0
+ILP_DOWNLEVEL :: 1
+
+IMAGELISTDRAWPARAMS :: struct {
+	cbSize: DWORD,
+	himl: HIMAGELIST,
+	i: i32,
+	hdcDst: HDC,
+	x: i32,
+	y: i32,
+	cx: i32,
+	cy: i32,
+	xBitmap: i32,
+	yBitmap: i32,
+	rgbBk: COLORREF,
+	rgbFg: COLORREF,
+	fStyle: UINT,
+	dwRop: DWORD,
+	fState: DWORD,
+	Frame: DWORD,
+	crEffect: COLORREF,
+}
+LPIMAGELISTDRAWPARAMS :: ^IMAGELISTDRAWPARAMS
+
+IMAGEINFO :: struct {
+	hbmImage: HBITMAP,
+	hbmMask: HBITMAP,
+	Unused1: i32,
+	Unused2: i32,
+	rcImage: RECT,
+}
+LPIMAGEINFO :: ^IMAGEINFO
+
+@(default_calling_convention="system")
+foreign Comctl32 {
+	ImageList_Create :: proc(cx, cy: i32, flags: UINT, cInitial, cGrow: i32) -> HIMAGELIST ---
+	ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL ---
+	ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> i32 ---
+	ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL ---
+	ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> i32 ---
+	ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: i32, hicon: HICON) -> i32 ---
+	ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF ---
+	ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF ---
+	ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: i32, iOverlay: i32) -> BOOL ---
+	ImageList_Draw :: proc(himl: HIMAGELIST, i: i32, hdcDst: HDC, x, y: i32, fStyle: UINT) -> BOOL ---
+	ImageList_Replace :: proc(himl: HIMAGELIST, i: i32, hbmImage, hbmMask: HBITMAP) -> BOOL ---
+	ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> i32 ---
+	ImageList_DrawEx :: proc(himl: HIMAGELIST, i: i32, hdcDst: HDC, x, y, dx, dy: i32, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL ---
+	ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL ---
+	ImageList_Remove :: proc(himl: HIMAGELIST, i: i32) -> BOOL ---
+	ImageList_GetIcon :: proc(himl: HIMAGELIST, i: i32, flags: UINT) -> HICON ---
+	ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: i32, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST ---
+	ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: i32, himlSrc: HIMAGELIST, iSrc: i32, uFlags: UINT) -> BOOL ---
+	ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: i32) -> BOOL ---
+	ImageList_EndDrag :: proc() ---
+	ImageList_DragEnter :: proc(hwndLock: HWND, x, y: i32) -> BOOL ---
+	ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL ---
+	ImageList_DragMove :: proc(x, y: i32) -> BOOL ---
+	ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: i32) -> BOOL ---
+	ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL ---
+	ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST ---
+	ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST ---
+	ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL ---
+	ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT ---
+	ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT ---
+	ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^i32) -> BOOL ---
+	ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: i32) -> BOOL ---
+	ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: i32, pImageInfo: ^IMAGEINFO) -> BOOL ---
+	ImageList_Merge :: proc(himl1: HIMAGELIST, i1: i32, himl2: HIMAGELIST, i2: i32, dx, dy: i32) -> HIMAGELIST ---
+	ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST ---
+	HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT ---
+}
+
+ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> i32 {
+	return ImageList_ReplaceIcon(himl, -1, hicon)
+}
+ImageList_RemoveAll :: #force_inline proc "system" (himl: HIMAGELIST) -> BOOL {
+	return ImageList_Remove(himl, -1)
+}
+ImageList_ExtractIcon :: #force_inline proc "system" (hi: HINSTANCE, himl: HIMAGELIST, i: i32) -> HICON {
+	return ImageList_GetIcon(himl, i, 0)
+}
+ImageList_LoadBitmap :: #force_inline proc "system" (hi: HINSTANCE, lpbmp: LPCWSTR, cx, cGrow: i32, crMask: COLORREF) -> HIMAGELIST {
+	return ImageList_LoadImageW(hi, lpbmp, cx, cGrow, crMask, IMAGE_BITMAP, 0)
+}
+
+// Status Bar Control
+SBT_NOBORDERS    :: 0x0100
+SBT_POPOUT       :: 0x0200
+SBT_RTLREADING   :: 0x0400
+SBT_NOTABPARSING :: 0x0800
+SBT_OWNERDRAW    :: 0x1000
+
+SBN_SIMPLEMODECHANGE :: SBN_FIRST - 0
+
+SB_SIMPLEID :: 0xFF
+
+@(default_calling_convention="system")
+foreign Comctl32 {
+    DrawStatusTextW :: proc(hDC: HDC, lprc: ^RECT, pszText: LPCWSTR, uFlags: UINT) ---
+    CreateStatusWindowW :: proc(style: LONG, lpszText: LPCWSTR, hwndParent: HWND, wID: UINT) -> HWND ---
+}
+
+// Menu Help
+MINSYSCOMMAND :: SC_SIZE
+
+@(default_calling_convention="system")
+foreign Comctl32 {
+	MenuHelp :: proc(uMsg: UINT, wParam: WPARAM, lParam: LPARAM, hMainMenu: HMENU, hInst: HINSTANCE, hwndStatus: HWND, lpwIDs: ^UINT) ---
+	ShowHideMenuCtl :: proc(hWnd: HWND, uFlags: UINT_PTR, lpInfo: LPINT) -> BOOL ---
+	GetEffectiveClientRect :: proc(hWnd: HWND, lprc: LPRECT, lpInfo: ^INT) ---
+}
+
+// Drag List
+DL_CURSORSET  :: 0
+DL_STOPCURSOR :: 1
+DL_COPYCURSOR :: 2
+DL_MOVECURSOR :: 3
+
+DRAGLISTMSGSTRING :: "commctrl_DragListMsg"
+
+@(default_calling_convention="system")
+foreign Comctl32 {
+	MakeDragList :: proc(hLB: HWND) -> BOOL ---
+	DrawInsert :: proc(handParent: HWND, hLB: HWND, nItem: c_int) ---
+	LBItemFromPt :: proc(hLB: HWND, pt: POINT, bAutoScroll: BOOL) -> c_int ---
+}
+
+// Header Control
+HDTEXTFILTERW :: struct {
+	pszText: LPWSTR,
+	cchTextMax: INT,
+}
+HD_TEXTFILTERW   :: HDTEXTFILTERW
+LPHDTEXTFILTERW  :: ^HDTEXTFILTERW
+LPHD_TEXTFILTERW :: LPHDTEXTFILTERW
+
+HDITEMW :: struct {
+	mask: UINT,
+	cxy: c_int,
+	pszText: LPWSTR,
+	hbm: HBITMAP,
+	cchTextMax: c_int,
+	fmt: c_int,
+	lParam: LPARAM,
+	iImage: c_int,
+	iOrder: c_int,
+	type: UINT,
+	pvFilter: rawptr,
+}
+HD_ITEMW   :: HDITEMW
+LPHDITEMW  :: ^HDITEMW
+LPHD_ITEMW :: LPHDITEMW
+
+HDLAYOUT :: struct {
+	prc: ^RECT,
+	pwpos: ^WINDOWPOS,
+}
+HD_LAYOUT   :: HDLAYOUT
+LPHDLAYOUT  :: ^HDLAYOUT
+LPHD_LAYOUT :: LPHDLAYOUT
+
+HDHITTESTINFO :: struct {
+	pt: POINT,
+	flags: UINT,
+	iItem: c_int,
+}
+HD_HITTESTINFO   :: HDHITTESTINFO
+LPHDHITTESTINFO  :: ^HDHITTESTINFO
+LPHD_HITTESTINFO :: LPHDHITTESTINFO
+
+NMHEADERW :: struct {
+	hdr: NMHDR,
+	iItem: c_int,
+	iButton: c_int,
+	pitem: ^HDITEMW,
+}
+LPNMHEADERW  :: ^NMHEADERW
+HD_NOTIFYW   :: NMHEADERW
+LPHD_NOTIFYW :: LPNMHEADERW
+
+NMHDDISPINFOW :: struct {
+	hdr: NMHDR,
+	iItem: c_int,
+	mask: UINT,
+	pszText: LPWSTR,
+	cchTextMax: c_int,
+	iImage: c_int,
+	lParam: LPARAM,
+}
+LPNMHDDISPINFOW :: ^NMHDDISPINFOW
+
+NMHDFILTERBTNCLICK :: struct {
+	hdr: NMHDR,
+	iItem: c_int,
+	rc: RECT,
+}
+LPNMHDFILTERBTNCLICK :: ^NMHDFILTERBTNCLICK
+
+Header_GetItemCount :: #force_inline proc "system" (hwndHD: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwndHD, HDM_GETITEMCOUNT, 0, 0)
+}
+Header_InsertItem :: #force_inline proc "system" (hwndHD: HWND, i: c_int, phdi: ^HD_ITEMW) -> c_int {
+	return cast(c_int)SendMessageW(hwndHD, HDM_INSERTITEMW, cast(WPARAM)i, cast(LPARAM)uintptr(phdi))
+}
+Header_DeleteItem :: #force_inline proc "system" (hwndHD: HWND, i: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndHD, HDM_DELETEITEM, cast(WPARAM)i, 0)
+}
+Header_GetItem :: #force_inline proc "system" (hwndHD: HWND, i: c_int, phdi: ^HD_ITEMW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndHD, HDM_GETITEMW, cast(WPARAM)i, cast(LPARAM)uintptr(phdi))
+}
+Header_SetItem :: #force_inline proc "system" (hwndHD: HWND, i: c_int, phdi: ^HD_ITEMW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndHD, HDM_SETITEMW, cast(WPARAM)i, cast(LPARAM)uintptr(phdi))
+}
+Header_Layout :: #force_inline proc "system" (hwndHD: HWND, playout: ^HD_LAYOUT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndHD, HDM_LAYOUT, 0, cast(LPARAM)uintptr(playout))
+}
+
+Header_GetItemRect :: #force_inline proc "system" (hwnd: HWND, iItem: c_int, lprc: ^RECT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_GETITEMRECT,cast(WPARAM)iItem,cast(LPARAM)uintptr(lprc))
+}
+Header_SetImageList :: #force_inline proc "system" (hwnd: HWND, himl: HIMAGELIST) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd,HDM_SETIMAGELIST,0,cast(LPARAM)uintptr(himl)))
+}
+Header_GetImageList :: #force_inline proc "system" (hwnd: HWND) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd,HDM_GETIMAGELIST,0,0))
+}
+Header_OrderToIndex :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd,HDM_ORDERTOINDEX,cast(WPARAM)i,0)
+}
+Header_CreateDragImage :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd,HDM_CREATEDRAGIMAGE,cast(WPARAM)i,0))
+}
+Header_GetOrderArray :: #force_inline proc "system" (hwnd: HWND, iCount: c_int, lpi: ^c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_GETORDERARRAY,cast(WPARAM)iCount,cast(LPARAM)uintptr(lpi))
+}
+Header_SetOrderArray :: #force_inline proc "system" (hwnd: HWND, iCount: c_int, lpi: ^c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_SETORDERARRAY,cast(WPARAM)iCount,cast(LPARAM)uintptr(lpi))
+}
+Header_SetHotDivider :: #force_inline proc "system" (hwnd: HWND, fPos: BOOL, dw: DWORD) -> c_int {
+	return cast(c_int)SendMessageW(hwnd,HDM_SETHOTDIVIDER,cast(WPARAM)fPos,cast(LPARAM)dw)
+}
+Header_SetBitmapMargin :: #force_inline proc "system" (hwnd: HWND, iWidth: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd,HDM_SETBITMAPMARGIN,cast(WPARAM)iWidth,0)
+}
+Header_GetBitmapMargin :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwnd,HDM_GETBITMAPMARGIN,0,0)
+}
+Header_SetUnicodeFormat :: #force_inline proc "system" (hwnd: HWND, fUnicode: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_SETUNICODEFORMAT,cast(WPARAM)fUnicode,0)
+}
+Header_GetUnicodeFormat :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_GETUNICODEFORMAT,0,0)
+}
+Header_SetFilterChangeTimeout :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd,HDM_SETFILTERCHANGETIMEOUT,0,cast(LPARAM)i)
+}
+Header_EditFilter :: #force_inline proc "system" (hwnd: HWND, i: c_int, fDiscardChanges: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_EDITFILTER,cast(WPARAM)i,MAKELPARAM(fDiscardChanges,0))
+}
+Header_ClearFilter :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_CLEARFILTER,cast(WPARAM)i,0)
+}
+Header_ClearAllFilters :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd,HDM_CLEARFILTER,~WPARAM(0),0)
+}
+
+// Toolbar Control
+COLORSCHEME :: struct {
+	dwSize: DWORD,
+	clrBtnHighlight: COLORREF,
+	clrBtnShadow: COLORREF,
+}
+LPCOLORSCHEME :: ^COLORSCHEME
+
+COLORMAP :: struct {
+	from: COLORREF,
+	to: COLORREF,
+}
+LPCOLORMAP :: ^COLORMAP
+
+TBBUTTON :: struct {
+	iBitmap: c_int,
+	idCommand: c_int,
+	fsState: BYTE,
+	fsStyle: BYTE,
+	bReserved: [size_of(uintptr) - 2]BYTE,
+	dwData: DWORD_PTR,
+	iString: INT_PTR,
+}
+PTBBUTTON   :: ^TBBUTTON
+LPTBBUTTON  :: ^TBBUTTON
+LPCTBBUTTON :: ^TBBUTTON
+
+TBADDBITMAP :: struct {
+	hInst: HINSTANCE,
+	nID: UINT_PTR,
+}
+LPTBADDBITMAP :: ^TBADDBITMAP
+
+TBSAVEPARAMSW :: struct {
+	hkr: HKEY,
+	pszSubKey: LPCWSTR,
+	pszValueName: LPCWSTR,
+}
+
+TBINSERTMARK :: struct {
+	iButton: c_int,
+	dwFlags: DWORD,
+}
+LPTBINSERTMARK :: ^TBINSERTMARK
+
+TBREPLACEBITMAP :: struct {
+	hInstOld: HINSTANCE,
+	nIDOld: UINT_PTR,
+	hInstNew: HINSTANCE,
+	nIDNew: UINT_PTR,
+	nButtons: c_int,
+}
+LPTBREPLACEBITMAP :: ^TBREPLACEBITMAP
+
+TBBUTTONINFOW :: struct {
+	cbSize: UINT,
+	dwMask: DWORD,
+	idCommand: c_int,
+	iImage: c_int,
+	fsState: BYTE,
+	fsStyle: BYTE,
+	cx: WORD,
+	lParam: DWORD_PTR,
+	pszText: LPWSTR,
+	cchText: c_int,
+}
+LPTBBUTTONINFOW :: ^TBBUTTONINFOW
+
+TBMETRICS :: struct {
+	cbSize: UINT,
+	dwMask: DWORD,
+	cxPad: c_int,
+	cyPad: c_int,
+	cxBarPad: c_int,
+	cyBarPad: c_int,
+	cxButtonSpacing: c_int,
+	cyButtonSpacing: c_int,
+}
+LPTBMETRICS :: ^TBMETRICS
+
+NMTTCUSTOMDRAW :: struct {
+	nmcd: NMCUSTOMDRAW,
+	uDrawFlags: UINT,
+}
+LPNMTTCUSTOMDRAW :: ^NMTTCUSTOMDRAW
+
+@(default_calling_convention="system")
+foreign Comctl32 {
+	CreateToolbarEx :: proc(hwnd: HWND, ws: DWORD, wID: UINT, nBitmaps: c_int, hBMInst: HINSTANCE, wBMID: UINT_PTR, lpButtons: LPCTBBUTTON, iNumButtons: c_int, dxButton,dyButton: c_int, dxBitmap,dyBitmap: c_int, uStructSize: UINT) -> HWND ---
+	CreateMappedBitmap :: proc(hInstance: HINSTANCE, idBitmap: INT_PTR, wFlags: UINT, lpColorMap: LPCOLORMAP, iNumMaps: c_int) -> HBITMAP ---
+}
+
+// Button Control
+BUTTON_IMAGELIST_ALIGN_LEFT   :: 0
+BUTTON_IMAGELIST_ALIGN_RIGHT  :: 1
+BUTTON_IMAGELIST_ALIGN_TOP    :: 2
+BUTTON_IMAGELIST_ALIGN_BOTTOM :: 3
+BUTTON_IMAGELIST_ALIGN_CENTER :: 4
+
+BCSIF_GLYPH :: 0x0001
+BCSIF_IMAGE :: 0x0002
+BCSIF_STYLE :: 0x0004
+BCSIF_SIZE  :: 0x0008
+
+BCSS_NOSPLIT   :: 0x0001
+BCSS_STRETCH   :: 0x0002
+BCSS_ALIGNLEFT :: 0x0004
+BCSS_IMAGE     :: 0x0008
+
+BUTTON_IMAGELIST :: struct {
+	himl: HIMAGELIST,
+	margin: RECT,
+	uAlign: UINT,
+}
+PBUTTON_IMAGELIST :: ^BUTTON_IMAGELIST
+
+BUTTON_SPLITINFO :: struct {
+	mask: UINT,
+	himlGlyph: HIMAGELIST,
+	uSplitStyle: UINT,
+	size: SIZE,
+}
+PBUTTON_SPLITINFO :: ^BUTTON_SPLITINFO
+
+NMBCHOTITEM :: struct {
+    hdr: NMHDR,
+    dwFlags: DWORD,
+}
+LPNMBCHOTITEM :: ^NMBCHOTITEM
+
+NMBCDROPDOWN :: struct {
+	hdr: NMHDR,
+	rcButton: RECT,
+}
+LPNMBCDROPDOWN :: ^NMBCDROPDOWN
+
+// BCM_SETIMAGELIST value
+BCCL_NOGLYPH :: cast(HIMAGELIST)(~uintptr(0))
+
+Button_GetIdealSize :: #force_inline proc "system" (hwnd: HWND, psize: ^SIZE) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_GETIDEALSIZE, 0, cast(LPARAM)uintptr(psize))
+}
+Button_SetImageList :: #force_inline proc "system" (hwnd: HWND, pbuttonImagelist: PBUTTON_IMAGELIST) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_SETIMAGELIST, 0, cast(LPARAM)uintptr(pbuttonImagelist))
+}
+Button_GetImageList :: #force_inline proc "system" (hwnd: HWND, pbuttonImagelist: PBUTTON_IMAGELIST) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_GETIMAGELIST, 0, cast(LPARAM)uintptr(pbuttonImagelist))
+}
+Button_SetTextMargin :: #force_inline proc "system" (hwnd: HWND, pmargin: ^RECT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_SETTEXTMARGIN, 0, cast(LPARAM)uintptr(pmargin))
+}
+Button_GetTextMargin :: #force_inline proc "system" (hwnd: HWND, pmargin: ^RECT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_GETTEXTMARGIN, 0, cast(LPARAM)uintptr(pmargin))
+}
+Button_SetNote :: #force_inline proc "system" (hwnd: HWND, psz: LPCWSTR) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_SETNOTE, 0, cast(LPARAM)uintptr(psz))
+}
+Button_GetNote :: #force_inline proc "system" (hwnd: HWND, psz: LPCWSTR, pcc: ^c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_GETNOTE, uintptr(pcc), cast(LPARAM)uintptr(psz))
+}
+Button_GetNoteLength :: #force_inline proc "system" (hwnd: HWND) -> LRESULT {
+	return SendMessageW(hwnd, BCM_GETNOTELENGTH, 0, 0)
+}
+Button_SetElevationRequiredState :: #force_inline proc "system" (hwnd: HWND, fRequired: BOOL) -> LRESULT {
+	return SendMessageW(hwnd, BCM_SETSHIELD, 0, cast(LPARAM)fRequired)
+}
+Button_SetDropDownState :: #force_inline proc "system" (hwnd: HWND, fDropDown: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_SETDROPDOWNSTATE, cast(WPARAM)fDropDown, 0)
+}
+Button_SetSplitInfo :: #force_inline proc "system" (hwnd: HWND, psi: ^BUTTON_SPLITINFO) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_SETSPLITINFO, 0, cast(LPARAM)uintptr(psi))
+}
+Button_GetSplitInfo :: #force_inline proc "system" (hwnd: HWND, psi: ^BUTTON_SPLITINFO) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, BCM_GETSPLITINFO, 0, cast(LPARAM)uintptr(psi))
+}
+
+// Edit Control
+EDITBALLOONTIP :: struct {
+	cbStruct: DWORD,
+	pszTitle: LPCWSTR,
+	pszText: LPCWSTR,
+	ttiIcon: INT,
+}
+PEDITBALLOONTIP :: ^EDITBALLOONTIP
+
+Edit_SetCueBannerText :: #force_inline proc "system" (hwnd: HWND, lpcwText: LPCWSTR) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, EM_SETCUEBANNER, 0, cast(LPARAM)uintptr(lpcwText))
+}
+Edit_SetCueBannerTextFocused :: #force_inline proc "system" (hwnd: HWND, lpcwText: LPCWSTR, fDrawFocused: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, EM_SETCUEBANNER, cast(WPARAM)fDrawFocused, cast(LPARAM)uintptr(lpcwText))
+}
+Edit_GetCueBannerText :: #force_inline proc "system" (hwnd: HWND, lpwText: LPWSTR, cchText: LONG) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, EM_GETCUEBANNER, uintptr(lpwText), cast(LPARAM)cchText)
+}
+Edit_ShowBalloonTip :: #force_inline proc "system" (hwnd: HWND, peditballoontip: PEDITBALLOONTIP) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, EM_SHOWBALLOONTIP, 0, cast(LPARAM)uintptr(peditballoontip))
+}
+Edit_HideBalloonTip :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, EM_HIDEBALLOONTIP, 0, 0)
+}
+
+Edit_SetHilite :: #force_inline proc "system" (hwndCtl: HWND, ichStart: c_int, ichEnd: c_int) {
+	SendMessageW(hwndCtl, EM_SETHILITE, cast(WPARAM)ichStart, cast(LPARAM)ichEnd)
+}
+Edit_GetHilite :: #force_inline proc "system" (hwndCtl: HWND) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndCtl, EM_GETHILITE, 0, 0)
+}
+
+Edit_NoSetFocus :: #force_inline proc "system" (hwndCtl: HWND) {
+	SendMessageW(hwndCtl, EM_NOSETFOCUS, 0, 0)
+}
+Edit_TakeFocus :: #force_inline proc "system" (hwndCtl: HWND) {
+	SendMessageW(hwndCtl, EM_TAKEFOCUS, 0, 0)
+}
+
+// Up Down Control
+@(default_calling_convention="system")
+foreign Comctl32 {
+	CreateUpDownControl :: proc(dwStyle: DWORD, x,y: c_int, cx,cy: c_int, hParent: HWND, nID: c_int, hInst: HINSTANCE, hBuddy: HWND, nUpper,nLower,nPos: c_int) -> HWND ---
+}
+
+// Progress Bar Control
+PBRANGE :: struct {
+	iLow: c_int,
+	iHigh: c_int,
+}
+PPBRANGE :: ^PBRANGE
+
+// Hot Key Control
+HOTKEYF_SHIFT   :: 0x1
+HOTKEYF_CONTROL :: 0x2
+HOTKEYF_ALT     :: 0x4
+HOTKEYF_EXT     :: 0x8
+
+HKCOMB_NONE :: 0x01
+HKCOMB_S    :: 0x02
+HKCOMB_C    :: 0x04
+HKCOMB_A    :: 0x08
+HKCOMB_SC   :: 0x10
+HKCOMB_SA   :: 0x20
+HKCOMB_CA   :: 0x40
+HKCOMB_SCA  :: 0x80
+
+// List View Control
+LVSIL_NORMAL :: 0
+LVSIL_SMALL  :: 1
+LVSIL_STATE  :: 2
+
+LVIF_TEXT        :: 0x001
+LVIF_IMAGE       :: 0x002
+LVIF_PARAM       :: 0x004
+LVIF_STATE       :: 0x008
+LVIF_INDENT      :: 0x010
+LVIF_GROUPID     :: 0x100
+LVIF_COLUMNS     :: 0x200
+LVIF_NORECOMPUTE :: 0x800
+
+LVIS_FOCUSED     :: 0x01
+LVIS_SELECTED    :: 0x02
+LVIS_CUT         :: 0x04
+LVIS_DROPHILITED :: 0x08
+LVIS_GLOW        :: 0x10
+LVIS_ACTIVATING  :: 0x20
+
+LVIS_OVERLAYMASK    :: 0x0F00
+LVIS_STATEIMAGEMASK :: 0xF000
+
+LVNI_ALL         :: 0x000
+LVNI_FOCUSED     :: 0x001
+LVNI_SELECTED    :: 0x002
+LVNI_CUT         :: 0x004
+LVNI_DROPHILITED :: 0x008
+LVNI_ABOVE       :: 0x100
+LVNI_BELOW       :: 0x200
+LVNI_TOLEFT      :: 0x400
+LVNI_TORIGHT     :: 0x800
+
+LVFI_PARAM     :: 0x01
+LVFI_STRING    :: 0x02
+LVFI_PARTIAL   :: 0x08
+LVFI_WRAP      :: 0x20
+LVFI_NEARESTXY :: 0x40
+
+I_INDENTCALLBACK :: -1
+
+I_GROUPIDCALLBACK :: -1
+I_GROUPIDNONE     :: -2
+
+LPSTR_TEXTCALLBACKW :: cast(LPWSTR)~uintptr(0)
+
+I_IMAGECALLBACK :: -1
+I_IMAGENONE     :: -2
+
+I_COLUMNSCALLBACK :: ~UINT(0)
+
+LVIR_BOUNDS       :: 0
+LVIR_ICON         :: 1
+LVIR_LABEL        :: 2
+LVIR_SELECTBOUNDS :: 3
+
+LVHT_NOWHERE         :: 0x1
+LVHT_ONITEMICON      :: 0x2
+LVHT_ONITEMLABEL     :: 0x4
+LVHT_ONITEMSTATEICON :: 0x8
+LVHT_ONITEM          :: LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON
+
+LVHT_ABOVE           :: 0x08
+LVHT_BELOW           :: 0x10
+LVHT_TORIGHT         :: 0x20
+LVHT_TOLEFT          :: 0x40
+
+LVA_DEFAULT    :: 0x0
+LVA_ALIGNLEFT  :: 0x1
+LVA_ALIGNTOP   :: 0x2
+LVA_SNAPTOGRID :: 0x5
+
+LVCF_FMT          :: 0x001
+LVCF_WIDTH        :: 0x002
+LVCF_TEXT         :: 0x004
+LVCF_SUBITEM      :: 0x008
+LVCF_IMAGE        :: 0x010
+LVCF_ORDER        :: 0x020
+LVCF_MINWIDTH     :: 0x040
+LVCF_DEFAULTWIDTH :: 0x080
+LVCF_IDEALWIDTH   :: 0x100
+
+LVCFMT_LEFT            :: 0x0000000
+LVCFMT_RIGHT           :: 0x0000001
+LVCFMT_CENTER          :: 0x0000002
+LVCFMT_FIXED_WIDTH     :: 0x0000100
+LVCFMT_IMAGE           :: 0x0000800
+LVCFMT_BITMAP_ON_RIGHT :: 0x0001000
+LVCFMT_COL_HAS_IMAGES  :: 0x0008000
+LVCFMT_NO_DPI_SCALE    :: 0x0040000
+LVCFMT_FIXED_RATIO     :: 0x0080000
+LVCFMT_LINE_BREAK      :: 0x0100000
+LVCFMT_FILL            :: 0x0200000
+LVCFMT_WRAP            :: 0x0400000
+LVCFMT_NO_TITLE        :: 0x0800000
+LVCFMT_SPLITBUTTON     :: 0x1000000
+
+LVCFMT_JUSTIFYMASK        :: 0x3
+LVCFMT_TILE_PLACEMENTMASK :: (LVCFMT_LINE_BREAK|LVCFMT_FILL)
+
+LVSCW_AUTOSIZE           :: -1
+LVSCW_AUTOSIZE_USEHEADER :: -2
+
+LVSICF_NOINVALIDATEALL :: 0x1
+LVSICF_NOSCROLL        :: 0x2
+
+LVS_EX_GRIDLINES             :: 0x00000001
+LVS_EX_SUBITEMIMAGES         :: 0x00000002
+LVS_EX_CHECKBOXES            :: 0x00000004
+LVS_EX_TRACKSELECT           :: 0x00000008
+LVS_EX_HEADERDRAGDROP        :: 0x00000010
+LVS_EX_FULLROWSELECT         :: 0x00000020
+LVS_EX_ONECLICKACTIVATE      :: 0x00000040
+LVS_EX_TWOCLICKACTIVATE      :: 0x00000080
+LVS_EX_FLATSB                :: 0x00000100
+LVS_EX_REGIONAL              :: 0x00000200
+LVS_EX_INFOTIP               :: 0x00000400
+LVS_EX_UNDERLINEHOT          :: 0x00000800
+LVS_EX_UNDERLINECOLD         :: 0x00001000
+LVS_EX_MULTIWORKAREAS        :: 0x00002000
+LVS_EX_LABELTIP              :: 0x00004000
+LVS_EX_BORDERSELECT          :: 0x00008000
+LVS_EX_DOUBLEBUFFER          :: 0x00010000
+LVS_EX_HIDELABELS            :: 0x00020000
+LVS_EX_SINGLEROW             :: 0x00040000
+LVS_EX_SNAPTOGRID            :: 0x00080000
+LVS_EX_SIMPLESELECT          :: 0x00100000
+LVS_EX_JUSTIFYCOLUMNS        :: 0x00200000
+LVS_EX_TRANSPARENTBKGND      :: 0x00400000
+LVS_EX_TRANSPARENTSHADOWTEXT :: 0x00800000
+LVS_EX_AUTOAUTOARRANGE       :: 0x01000000
+LVS_EX_HEADERINALLVIEWS      :: 0x02000000
+LVS_EX_AUTOCHECKSELECT       :: 0x08000000
+LVS_EX_AUTOSIZECOLUMNS       :: 0x10000000
+LVS_EX_COLUMNSNAPPOINTS      :: 0x40000000
+LVS_EX_COLUMNOVERFLOW        :: 0x80000000
+
+LV_MAX_WORKAREAS :: 16
+
+LVBKIF_SOURCE_NONE    :: 0x0
+LVBKIF_SOURCE_HBITMAP :: 0x1
+LVBKIF_SOURCE_URL     :: 0x2
+LVBKIF_SOURCE_MASK    :: 0x3
+
+LVBKIF_STYLE_NORMAL :: 0x00
+LVBKIF_STYLE_TILE   :: 0x10
+LVBKIF_STYLE_MASK   :: 0x10
+
+LVBKIF_FLAG_TILEOFFSET :: 0x100
+
+LVBKIF_TYPE_WATERMARK :: 0x10000000
+
+LV_VIEW_ICON      :: 0x0
+LV_VIEW_DETAILS   :: 0x1
+LV_VIEW_SMALLICON :: 0x2
+LV_VIEW_LIST      :: 0x3
+LV_VIEW_TILE      :: 0x4
+LV_VIEW_MAX       :: 0x4
+
+LVGF_NONE    :: 0x00
+LVGF_HEADER  :: 0x01
+LVGF_FOOTER  :: 0x02
+LVGF_STATE   :: 0x04
+LVGF_ALIGN   :: 0x08
+LVGF_GROUPID :: 0x10
+
+LVGS_NORMAL    :: 0x0
+LVGS_COLLAPSED :: 0x1
+LVGS_HIDDEN    :: 0x2
+
+LVGA_HEADER_LEFT   :: 0x1
+LVGA_HEADER_CENTER :: 0x2
+LVGA_HEADER_RIGHT  :: 0x4
+LVGA_FOOTER_LEFT   :: 0x8
+LVGA_FOOTER_CENTER :: 0x10
+LVGA_FOOTER_RIGHT  :: 0x20
+
+LVGMF_NONE        :: 0x0
+LVGMF_BORDERSIZE  :: 0x1
+LVGMF_BORDERCOLOR :: 0x2
+LVGMF_TEXTCOLOR   :: 0x4
+
+LVTVIF_AUTOSIZE    :: 0x0
+LVTVIF_FIXEDWIDTH  :: 0x1
+LVTVIF_FIXEDHEIGHT :: 0x2
+LVTVIF_FIXEDSIZE   :: 0x3
+
+LVTVIM_TILESIZE    :: 0x1
+LVTVIM_COLUMNS     :: 0x2
+LVTVIM_LABELMARGIN :: 0x4
+
+LVIM_AFTER :: 0x1
+
+LVKF_ALT     :: 0x1
+LVKF_CONTROL :: 0x2
+LVKF_SHIFT   :: 0x4
+
+LVCDI_ITEM  :: 0x0
+LVCDI_GROUP :: 0x1
+
+LVCDRF_NOSELECT     :: 0x10000
+LVCDRF_NOGROUPFRAME :: 0x20000
+
+LVN_ITEMCHANGING    :: (LVN_FIRST-0)
+LVN_ITEMCHANGED     :: (LVN_FIRST-1)
+LVN_INSERTITEM      :: (LVN_FIRST-2)
+LVN_DELETEITEM      :: (LVN_FIRST-3)
+LVN_DELETEALLITEMS  :: (LVN_FIRST-4)
+LVN_BEGINLABELEDITA :: (LVN_FIRST-5)
+LVN_BEGINLABELEDITW :: (LVN_FIRST-75)
+LVN_ENDLABELEDITA   :: (LVN_FIRST-6)
+LVN_ENDLABELEDITW   :: (LVN_FIRST-76)
+LVN_COLUMNCLICK     :: (LVN_FIRST-8)
+LVN_BEGINDRAG       :: (LVN_FIRST-9)
+LVN_BEGINRDRAG      :: (LVN_FIRST-11)
+LVN_ODCACHEHINT     :: (LVN_FIRST-13)
+LVN_ODFINDITEMA     :: (LVN_FIRST-52)
+LVN_ODFINDITEMW     :: (LVN_FIRST-79)
+LVN_ITEMACTIVATE    :: (LVN_FIRST-14)
+LVN_ODSTATECHANGED  :: (LVN_FIRST-15)
+LVN_HOTTRACK        :: (LVN_FIRST-21)
+LVN_GETDISPINFOA    :: (LVN_FIRST-50)
+LVN_GETDISPINFOW    :: (LVN_FIRST-77)
+LVN_SETDISPINFOA    :: (LVN_FIRST-51)
+LVN_SETDISPINFOW    :: (LVN_FIRST-78)
+LVN_KEYDOWN         :: (LVN_FIRST-55)
+LVN_MARQUEEBEGIN    :: (LVN_FIRST-56)
+LVN_GETINFOTIPA     :: (LVN_FIRST-57)
+LVN_GETINFOTIPW     :: (LVN_FIRST-58)
+LVN_BEGINSCROLL     :: (LVN_FIRST-80)
+LVN_ENDSCROLL       :: (LVN_FIRST-81)
+
+LVIF_DI_SETITEM :: 0x1000
+
+LVGIT_UNFOLDED :: 0x1
+
+LVITEMW :: struct {
+	mask: UINT,
+	iItem: c_int,
+	iSubItem: c_int,
+	state: UINT,
+	stateMask: UINT,
+	pszText: LPWSTR,
+	cchTextMax: c_int,
+	iImage: c_int,
+	lParam: LPARAM,
+	iIndent: c_int,
+	iGroupId: c_int,
+	cColumns: UINT,
+	puColumns: PUINT,
+}
+LV_ITEMW   :: LVITEMW
+LPLVITEMW  :: ^LVITEMW
+LPLV_ITEMW :: LPLVITEMW
+
+LVFINDINFOW :: struct {
+	flags: UINT,
+	psz: LPCWSTR,
+	lParam: LPARAM,
+	pt: POINT,
+	vkDirection: UINT,
+}
+LPFINDINFOW  :: ^LVFINDINFOW
+LV_FINDINFOW :: LVFINDINFOW
+
+LVHITTESTINFO :: struct {
+	pt: POINT,
+	flags: UINT,
+	iItem: c_int,
+	iSubItem: c_int,
+}
+LV_HITTESTINFO   :: LVHITTESTINFO
+LPLVHITTESTINFO  :: ^LVHITTESTINFO
+LPLV_HITTESTINFO :: LPLVHITTESTINFO
+
+LVCOLUMNW :: struct {
+	mask: UINT,
+	fmt: c_int,
+	cx: c_int,
+	pszText: LPWSTR,
+	cchTextMax: c_int,
+	iSubItem: c_int,
+	iImage: c_int,
+	iOrder: c_int,
+	cxMin: c_int,
+	cxDefault: c_int,
+	cxIdeal: c_int,
+}
+LV_COLUMNW   :: LVCOLUMNW
+LPLVCOLUMNW  :: ^LVCOLUMNW
+LPLV_COLUMNW :: LPLVCOLUMNW
+
+LVBKIMAGEW :: struct {
+	ulFlags: ULONG,
+	hbm: HBITMAP,
+	pszImage: LPWSTR,
+	cchImageMax: UINT,
+	xOffsetPercent: c_int,
+	yOffsetPercent: c_int,
+}
+LV_BKIMAGEW   :: LVBKIMAGEW
+LPLVBKIMAGEW  :: ^LVBKIMAGEW
+LPLV_BKIMAGEW :: LPLVBKIMAGEW
+
+LVGROUP :: struct {
+	cbSize: UINT,
+	mask: UINT,
+	pszHeader: LPWSTR,
+	cchHeader: c_int,
+	pszFooter: LPWSTR,
+	cchFooter: c_int,
+	iGroupId: c_int,
+	stateMask: UINT,
+	state: UINT,
+	uAlign: UINT,
+}
+PLVGROUP :: ^LVGROUP
+
+LVGROUPMETRICS :: struct {
+	cbSize: UINT,
+	mask: UINT,
+	Left: UINT,
+	Top: UINT,
+	Right: UINT,
+	Bottom: UINT,
+	crLeft: COLORREF,
+	crTop: COLORREF,
+	crRight: COLORREF,
+	crBottom: COLORREF,
+	crHeader: COLORREF,
+	crFooter: COLORREF,
+}
+PLVGROUPMETRICS :: ^LVGROUPMETRICS
+
+LVINSERTGROUPSORTED :: struct {
+	pfnGroupCompare: PFNLVGROUPCOMPARE,
+	pvData: rawptr,
+	lvGroup: LVGROUP,
+}
+PLVINSERTGROUPSORTED :: ^LVINSERTGROUPSORTED
+
+LVTILEVIEWINFO :: struct {
+	cbSize: UINT,
+	dwMask: DWORD,
+	dwFlags: DWORD,
+	sizeTile: SIZE,
+	cLines: c_int,
+	rcLabelMargin: RECT,
+}
+PLVTILEVIEWINFO :: ^LVTILEVIEWINFO
+
+LVTILEINFO :: struct {
+	cbSize: UINT,
+	iItem: c_int,
+	cColumns: UINT,
+	puColumns: PUINT,
+}
+PLVTILEINFO :: ^LVTILEINFO
+
+LVINSERTMARK :: struct {
+	cbSize: UINT,
+	dwFlags: DWORD,
+	iItem: c_int,
+	dwReserved: DWORD,
+}
+LPLVINSERTMARK :: ^LVINSERTMARK
+
+LVSETINFOTIP :: struct {
+	cbSize: UINT,
+	dwFlags: DWORD,
+	pszText: LPWSTR,
+	iItem: c_int,
+	iSubItem: c_int,
+}
+PLVSETINFOTIP :: ^LVSETINFOTIP
+
+NMLISTVIEW :: struct {
+    hdr: NMHDR,
+    iItem: c_int,
+    iSubItem: c_int,
+    uNewState: UINT,
+    uOldState: UINT,
+    uChanged: UINT,
+    ptAction: POINT,
+    lParam: LPARAM,
+}
+NM_LISTVIEW   :: NMLISTVIEW
+LPNMLISTVIEW  :: ^NMLISTVIEW
+LPNM_LISTVIEW :: LPNMLISTVIEW
+
+NMITEMACTIVATE :: struct {
+    hdr: NMHDR,
+    iItem: c_int,
+    iSubItem: c_int,
+    uNewState: UINT,
+    uOldState: UINT,
+    uChanged: UINT,
+    ptAction: POINT,
+    lParam: LPARAM,
+    uKeyFlags: UINT,
+}
+NM_ITEMACTIVATE   :: NMITEMACTIVATE
+LPNMITEMACTIVATE  :: ^NMITEMACTIVATE
+LPNM_ITEMACTIVATE :: LPNMITEMACTIVATE
+
+NMLVCUSTOMDRAW :: struct {
+    nmcd: NMCUSTOMDRAW,
+    clrText: COLORREF,
+    clrTextBk: COLORREF,
+    iSubItem: c_int,
+    dwItemType: DWORD,
+    clrFace: COLORREF,
+    iIconEffect: c_int,
+    iIconPhase: c_int,
+    iPartId: c_int,
+    iStateId: c_int,
+    rcText: RECT,
+    uAlign: UINT,
+}
+NMLV_CUSTOMDRAW   :: NMLVCUSTOMDRAW
+LPNMLVCUSTOMDRAW  :: ^NMLVCUSTOMDRAW
+LPNMLV_CUSTOMDRAW :: LPNMLVCUSTOMDRAW
+
+NMLVCACHEHINT :: struct {
+    hdr: NMHDR,
+    iFrom: c_int,
+    iTo: c_int,
+}
+LPNMLVCACHEHINT :: ^NMLVCACHEHINT
+NM_CACHEHINT    :: NMLVCACHEHINT
+PNM_CACHEHINT   :: LPNMLVCACHEHINT
+LPNM_CACHEHINT  :: LPNMLVCACHEHINT
+
+NMLVFINDITEMW :: struct {
+    hdr: NMHDR,
+    iStart: c_int,
+    lvfi: LVFINDINFOW,
+}
+LPNMLVFINDITEMW :: ^NMLVFINDITEMW
+NM_FINDITEMW    :: NMLVFINDITEMW
+PNM_FINDITEMW   :: LPNMLVFINDITEMW
+LPNM_FINDITEMW  :: LPNMLVFINDITEMW
+
+NMLVODSTATECHANGE :: struct {
+    hdr: NMHDR,
+    iFrom: c_int,
+    iTo: c_int,
+    uNewState: UINT,
+    uOldState: UINT,
+}
+LPNMLVODSTATECHANGE :: ^NMLVODSTATECHANGE
+NM_ODSTATECHANGE    :: NMLVODSTATECHANGE
+PNM_ODSTATECHANGE   :: NMLVODSTATECHANGE
+LPNM_ODSTATECHANGE  :: LPNMLVODSTATECHANGE
+
+LVDISPINFOW :: struct {
+    hdr: NMHDR,
+    item: LVITEMW,
+}
+LV_DISPINFO      :: LVDISPINFOW
+LPNMLVDISPINFOW  :: ^LVDISPINFOW
+
+NMLVKEYDOWN :: struct #packed {
+    hdr: NMHDR,
+    wVKey: WORD,
+    flags: UINT,
+}
+LV_KEYDOWN    :: NMLVKEYDOWN
+LPNMLVKEYDOWN :: ^NMLVKEYDOWN
+
+NMLVGETINFOTIPW :: struct {
+    hdr: NMHDR,
+    dwFlags: DWORD,
+    pszText: LPWSTR,
+    cchTextMax: c_int,
+    iItem: c_int,
+    iSubItem: c_int,
+    lParam: LPARAM,
+}
+LPNMLVGETINFOTIPW :: ^NMLVGETINFOTIPW
+
+NMLVSCROLL :: struct {
+    hdr: NMHDR,
+    dx: c_int,
+    dy: c_int,
+}
+LPNMLVSCROLL :: ^NMLVSCROLL
+
+PFNLVCOMPARE      :: #type proc "system" (lpItem1,lpItem2: LPARAM, lpUser: LPARAM) -> c_int
+PFNLVGROUPCOMPARE :: #type proc "system" (item1,item2: c_int, user: rawptr) -> c_int
+
+INDEXTOSTATEIMAGEMASK :: #force_inline proc "system" (i: UINT) -> UINT {
+	return i << 12
+}
+
+ListView_GetItem :: #force_inline proc "system" (hwnd: HWND, pitem: ^LV_ITEMW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETITEMW, 0, cast(LPARAM)uintptr(pitem))
+}
+ListView_SetItem :: #force_inline proc "system" (hwnd: HWND, pitem: ^LV_ITEMW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETITEMW, 0, cast(LPARAM)uintptr(pitem))
+}
+ListView_InsertItem :: #force_inline proc "system" (hwnd: HWND, pitem: ^LV_ITEMW) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_INSERTITEMW, 0, cast(LPARAM)uintptr(pitem))
+}
+ListView_DeleteItem :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_DELETEITEM, cast(WPARAM)i, 0)
+}
+ListView_DeleteAllItems :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_DELETEALLITEMS, 0, 0)
+}
+ListView_GetCallbackMask :: #force_inline proc "system" (hwnd: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, LVM_GETCALLBACKMASK, 0, 0)
+}
+ListView_SetCallbackMask :: #force_inline proc "system" (hwnd: HWND, mask: UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETCALLBACKMASK, cast(WPARAM)mask, 0)
+}
+ListView_GetNextItem :: #force_inline proc "system" (hwnd: HWND, i: c_int, flags: UINT) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_GETNEXTITEM, cast(WPARAM)i, MAKELPARAM(flags,0))
+}
+ListView_FindItem :: #force_inline proc "system" (hwnd: HWND, iStart: c_int, plvfi: ^LV_FINDINFOW) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_FINDITEMW, cast(WPARAM)iStart, cast(LPARAM)uintptr(plvfi))
+}
+ListView_GetItemRect :: #force_inline proc "system" (hwnd: HWND, i: c_int, prc: ^RECT, code: c_int) -> BOOL {
+	if prc != nil {
+		prc.left = code
+	}
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETITEMRECT, cast(WPARAM)i, cast(LPARAM)uintptr(prc))
+}
+ListView_SetItemPosition :: #force_inline proc "system" (hwnd: HWND, i: c_int, x,y: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETITEMPOSITION, cast(WPARAM)i, MAKELPARAM(x,y))
+}
+ListView_GetItemPosition :: #force_inline proc "system" (hwnd: HWND, i: c_int, ppt: ^POINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETITEMPOSITION, cast(WPARAM)i, cast(LPARAM)uintptr(ppt))
+}
+ListView_GetStringWidth :: #force_inline proc "system" (hwndLV: HWND, psz: LPCWSTR) -> c_int {
+	return cast(c_int)SendMessageW(hwndLV, LVM_GETSTRINGWIDTHW, 0, cast(LPARAM)uintptr(psz))
+}
+ListView_HitTest :: #force_inline proc "system" (hwndLV: HWND, pinfo: ^LV_HITTESTINFO) -> c_int {
+	return cast(c_int)SendMessageW(hwndLV, LVM_HITTEST, 0, cast(LPARAM)uintptr(pinfo))
+}
+ListView_EnsureVisible :: #force_inline proc "system" (hwndLV: HWND, i: c_int, fPartialOK: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_ENSUREVISIBLE, cast(WPARAM)i, MAKELPARAM(fPartialOK,0))
+}
+ListView_Scroll :: #force_inline proc "system" (hwndLV: HWND, dx,dy: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_SCROLL, cast(WPARAM)dx, cast(LPARAM)dy)
+}
+ListView_RedrawItems :: #force_inline proc "system" (hwndLV: HWND, iFirst,iLast: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_REDRAWITEMS, cast(WPARAM)iFirst, cast(LPARAM)iLast)
+}
+ListView_Arrange :: #force_inline proc "system" (hwndLV: HWND, code: UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_ARRANGE, cast(WPARAM)code, 0)
+}
+ListView_EditLabel :: #force_inline proc "system" (hwndLV: HWND, i: c_int) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwndLV, LVM_EDITLABELW, cast(WPARAM)i, 0))
+}
+ListView_GetEditControl :: #force_inline proc "system" (hwndLV: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwndLV, LVM_GETEDITCONTROL, 0, 0))
+}
+ListView_GetColumn :: #force_inline proc "system" (hwnd: HWND, iCol: c_int, pcol: ^LV_COLUMNW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETCOLUMNW, cast(WPARAM)iCol, cast(LPARAM)uintptr(pcol))
+}
+ListView_SetColumn :: #force_inline proc "system" (hwnd: HWND, iCol: c_int, pcol: ^LV_COLUMNW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETCOLUMNW, cast(WPARAM)iCol, cast(LPARAM)uintptr(pcol))
+}
+ListView_InsertColumn :: #force_inline proc "system" (hwnd: HWND, iCol: c_int, pcol: ^LV_COLUMNW) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_INSERTCOLUMNW, cast(WPARAM)iCol, cast(LPARAM)uintptr(pcol))
+}
+ListView_DeleteColumn :: #force_inline proc "system" (hwnd: HWND, iCol: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_DELETECOLUMN, cast(WPARAM)iCol, 0)
+}
+ListView_GetColumnWidth :: #force_inline proc "system" (hwnd: HWND, iCol: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_GETCOLUMNWIDTH, cast(WPARAM)iCol, 0)
+}
+ListView_SetColumnWidth :: #force_inline proc "system" (hwnd: HWND, iCol: c_int, cx: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETCOLUMNWIDTH, cast(WPARAM)iCol, MAKELPARAM(cx,0))
+}
+ListView_GetHeader :: #force_inline proc "system" (hwnd: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwnd, LVM_GETHEADER, 0, 0))
+}
+ListView_CreateDragImage :: #force_inline proc "system" (hwnd: HWND, i: c_int, lpptUpLeft: LPPOINT) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd, LVM_CREATEDRAGIMAGE, cast(WPARAM)i, cast(LPARAM)uintptr(lpptUpLeft)))
+}
+ListView_GetViewRect :: #force_inline proc "system" (hwnd: HWND, prc: ^RECT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETVIEWRECT, 0, cast(LPARAM)uintptr(prc))
+}
+ListView_GetTextColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, LVM_GETTEXTCOLOR, 0, 0)
+}
+ListView_SetTextColor :: #force_inline proc "system" (hwnd: HWND, clrText: COLORREF) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETTEXTCOLOR, 0, cast(LPARAM)clrText)
+}
+ListView_GetTextBkColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, LVM_GETTEXTBKCOLOR, 0, 0)
+}
+ListView_SetTextBkColor :: #force_inline proc "system" (hwnd: HWND, clrTextBk: COLORREF) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETTEXTBKCOLOR, 0, cast(LPARAM)clrTextBk)
+}
+ListView_GetTopIndex :: #force_inline proc "system" (hwndLV: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwndLV, LVM_GETTOPINDEX, 0, 0)
+}
+ListView_GetCountPerPage :: #force_inline proc "system" (hwndLV: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwndLV, LVM_GETCOUNTPERPAGE, 0, 0)
+}
+ListView_GetOrigin :: #force_inline proc "system" (hwndLV: HWND, ppt: ^POINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_GETORIGIN, 0, cast(LPARAM)uintptr(ppt))
+}
+ListView_Update :: #force_inline proc "system" (hwndLV: HWND, i: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_UPDATE, cast(WPARAM)i, 0)
+}
+ListView_SetItemState :: #force_inline proc "system" (hwndLV: HWND, i: c_int, data: UINT, mask: UINT) {
+	item := LV_ITEMW {
+		stateMask = mask,
+		state     = data,
+	}
+	SendMessageW(hwndLV, LVM_SETITEMSTATE, cast(WPARAM)i, cast(LPARAM)uintptr(&item))
+}
+ListView_SetCheckState :: #force_inline proc "system" (hwndLV: HWND, i: c_int, fCheck: BOOL) {
+	ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK(2 if fCheck else 1), LVIS_STATEIMAGEMASK)
+}
+ListView_GetItemState :: #force_inline proc "system" (hwndLV: HWND, i: c_int, mask: UINT) -> UINT {
+	return cast(UINT)SendMessageW(hwndLV, LVM_GETITEMSTATE, cast(WPARAM)i, cast(LPARAM)mask)
+}
+ListView_GetCheckState :: #force_inline proc "system" (hwndLV: HWND, i: c_int) -> UINT {
+	return ((cast(UINT)SendMessageW(hwndLV, LVM_GETITEMSTATE, cast(WPARAM)i, cast(LPARAM)LVIS_STATEIMAGEMASK)) >> 12) - 1
+}
+ListView_GetItemText :: #force_inline proc "system" (hwndLV: HWND, i: c_int, iSubItem: c_int, pszText: LPWSTR, cchTextMax: c_int) {
+	item := LV_ITEMW {
+		iSubItem   = iSubItem,
+		cchTextMax = cchTextMax,
+		pszText    = pszText,
+	}
+	SendMessageW(hwndLV, LVM_GETITEMTEXTW, cast(WPARAM)i, cast(LPARAM)uintptr(&item))
+}
+ListView_SetItemText :: #force_inline proc "system" (hwndLV: HWND, i: c_int, iSubItem: c_int, pszText: LPWSTR) {
+	item := LV_ITEMW {
+		iSubItem = iSubItem,
+		pszText  = pszText,
+	}
+	SendMessageW(hwndLV, LVM_SETITEMTEXTW, cast(WPARAM)i, cast(LPARAM)uintptr(&item))
+}
+ListView_SetItemCount :: #force_inline proc "system" (hwndLV: HWND, cItems: c_int) {
+	SendMessageW(hwndLV, LVM_SETITEMCOUNT, cast(WPARAM)cItems, 0)
+}
+ListView_SetItemCountEx :: #force_inline proc "system" (hwndLV: HWND, cItems: c_int, dwFlags: DWORD) {
+	SendMessageW(hwndLV, LVM_SETITEMCOUNT, cast(WPARAM)cItems, cast(LPARAM)dwFlags)
+}
+ListView_SortItems :: #force_inline proc "system" (hwndLV: HWND, pfnCompare: PFNLVCOMPARE, lpUser: LPARAM) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_SORTITEMS, cast(WPARAM)lpUser, cast(LPARAM)transmute(uintptr)(pfnCompare))
+}
+ListView_SetItemPosition32 :: #force_inline proc "system" (hwndLV: HWND, i: c_int, x0,y0: c_int) {
+	ptNewPos := POINT {
+		x = x0,
+		y = y0,
+	}
+	SendMessageW(hwndLV, LVM_SETITEMPOSITION32, cast(WPARAM)i, cast(LPARAM)uintptr(&ptNewPos))
+}
+ListView_GetSelectedCount :: #force_inline proc "system" (hwndLV: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwndLV, LVM_GETSELECTEDCOUNT, 0, 0)
+}
+ListView_GetItemSpacing :: #force_inline proc "system" (hwndLV: HWND, fSmall: BOOL) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndLV, LVM_GETITEMSPACING, cast(WPARAM)fSmall, 0)
+}
+ListView_GetISearchString :: #force_inline proc "system" (hwndLV: HWND, lpsz: LPWSTR) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_GETISEARCHSTRINGW, 0, cast(LPARAM)uintptr(lpsz))
+}
+ListView_SetIconSpacing :: #force_inline proc "system" (hwndLV: HWND, cx,cy: c_int) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndLV, LVM_SETICONSPACING, 0, cast(LPARAM)MAKELONG(cx,cy))
+}
+ListView_SetExtendedListViewStyle :: #force_inline proc "system" (hwndLV: HWND, dw: DWORD) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, cast(LPARAM)dw)
+}
+ListView_SetExtendedListViewStyleEx :: #force_inline proc "system" (hwndLV: HWND, dwMask: DWORD, dw: DWORD) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, cast(WPARAM)dwMask, cast(LPARAM)dw)
+}
+ListView_GetSubItemRect :: #force_inline proc "system" (hwnd: HWND, iItem: c_int, iSubItem: c_int, code: c_int, prc: LPRECT) -> BOOL {
+	if prc != nil {
+		prc.top  = iSubItem
+		prc.left = code
+	}
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETSUBITEMRECT, cast(WPARAM)iItem, cast(LPARAM)uintptr(prc))
+}
+ListView_SubItemHitTest :: #force_inline proc "system" (hwnd: HWND, plvhti: LPLVHITTESTINFO) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_SUBITEMHITTEST, 0, cast(LPARAM)uintptr(plvhti))
+}
+ListView_SetColumnOrderArray :: #force_inline proc "system" (hwnd: HWND, iCount: c_int, pi: LPINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETCOLUMNORDERARRAY, cast(WPARAM)iCount, cast(LPARAM)uintptr(pi))
+}
+ListView_GetColumnOrderArray :: #force_inline proc "system" (hwnd: HWND, iCount: c_int, pi: LPINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETCOLUMNORDERARRAY, cast(WPARAM)iCount, cast(LPARAM)uintptr(pi))
+}
+ListView_SetHotItem :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_SETHOTITEM, cast(WPARAM)i, 0)
+}
+ListView_GetHotItem :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_GETHOTITEM, 0, 0)
+}
+ListView_SetHotCursor :: #force_inline proc "system" (hwnd: HWND, hcur: HCURSOR) -> HCURSOR {
+	return cast(HCURSOR)uintptr(SendMessageW(hwnd, LVM_SETHOTCURSOR, 0, cast(LPARAM)uintptr(hcur)))
+}
+ListView_GetHotCursor :: #force_inline proc "system" (hwnd: HWND) -> HCURSOR {
+	return cast(HCURSOR)uintptr(SendMessageW(hwnd, LVM_GETHOTCURSOR, 0, 0))
+}
+ListView_ApproximateViewRect :: #force_inline proc "system" (hwnd: HWND, iWidth,iHeight: c_int, iCount: c_int) -> DWORD {
+	return cast(DWORD)SendMessageW(hwnd, LVM_APPROXIMATEVIEWRECT, cast(WPARAM)iCount, MAKELPARAM(iWidth,iHeight))
+}
+ListView_SetWorkAreas :: #force_inline proc "system" (hwnd: HWND, nWorkAreas: UINT, prc: ^RECT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETWORKAREAS, cast(WPARAM)nWorkAreas, cast(LPARAM)uintptr(prc))
+}
+ListView_GetWorkAreas :: #force_inline proc "system" (hwnd: HWND, nWorkAreas: UINT, prc: ^RECT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETWORKAREAS, cast(WPARAM)nWorkAreas, cast(LPARAM)uintptr(prc))
+}
+ListView_GetNumberOfWorkAreas :: #force_inline proc "system" (hwnd: HWND, pnWorkAreas: ^UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETNUMBEROFWORKAREAS, 0, cast(LPARAM)uintptr(pnWorkAreas))
+}
+ListView_GetSelectionMark :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_GETSELECTIONMARK, 0, 0)
+}
+ListView_SetSelectionMark :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_SETSELECTIONMARK, 0, cast(LPARAM)i)
+}
+ListView_SetHoverTime :: #force_inline proc "system" (hwndLV: HWND, dwHoverTimeMs: DWORD) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndLV, LVM_SETHOVERTIME, 0, cast(LPARAM)dwHoverTimeMs)
+}
+ListView_GetHoverTime :: #force_inline proc "system" (hwndLV: HWND) -> DWORD {
+	return cast(DWORD)SendMessageW(hwndLV, LVM_GETHOVERTIME, 0, 0)
+}
+ListView_SetToolTips :: #force_inline proc "system" (hwndLV: HWND, hwndNewHwnd: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwndLV, LVM_SETTOOLTIPS, cast(WPARAM)hwndNewHwnd, 0))
+}
+ListView_GetToolTips :: #force_inline proc "system" (hwndLV: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwndLV, LVM_GETTOOLTIPS, 0, 0))
+}
+ListView_SortItemsEx :: #force_inline proc "system" (hwndLV: HWND, pfnCompare: PFNLVCOMPARE, lpUser: LPARAM) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_SORTITEMSEX, cast(WPARAM)lpUser, cast(LPARAM)transmute(uintptr)(pfnCompare))
+}
+ListView_SetSelectedColumn :: #force_inline proc "system" (hwnd: HWND, iCol: c_int) {
+	SendMessageW(hwnd, LVM_SETSELECTEDCOLUMN, cast(WPARAM)iCol, 0)
+}
+ListView_SetView :: #force_inline proc "system" (hwnd: HWND, iView: DWORD) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_SETVIEW, cast(WPARAM)iView, 0)
+}
+ListView_GetView :: #force_inline proc "system" (hwnd: HWND) -> DWORD {
+	return cast(DWORD)SendMessageW(hwnd, LVM_GETVIEW, 0, 0)
+}
+ListView_InsertGroup :: #force_inline proc "system" (hwnd: HWND, index: c_int, pgrp: PLVGROUP) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_INSERTGROUP, cast(WPARAM)index, cast(LPARAM)uintptr(pgrp))
+}
+ListView_SetGroupInfo :: #force_inline proc "system" (hwnd: HWND, iGroupId: c_int, pgrp: PLVGROUP) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_SETGROUPINFO, cast(WPARAM)iGroupId, cast(LPARAM)uintptr(pgrp))
+}
+ListView_GetGroupInfo :: #force_inline proc "system" (hwnd: HWND, iGroupId: c_int, pgrp: PLVGROUP) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_GETGROUPINFO, cast(WPARAM)iGroupId, cast(LPARAM)uintptr(pgrp))
+}
+ListView_RemoveGroup :: #force_inline proc "system" (hwnd: HWND, iGroupId: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_REMOVEGROUP, cast(WPARAM)iGroupId, 0)
+}
+ListView_MoveGroup :: #force_inline proc "system" (hwnd: HWND, iGroupId: c_int, toIndex: c_int) {
+	SendMessageW(hwnd, LVM_MOVEGROUP, cast(WPARAM)iGroupId, cast(LPARAM)toIndex)
+}
+ListView_MoveItemToGroup :: #force_inline proc "system" (hwnd: HWND, idItemFrom: c_int, idGroupTo: c_int) {
+	SendMessageW(hwnd, LVM_MOVEITEMTOGROUP, cast(WPARAM)idItemFrom, cast(LPARAM)idGroupTo)
+}
+ListView_SetGroupMetrics :: #force_inline proc "system" (hwnd: HWND, pGroupMetrics: PLVGROUPMETRICS) {
+	SendMessageW(hwnd, LVM_SETGROUPMETRICS, 0, cast(LPARAM)uintptr(pGroupMetrics))
+}
+ListView_GetGroupMetrics :: #force_inline proc "system" (hwnd: HWND, pGroupMetrics: PLVGROUPMETRICS) {
+	SendMessageW(hwnd, LVM_GETGROUPMETRICS, 0, cast(LPARAM)uintptr(pGroupMetrics))
+}
+ListView_EnableGroupView :: #force_inline proc "system" (hwnd: HWND, fEnable: BOOL) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_ENABLEGROUPVIEW, cast(WPARAM)fEnable, 0)
+}
+ListView_SortGroups :: #force_inline proc "system" (hwnd: HWND, pfnGroupCompare: PFNLVGROUPCOMPARE, pUser: rawptr) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_SORTGROUPS, transmute(uintptr)(pfnGroupCompare), cast(LPARAM)uintptr(pUser))
+}
+ListView_InsertGroupSorted :: #force_inline proc "system" (hwnd: HWND, structInsert: PLVINSERTGROUPSORTED) {
+	SendMessageW(hwnd, LVM_INSERTGROUPSORTED, uintptr(structInsert), 0)
+}
+ListView_RemoveAllGroups :: #force_inline proc "system" (hwnd: HWND) {
+	SendMessageW(hwnd, LVM_REMOVEALLGROUPS, 0, 0)
+}
+ListView_HasGroup :: #force_inline proc "system" (hwnd: HWND, dwGroupId: c_int) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_HASGROUP, cast(WPARAM)dwGroupId, 0)
+}
+ListView_SetTileViewInfo :: #force_inline proc "system" (hwnd: HWND, ptvi: PLVTILEVIEWINFO) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETTILEVIEWINFO, 0, cast(LPARAM)uintptr(ptvi))
+}
+ListView_GetTileViewInfo :: #force_inline proc "system" (hwnd: HWND, ptvi: PLVTILEVIEWINFO) {
+	SendMessageW(hwnd, LVM_GETTILEVIEWINFO, 0, cast(LPARAM)uintptr(ptvi))
+}
+ListView_SetTileInfo :: #force_inline proc "system" (hwnd: HWND, pti: PLVTILEINFO) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETTILEINFO, 0, cast(LPARAM)uintptr(pti))
+}
+ListView_GetTileInfo :: #force_inline proc "system" (hwnd: HWND, pti: PLVTILEINFO) {
+	SendMessageW(hwnd, LVM_GETTILEINFO, 0, cast(LPARAM)uintptr(pti))
+}
+ListView_SetInsertMark :: #force_inline proc "system" (hwnd: HWND, lvim: LPLVINSERTMARK) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_SETINSERTMARK, 0, cast(LPARAM)uintptr(lvim))
+}
+ListView_GetInsertMark :: #force_inline proc "system" (hwnd: HWND, lvim: LPLVINSERTMARK) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_GETINSERTMARK, 0, cast(LPARAM)uintptr(lvim))
+}
+ListView_InsertMarkHitTest :: #force_inline proc "system" (hwnd: HWND, point: LPPOINT, lvim: LPLVINSERTMARK) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_INSERTMARKHITTEST, uintptr(point), cast(LPARAM)uintptr(lvim))
+}
+ListView_GetInsertMarkRect :: #force_inline proc "system" (hwnd: HWND, rc: LPRECT) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, LVM_GETINSERTMARKRECT, 0, cast(LPARAM)uintptr(rc))
+}
+ListView_SetInsertMarkColor :: #force_inline proc "system" (hwnd: HWND, color: COLORREF) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, LVM_SETINSERTMARKCOLOR, 0, cast(LPARAM)color)
+}
+ListView_GetInsertMarkColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, LVM_GETINSERTMARKCOLOR, 0, 0)
+}
+ListView_SetInfoTip :: #force_inline proc "system" (hwndLV: HWND, plvInfoTip: PLVSETINFOTIP) -> BOOL {
+	return cast(BOOL)SendMessageW(hwndLV, LVM_SETINFOTIP, 0, cast(LPARAM)uintptr(plvInfoTip))
+}
+ListView_GetSelectedColumn :: #force_inline proc "system" (hwnd: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, LVM_GETSELECTEDCOLUMN, 0, 0)
+}
+ListView_IsGroupViewEnabled :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_ISGROUPVIEWENABLED, 0, 0)
+}
+ListView_GetOutlineColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, LVM_GETOUTLINECOLOR, 0, 0)
+}
+ListView_SetOutlineColor :: #force_inline proc "system" (hwnd: HWND, color: COLORREF) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, LVM_SETOUTLINECOLOR, 0, cast(LPARAM)color)
+}
+ListView_CancelEditLabel :: #force_inline proc "system" (hwnd: HWND) {
+	SendMessageW(hwnd, LVM_CANCELEDITLABEL, 0, 0)
+}
+ListView_MapIndexToID :: #force_inline proc "system" (hwnd: HWND, index: UINT) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, LVM_MAPINDEXTOID, cast(WPARAM)index, 0)
+}
+ListView_MapIDToIndex :: #force_inline proc "system" (hwnd: HWND, id: UINT) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, LVM_MAPIDTOINDEX, cast(WPARAM)id, 0)
+}
+ListView_IsItemVisible :: #force_inline proc "system" (hwnd: HWND, index: UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, LVM_ISITEMVISIBLE, cast(WPARAM)index, 0)
+}
+
+// Tree View Control
+HTREEITEM :: distinct rawptr
+
+TVIF_TEXT          :: 0x01
+TVIF_IMAGE         :: 0x02
+TVIF_PARAM         :: 0x04
+TVIF_STATE         :: 0x08
+TVIF_HANDLE        :: 0x10
+TVIF_SELECTEDIMAGE :: 0x20
+TVIF_CHILDREN      :: 0x40
+TVIF_INTEGRAL      :: 0x80
+
+TVIS_SELECTED      :: 0x02
+TVIS_CUT           :: 0x04
+TVIS_DROPHILITED   :: 0x08
+TVIS_BOLD          :: 0x10
+TVIS_EXPANDED      :: 0x20
+TVIS_EXPANDEDONCE  :: 0x40
+TVIS_EXPANDPARTIAL :: 0x80
+
+TVIS_OVERLAYMASK    :: 0x0F00
+TVIS_STATEIMAGEMASK :: 0xF000
+TVIS_USERMASK       :: 0xF000
+
+I_CHILDRENCALLBACK :: (-1)
+
+TVI_ROOT  :: cast(HTREEITEM)~uintptr(0x10000 - 1)
+TVI_FIRST :: cast(HTREEITEM)~uintptr(0x0FFFF - 1)
+TVI_LAST  :: cast(HTREEITEM)~uintptr(0x0FFFE - 1)
+TVI_SORT  :: cast(HTREEITEM)~uintptr(0x0FFFD - 1)
+
+TVN_SELCHANGINGA    :: (TVN_FIRST-1)
+TVN_SELCHANGINGW    :: (TVN_FIRST-50)
+TVN_SELCHANGEDA     :: (TVN_FIRST-2)
+TVN_SELCHANGEDW     :: (TVN_FIRST-51)
+TVN_GETDISPINFOA    :: (TVN_FIRST-3)
+TVN_GETDISPINFOW    :: (TVN_FIRST-52)
+TVN_SETDISPINFOA    :: (TVN_FIRST-4)
+TVN_SETDISPINFOW    :: (TVN_FIRST-53)
+TVN_ITEMEXPANDINGA  :: (TVN_FIRST-5)
+TVN_ITEMEXPANDINGW  :: (TVN_FIRST-54)
+TVN_ITEMEXPANDEDA   :: (TVN_FIRST-6)
+TVN_ITEMEXPANDEDW   :: (TVN_FIRST-55)
+TVN_BEGINDRAGA      :: (TVN_FIRST-7)
+TVN_BEGINDRAGW      :: (TVN_FIRST-56)
+TVN_BEGINRDRAGA     :: (TVN_FIRST-8)
+TVN_BEGINRDRAGW     :: (TVN_FIRST-57)
+TVN_DELETEITEMA     :: (TVN_FIRST-9)
+TVN_DELETEITEMW     :: (TVN_FIRST-58)
+TVN_BEGINLABELEDITA :: (TVN_FIRST-10)
+TVN_BEGINLABELEDITW :: (TVN_FIRST-59)
+TVN_ENDLABELEDITA   :: (TVN_FIRST-11)
+TVN_ENDLABELEDITW   :: (TVN_FIRST-60)
+TVN_KEYDOWN         :: (TVN_FIRST-12)
+TVN_GETINFOTIPA     :: (TVN_FIRST-13)
+TVN_GETINFOTIPW     :: (TVN_FIRST-14)
+TVN_SINGLEEXPAND    :: (TVN_FIRST-15)
+
+TVC_UNKNOWN    :: 0x0
+TVC_BYMOUSE    :: 0x1
+TVC_BYKEYBOARD :: 0x2
+
+TVIF_DI_SETITEM :: 0x1000
+
+TVNRET_DEFAULT :: 0
+TVNRET_SKIPOLD :: 1
+TVNRET_SKIPNEW :: 2
+
+TVCDRF_NOIMAGES :: 0x10000
+
+TVITEMW :: struct {
+	mask: UINT,
+	hItem: HTREEITEM,
+	state: UINT,
+	stateMask: UINT,
+	pszText: LPWSTR,
+	cchTextMax: c_int,
+	iImage: c_int,
+	iSelectedImage: c_int,
+	cChildren: c_int,
+	lParam: LPARAM,
+}
+TV_ITEMW   :: TVITEMW
+LPTVITEMW  :: ^TVITEMW
+LPTV_ITEMW :: LPTVITEMW
+
+TVITEMEXW :: struct {
+	mask: UINT,
+	hItem: HTREEITEM,
+	state: UINT,
+	stateMask: UINT,
+	pszText: LPWSTR,
+	cchTextMax: c_int,
+	iImage: c_int,
+	iSelectedImage: c_int,
+	cChildren: c_int,
+	lParam: LPARAM,
+	iIntegral: c_int,
+}
+TV_ITEMEXW   :: TVITEMEXW
+LPTVITEMEXW  :: ^TVITEMEXW
+LPTV_ITEMEXW :: LPTVITEMEXW
+
+TVINSERTSTRUCTW :: struct {
+	hParent: HTREEITEM,
+	hInsertAfter: HTREEITEM,
+	_: struct #raw_union {
+		itemex: TVITEMEXW,
+		item: TV_ITEMW,
+	},
+}
+TV_INSERTSTRUCTW   :: TVINSERTSTRUCTW
+LPTVINSERTSTRUCTW  :: ^TVINSERTSTRUCTW
+LPTV_INSERTSTRUCTW :: LPTVINSERTSTRUCTW
+
+TVHITTESTINFO :: struct {
+    pt: POINT,
+    flags: UINT,
+    hItem: HTREEITEM,
+}
+TV_HITTESTINFO   :: TVHITTESTINFO
+LPTVHITTESTINFO  :: ^TVHITTESTINFO
+LPTV_HITTESTINFO :: LPTVHITTESTINFO
+
+TVSORTCB :: struct {
+	hParent: HTREEITEM,
+	lpfnCompare: PFNTVCOMPARE,
+	lParam: LPARAM,
+}
+TV_SORTCB   :: TVSORTCB
+LPTVSORTCB  :: ^TVSORTCB
+LPTV_SORTCB :: LPTVSORTCB
+
+NMTREEVIEWW :: struct {
+    hdr: NMHDR,
+    action: UINT,
+    itemOld: TVITEMW,
+    itemNew: TVITEMW,
+    ptDrag: POINT,
+}
+NM_TREEVIEWW   :: NMTREEVIEWW
+LPNMTREEVIEWW  :: ^NMTREEVIEWW
+LPNM_TREEVIEWW :: LPNMTREEVIEWW
+
+NMTVDISPINFOW :: struct {
+    hdr: NMHDR,
+    item: TVITEMW,
+}
+TV_DISPINFOW    :: NMTVDISPINFOW
+LPNMTVDISPINFOW :: ^NMTVDISPINFOW
+
+NMTVDISPINFOEXW :: struct {
+    hdr: NMHDR,
+    item: TVITEMEXW,
+}
+TV_DISPINFOEXW    :: NMTVDISPINFOEXW
+LPNMTVDISPINFOEXW :: ^NMTVDISPINFOEXW
+
+NMTVKEYDOWN :: struct #packed {
+    hdr: NMHDR,
+    wVKey: WORD,
+    flags: UINT,
+}
+TV_KEYDOWN    :: NMTVKEYDOWN
+LPNMTVKEYDOWN :: ^NMTVKEYDOWN
+
+NMTVCUSTOMDRAW :: struct {
+    nmcd: NMCUSTOMDRAW,
+    clrText: COLORREF,
+    clrTextBk: COLORREF,
+    iLevel: c_int,
+}
+LPNMTVCUSTOMDRAW :: ^NMTVCUSTOMDRAW
+
+NMTVGETINFOTIPW :: struct {
+    hdr: NMHDR,
+    pszText: LPWSTR,
+    cchTextMax: c_int,
+    hItem: HTREEITEM,
+    lParam: LPARAM,
+}
+TV_GETINFOTIPW    :: NMTVGETINFOTIPW
+LPNMTVGETINFOTIPW :: ^NMTVGETINFOTIPW
+
+PFNTVCOMPARE :: #type proc "system" (lParam1,lParam2: LPARAM, lParamSort: LPARAM) -> c_int
+
+TreeView_InsertItem :: #force_inline proc "system" (hwnd: HWND, lpis: LPTV_INSERTSTRUCTW) -> HTREEITEM {
+	return cast(HTREEITEM)uintptr(SendMessageW(hwnd, TVM_INSERTITEMW, 0, cast(LPARAM)uintptr(lpis)))
+}
+TreeView_DeleteItem :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_DELETEITEM, 0, cast(LPARAM)uintptr(hitem))
+}
+TreeView_DeleteAllItems :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_DELETEITEM, 0, cast(LPARAM)transmute(uintptr)(TVI_ROOT))
+}
+TreeView_Expand :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, code: UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_EXPAND, cast(WPARAM)code, cast(LPARAM)uintptr(hitem))
+}
+TreeView_GetItemRect :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, prc: ^RECT, code: UINT) -> BOOL {
+	alias: struct #raw_union {
+		rc: ^RECT,
+		hitem: ^HTREEITEM,
+	}
+
+	alias.rc     = prc
+	alias.hitem^ = hitem
+
+	return cast(BOOL)SendMessageW(hwnd, TVM_GETITEMRECT, cast(WPARAM)code, cast(LPARAM)uintptr(prc))
+}
+TreeView_GetCount :: #force_inline proc "system" (hwnd: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, TVM_GETCOUNT, 0, 0)
+}
+TreeView_GetIndent :: #force_inline proc "system" (hwnd: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, TVM_GETINDENT, 0, 0)
+}
+TreeView_SetIndent :: #force_inline proc "system" (hwnd: HWND, indent: UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SETINDENT, cast(WPARAM)indent, 0)
+}
+TreeView_GetImageList :: #force_inline proc "system" (hwnd: HWND, iImage: INT) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd, TVM_GETIMAGELIST, cast(WPARAM)iImage, 0))
+}
+TreeView_SetImageList :: #force_inline proc "system" (hwnd: HWND, himl: HIMAGELIST, iImage: INT) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd, TVM_SETIMAGELIST, cast(WPARAM)iImage, cast(LPARAM)uintptr(himl)))
+}
+TreeView_GetNextItem :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, code: UINT) -> HTREEITEM {
+	return cast(HTREEITEM)uintptr(SendMessageW(hwnd, TVM_GETNEXTITEM, cast(WPARAM)code, cast(LPARAM)uintptr(hitem)))
+}
+TreeView_GetChild :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, hitem, TVGN_CHILD)
+}
+TreeView_GetNextSibling :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, hitem, TVGN_NEXT)
+}
+TreeView_GetPrevSibling :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, hitem, TVGN_PREVIOUS)
+}
+TreeView_GetParent :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, hitem, TVGN_PARENT)
+}
+TreeView_GetFirstVisible :: #force_inline proc "system" (hwnd: HWND) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, nil, TVGN_FIRSTVISIBLE)
+}
+TreeView_GetNextVisible :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, hitem, TVGN_NEXTVISIBLE)
+}
+TreeView_GetPrevVisible :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, hitem, TVGN_PREVIOUSVISIBLE)
+}
+TreeView_GetSelection :: #force_inline proc "system" (hwnd: HWND) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, nil, TVGN_CARET)
+}
+TreeView_GetDropHilight :: #force_inline proc "system" (hwnd: HWND) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, nil, TVGN_DROPHILITE)
+}
+TreeView_GetRoot :: #force_inline proc "system" (hwnd: HWND) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, nil, TVGN_ROOT)
+}
+TreeView_GetLastVisible :: #force_inline proc "system" (hwnd: HWND) -> HTREEITEM {
+	return TreeView_GetNextItem(hwnd, nil, TVGN_LASTVISIBLE)
+}
+TreeView_Select :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, code: UINT) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SELECTITEM, cast(WPARAM)code, cast(LPARAM)uintptr(hitem))
+}
+TreeView_SelectItem :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> BOOL {
+	return TreeView_Select(hwnd, hitem, TVGN_CARET)
+}
+TreeView_SelectDropTarget :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> BOOL {
+	return TreeView_Select(hwnd, hitem, TVGN_DROPHILITE)
+}
+TreeView_SelectSetFirstVisible :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> BOOL {
+	return TreeView_Select(hwnd, hitem, TVGN_FIRSTVISIBLE)
+}
+TreeView_GetItem :: #force_inline proc "system" (hwnd: HWND, pitem: ^TV_ITEMW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_GETITEMW, 0, cast(LPARAM)uintptr(pitem))
+}
+TreeView_SetItem :: #force_inline proc "system" (hwnd: HWND, pitem: ^TV_ITEMW) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SETITEMW, 0, cast(LPARAM)uintptr(pitem))
+}
+TreeView_EditLabel :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwnd, TVM_EDITLABELW, 0, cast(LPARAM)uintptr(hitem)))
+}
+TreeView_GetEditControl :: #force_inline proc "system" (hwnd: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwnd, TVM_GETEDITCONTROL, 0, 0))
+}
+TreeView_GetVisibleCount :: #force_inline proc "system" (hwnd: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, TVM_GETVISIBLECOUNT, 0, 0)
+}
+TreeView_HitTest :: #force_inline proc "system" (hwnd: HWND, lpht: LPTV_HITTESTINFO) -> HTREEITEM {
+	return cast(HTREEITEM)uintptr(SendMessageW(hwnd, TVM_HITTEST, 0, cast(LPARAM)uintptr(lpht)))
+}
+TreeView_CreateDragImage :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> HIMAGELIST {
+	return cast(HIMAGELIST)uintptr(SendMessageW(hwnd, TVM_CREATEDRAGIMAGE, 0, cast(LPARAM)uintptr(hitem)))
+}
+TreeView_SortChildren :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, recurse: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SORTCHILDREN, cast(WPARAM)recurse, cast(LPARAM)uintptr(hitem))
+}
+TreeView_EnsureVisible :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_ENSUREVISIBLE, 0, cast(LPARAM)uintptr(hitem))
+}
+TreeView_SortChildrenCB :: #force_inline proc "system" (hwnd: HWND, psort: LPTVSORTCB, recurse: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SORTCHILDRENCB, cast(WPARAM)recurse, cast(LPARAM)uintptr(psort))
+}
+TreeView_EndEditLabelNow :: #force_inline proc "system" (hwnd: HWND, fCancel: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_ENDEDITLABELNOW, cast(WPARAM)fCancel, 0)
+}
+TreeView_SetToolTips :: #force_inline proc "system" (hwnd: HWND, hwndTT: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwnd, TVM_SETTOOLTIPS, uintptr(hwndTT), 0))
+}
+TreeView_GetToolTips :: #force_inline proc "system" (hwnd: HWND) -> HWND {
+	return cast(HWND)uintptr(SendMessageW(hwnd, TVM_GETTOOLTIPS, 0, 0))
+}
+TreeView_GetISearchString :: #force_inline proc "system" (hwnd: HWND, lpsz: LPWSTR) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_GETISEARCHSTRINGW, 0, cast(LPARAM)uintptr(lpsz))
+}
+TreeView_SetInsertMark :: #force_inline proc "system" (hwnd: HWND, hItem: HTREEITEM, fAfter: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SETINSERTMARK, cast(WPARAM)fAfter, cast(LPARAM)uintptr(hItem))
+}
+TreeView_SetUnicodeFormat :: #force_inline proc "system" (hwnd: HWND, fUnicode: BOOL) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_SETUNICODEFORMAT, cast(WPARAM)fUnicode, 0)
+}
+TreeView_GetUnicodeFormat :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+	return cast(BOOL)SendMessageW(hwnd, TVM_GETUNICODEFORMAT, 0, 0)
+}
+TreeView_SetItemHeight :: #force_inline proc "system" (hwnd: HWND, iHeight: c_int) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, TVM_SETITEMHEIGHT, cast(WPARAM)iHeight, 0)
+}
+TreeView_GetItemHeight :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+	return cast(c_int)SendMessageW(hwnd, TVM_GETITEMHEIGHT, 0, 0)
+}
+TreeView_SetBkColor :: #force_inline proc "system" (hwnd: HWND, clr: COLORREF) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_SETBKCOLOR, 0, cast(LPARAM)clr)
+}
+TreeView_SetTextColor :: #force_inline proc "system" (hwnd: HWND, clr: COLORREF) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_SETTEXTCOLOR, 0, cast(LPARAM)clr)
+}
+TreeView_GetBkColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_GETBKCOLOR, 0, 0)
+}
+TreeView_GetTextColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_GETTEXTCOLOR, 0, 0)
+}
+TreeView_SetScrollTime :: #force_inline proc "system" (hwnd: HWND, uTime: UINT) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, TVM_SETSCROLLTIME, cast(WPARAM)uTime, 0)
+}
+TreeView_GetScrollTime :: #force_inline proc "system" (hwnd: HWND) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, TVM_GETSCROLLTIME, 0, 0)
+}
+TreeView_SetInsertMarkColor :: #force_inline proc "system" (hwnd: HWND, clr: COLORREF) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_SETINSERTMARKCOLOR, 0, cast(LPARAM)clr)
+}
+TreeView_GetInsertMarkColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_GETINSERTMARKCOLOR, 0, 0)
+}
+TreeView_SetItemState :: #force_inline proc "system" (hwndTV: HWND, hti: HTREEITEM, data: UINT, mask: UINT) {
+	item := TVITEMW {
+		mask      = TVIF_STATE,
+		hItem     = hti,
+		stateMask = mask,
+		state     = data,
+	}
+	SendMessageW(hwndTV, TVM_SETITEMW, 0, cast(LPARAM)uintptr(&item))
+}
+TreeView_SetCheckState :: #force_inline proc "system" (hwndTV: HWND, hti: HTREEITEM, fCheck: BOOL) {
+	TreeView_SetItemState(hwndTV, hti, INDEXTOSTATEIMAGEMASK(2 if fCheck else 1), TVIS_STATEIMAGEMASK)
+}
+TreeView_GetItemState :: #force_inline proc "system" (hwndTV: HWND, hti: HTREEITEM, mask: UINT) -> UINT {
+	return cast(UINT)SendMessageW(hwndTV, TVM_GETITEMSTATE, uintptr(hti), cast(LPARAM)mask)
+}
+TreeView_GetCheckState :: #force_inline proc "system" (hwndTV: HWND, hti: HTREEITEM) -> UINT {
+	return ((cast(UINT)SendMessageW(hwndTV, TVM_GETITEMSTATE, uintptr(hti), cast(LPARAM)TVIS_STATEIMAGEMASK)) >> 12) - 1
+}
+TreeView_SetLineColor :: #force_inline proc "system" (hwnd: HWND, clr: COLORREF) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_SETLINECOLOR, 0, cast(LPARAM)clr)
+}
+TreeView_GetLineColor :: #force_inline proc "system" (hwnd: HWND) -> COLORREF {
+	return cast(COLORREF)SendMessageW(hwnd, TVM_GETLINECOLOR, 0, 0)
+}
+TreeView_MapAccIDToHTREEITEM :: #force_inline proc "system" (hwnd: HWND, id: UINT) -> HTREEITEM {
+	return cast(HTREEITEM)uintptr(SendMessageW(hwnd, TVM_MAPACCIDTOHTREEITEM, cast(WPARAM)id, 0))
+}
+TreeView_MapHTREEITEMToAccID :: #force_inline proc "system" (hwnd: HWND, htreeitem: HTREEITEM) -> UINT {
+	return cast(UINT)SendMessageW(hwnd, TVM_MAPHTREEITEMTOACCID, uintptr(htreeitem), 0)
+}
+
+// Combo Box Ex Control
+CBEIF_TEXT          :: 0x01
+CBEIF_IMAGE         :: 0x02
+CBEIF_SELECTEDIMAGE :: 0x04
+CBEIF_OVERLAY       :: 0x08
+CBEIF_INDENT        :: 0x10
+CBEIF_LPARAM        :: 0x20
+
+CBEIF_DI_SETITEM :: 0x10000000
+
+CBES_EX_NOEDITIMAGE       :: 0x01
+CBES_EX_NOEDITIMAGEINDENT :: 0x02
+CBES_EX_PATHWORDBREAKPROC :: 0x04
+CBES_EX_NOSIZELIMIT       :: 0x08
+CBES_EX_CASESENSITIVE     :: 0x10
+
+CBEN_GETDISPINFOA :: (CBEN_FIRST - 0)
+CBEN_INSERTITEM   :: (CBEN_FIRST - 1)
+CBEN_DELETEITEM   :: (CBEN_FIRST - 2)
+CBEN_BEGINEDIT    :: (CBEN_FIRST - 4)
+CBEN_ENDEDITA     :: (CBEN_FIRST - 5)
+CBEN_ENDEDITW     :: (CBEN_FIRST - 6)
+CBEN_GETDISPINFOW :: (CBEN_FIRST - 7)
+CBEN_DRAGBEGINA   :: (CBEN_FIRST - 8)
+CBEN_DRAGBEGINW   :: (CBEN_FIRST - 9)
+
+CBENF_KILLFOCUS :: 1
+CBENF_RETURN    :: 2
+CBENF_ESCAPE    :: 3
+CBENF_DROPDOWN  :: 4
+
+CBEMAXSTRLEN :: 260
+
+COMBOBOXEXITEMW :: struct {
+    mask: UINT,
+    iItem: INT_PTR,
+    pszText: LPWSTR,
+    cchTextMax: c_int,
+    iImage: c_int,
+    iSelectedImage: c_int,
+    iOverlay: c_int,
+    iIndent: c_int,
+    lParam: LPARAM,
+}
+PCOMBOBOXEXITEMW  :: ^COMBOBOXEXITEMW
+PCCOMBOBOXEXITEMW :: ^COMBOBOXEXITEMW
+
+NMCOMBOBOXEXW :: struct {
+    hdr: NMHDR,
+    ceItem: COMBOBOXEXITEMW,
+}
+PNMCOMBOBOXEXW :: ^NMCOMBOBOXEXW
+
+NMCBEDRAGBEGINW :: struct {
+    hdr: NMHDR,
+    iItemId: c_int,
+    szText: [CBEMAXSTRLEN]WCHAR,
+}
+PNMCBEDRAGBEGINW  :: ^NMCBEDRAGBEGINW
+LPNMCBEDRAGBEGINW :: PNMCBEDRAGBEGINW
+
+NMCBEENDEDITW :: struct {
+    hdr: NMHDR,
+    fChanged: BOOL,
+    iNewSelection: c_int,
+    szText: [CBEMAXSTRLEN]WCHAR,
+    iWhy: c_int,
+}
+PNMCBEENDEDITW  :: ^NMCBEENDEDITW
+LPNMCBEENDEDITW :: PNMCBEENDEDITW
+
+// Tab Control
+TCS_EX_FLATSEPARATORS :: 0x1
+TCS_EX_REGISTERDROP   :: 0x2
+
+TCN_KEYDOWN     :: TCN_FIRST - 0
+TCN_SELCHANGE   :: TCN_FIRST - 1
+TCN_SELCHANGING :: TCN_FIRST - 2
+TCN_GETOBJECT   :: TCN_FIRST - 3
+TCN_FOCUSCHANGE :: TCN_FIRST - 4
+
+TCITEMHEADERW :: struct {
+    mask: UINT,
+    lpReserved1: UINT,
+    lpReserved2: UINT,
+    pszText: LPWSTR,
+    cchTextMax: c_int,
+    iImage: c_int,
+}
+TC_ITEMHEADERW   :: TCITEMHEADERW
+LPTCITEMHEADERW  :: ^TCITEMHEADERW
+LPTC_ITEMHEADERW :: LPTCITEMHEADERW
+
+TCITEMW :: struct {
+    mask: UINT,
+    dwState: DWORD,
+    dwStateMask: DWORD,
+    pszText: LPWSTR,
+    cchTextMax: c_int,
+    iImage: c_int,
+    lParam: LPARAM,
+}
+TC_ITEMW   :: TCITEMW
+LPTCITEMW  :: ^TCITEMW
+LPTC_ITEMW :: LPTCITEMW
+
+TCHITTESTINFO :: struct {
+    pt: POINT,
+    flags: UINT,
+}
+TC_HITTESTINFO   :: TCHITTESTINFO
+LPTCHITTESTINFO  :: ^TCHITTESTINFO
+LPTC_HITTESTINFO :: LPTCHITTESTINFO
+
+NMTCKEYDOWN :: struct #packed {
+    hdr: NMHDR,
+    wVKey: WORD,
+    flags: UINT,
+}
+TC_KEYDOWN :: NMTCKEYDOWN
+
+TabCtrl_GetImageList :: #force_inline proc "system" (hwnd: HWND) -> HIMAGELIST {
+    return cast(HIMAGELIST)uintptr(SendMessageW(hwnd, TCM_GETIMAGELIST, 0, 0))
+}
+TabCtrl_SetImageList :: #force_inline proc "system" (hwnd: HWND, himl: HIMAGELIST) -> HIMAGELIST {
+    return cast(HIMAGELIST)uintptr(SendMessageW(hwnd, TCM_SETIMAGELIST, 0, cast(LPARAM)uintptr(himl)))
+}
+TabCtrl_GetItemCount :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_GETITEMCOUNT, 0, 0)
+}
+TabCtrl_GetItem :: #force_inline proc "system" (hwnd: HWND, iItem: c_int, pitem: ^TC_ITEMW) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_GETITEMW, cast(WPARAM)iItem, cast(LPARAM)uintptr(pitem))
+}
+TabCtrl_SetItem :: #force_inline proc "system" (hwnd: HWND, iItem: c_int, pitem: ^TC_ITEMW) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_SETITEMW, cast(WPARAM)iItem, cast(LPARAM)uintptr(pitem))
+}
+TabCtrl_InsertItem :: #force_inline proc "system" (hwnd: HWND, iItem: c_int, pitem: ^TC_ITEMW) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_INSERTITEMW, cast(WPARAM)iItem, cast(LPARAM)uintptr(pitem))
+}
+TabCtrl_DeleteItem :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_DELETEITEM, cast(WPARAM)i, 0)
+}
+TabCtrl_DeleteAllItems :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_DELETEALLITEMS, 0, 0)
+}
+TabCtrl_GetItemRect :: #force_inline proc "system" (hwnd: HWND, i: c_int, prc: ^RECT) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_GETITEMRECT, cast(WPARAM)i, cast(LPARAM)uintptr(prc))
+}
+TabCtrl_GetCurSel :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_GETCURSEL, 0, 0)
+}
+TabCtrl_SetCurSel :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_SETCURSEL, cast(WPARAM)i, 0)
+}
+TabCtrl_HitTest :: #force_inline proc "system" (hwndTC: HWND, pinfo: ^TC_HITTESTINFO) -> c_int {
+    return cast(c_int)SendMessageW(hwndTC, TCM_HITTEST, 0, cast(LPARAM)uintptr(pinfo))
+}
+TabCtrl_SetItemExtra :: #force_inline proc "system" (hwndTC: HWND, cb: c_int) -> BOOL {
+    return cast(BOOL)SendMessageW(hwndTC, TCM_SETITEMEXTRA, cast(WPARAM)cb, 0)
+}
+TabCtrl_AdjustRect :: #force_inline proc "system" (hwnd: HWND, bLarger: BOOL, prc: ^RECT) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_ADJUSTRECT, cast(WPARAM)bLarger, cast(LPARAM)uintptr(prc))
+}
+TabCtrl_SetItemSize :: #force_inline proc "system" (hwnd: HWND, x,y: c_int) -> DWORD {
+    return cast(DWORD)SendMessageW(hwnd, TCM_SETITEMSIZE, 0, MAKELPARAM(x,y))
+}
+TabCtrl_RemoveImage :: #force_inline proc "system" (hwnd: HWND, i: c_int) {
+    SendMessageW(hwnd, TCM_REMOVEIMAGE, cast(WPARAM)i, 0)
+}
+TabCtrl_SetPadding :: #force_inline proc "system" (hwnd: HWND, cx,cy: c_int) {
+    SendMessageW(hwnd, TCM_SETPADDING, 0, MAKELPARAM(cx,cy))
+}
+TabCtrl_GetRowCount :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_GETROWCOUNT, 0, 0)
+}
+TabCtrl_GetToolTips :: #force_inline proc "system" (hwnd: HWND) -> HWND {
+    return cast(HWND)uintptr(SendMessageW(hwnd, TCM_GETTOOLTIPS, 0, 0))
+}
+TabCtrl_SetToolTips :: #force_inline proc "system" (hwnd: HWND, hwndTT: HWND) {
+    SendMessageW(hwnd, TCM_SETTOOLTIPS, uintptr(hwndTT), 0)
+}
+TabCtrl_GetCurFocus :: #force_inline proc "system" (hwnd: HWND) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_GETCURFOCUS, 0, 0)
+}
+TabCtrl_SetCurFocus :: #force_inline proc "system" (hwnd: HWND, i: c_int) {
+    SendMessageW(hwnd, TCM_SETCURFOCUS, cast(WPARAM)i, 0)
+}
+TabCtrl_SetMinTabWidth :: #force_inline proc "system" (hwnd: HWND, x: c_int) -> c_int {
+    return cast(c_int)SendMessageW(hwnd, TCM_SETMINTABWIDTH, 0, cast(LPARAM)x)
+}
+TabCtrl_DeselectAll :: #force_inline proc "system" (hwnd: HWND, fExcludeFocus: BOOL) {
+    SendMessageW(hwnd, TCM_DESELECTALL, cast(WPARAM)fExcludeFocus, 0)
+}
+TabCtrl_HighlightItem :: #force_inline proc "system" (hwnd: HWND, i: c_int, fHighlight: BOOL) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_HIGHLIGHTITEM, cast(WPARAM)i, cast(LPARAM)MAKELONG(fHighlight,0))
+}
+TabCtrl_SetExtendedStyle :: #force_inline proc "system" (hwnd: HWND, dw: DWORD) -> DWORD {
+    return cast(DWORD)SendMessageW(hwnd, TCM_SETEXTENDEDSTYLE, 0, cast(LPARAM)dw)
+}
+TabCtrl_GetExtendedStyle :: #force_inline proc "system" (hwnd: HWND) -> DWORD {
+    return cast(DWORD)SendMessageW(hwnd, TCM_GETEXTENDEDSTYLE, 0, 0)
+}
+TabCtrl_SetUnicodeFormat :: #force_inline proc "system" (hwnd: HWND, fUnicode: BOOL) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_SETUNICODEFORMAT, cast(WPARAM)fUnicode, 0)
+}
+TabCtrl_GetUnicodeFormat :: #force_inline proc "system" (hwnd: HWND) -> BOOL {
+    return cast(BOOL)SendMessageW(hwnd, TCM_GETUNICODEFORMAT, 0, 0)
+}

+ 463 - 0
core/sys/windows/types.odin

@@ -66,6 +66,7 @@ PULONG_PTR :: ^ULONG_PTR
 LPULONG_PTR :: ^ULONG_PTR
 DWORD_PTR :: ULONG_PTR
 LONG_PTR :: int
+INT_PTR :: int
 UINT_PTR :: uintptr
 ULONG :: c_ulong
 ULONGLONG :: c_ulonglong
@@ -542,6 +543,44 @@ COLOR_3DHIGHLIGHT :: COLOR_BTNHIGHLIGHT
 COLOR_3DHILIGHT   :: COLOR_BTNHIGHLIGHT
 COLOR_BTNHILIGHT  :: COLOR_BTNHIGHLIGHT
 
+// Common Control Notification Code Ranges
+NM_FIRST   :: 0
+NM_LAST    :: ~DWORD(99 - 1)
+LVN_FIRST  :: ~DWORD(100 - 1)
+LVN_LAST   :: ~DWORD(199 - 1)
+HDN_FIRST  :: ~DWORD(300 - 1)
+HDN_LAST   :: ~DWORD(399 - 1)
+TVN_FIRST  :: ~DWORD(400 - 1)
+TVN_LAST   :: ~DWORD(499 - 1)
+TTN_FIRST  :: ~DWORD(520 - 1)
+TTN_LAST   :: ~DWORD(549 - 1)
+TCN_FIRST  :: ~DWORD(550 - 1)
+TCN_LAST   :: ~DWORD(580 - 1)
+CDN_FIRST  :: ~DWORD(601 - 1)
+CDN_LAST   :: ~DWORD(699 - 1)
+TBN_FIRST  :: ~DWORD(700 - 1)
+TBN_LAST   :: ~DWORD(720 - 1)
+UDN_FIRST  :: ~DWORD(721 - 1)
+UDN_LAST   :: ~DWORD(740 - 1)
+MCN_FIRST  :: ~DWORD(750 - 1)
+MCN_LAST   :: ~DWORD(759 - 1)
+DTN_FIRST  :: ~DWORD(760 - 1)
+DTN_LAST   :: ~DWORD(799 - 1)
+CBEN_FIRST :: ~DWORD(800 - 1)
+CBEN_LAST  :: ~DWORD(830 - 1)
+RBN_FIRST  :: ~DWORD(831 - 1)
+RBN_LAST   :: ~DWORD(859 - 1)
+IPN_FIRST  :: ~DWORD(860 - 1)
+IPN_LAST   :: ~DWORD(879 - 1)
+SBN_FIRST  :: ~DWORD(880 - 1)
+SBN_LAST   :: ~DWORD(899 - 1)
+PGN_FIRST  :: ~DWORD(900 - 1)
+PGN_LAST   :: ~DWORD(950 - 1)
+WMN_FIRST  :: ~DWORD(1000 - 1)
+WMN_LAST   :: ~DWORD(1200 - 1)
+BCN_FIRST  :: ~DWORD(1250 - 1)
+BCN_LAST   :: ~DWORD(1350 - 1)
+
 // Combo Box Notification Codes
 CBN_ERRSPACE     :: -1
 CBN_SELCHANGE    :: 1
@@ -624,6 +663,10 @@ BST_INDETERMINATE :: 0x0002
 BST_PUSHED        :: 0x0004
 BST_FOCUS         :: 0x0008
 
+// Button Control Notification Codes
+BCN_HOTITEMCHANGE :: (BCN_FIRST + 0x0001)
+BCN_DROPDOWN      :: (BCN_FIRST + 0x0002)
+
 // Static Control Constants
 SS_LEFT            :: 0x00000000
 SS_CENTER          :: 0x00000001
@@ -686,6 +729,416 @@ EN_VSCROLL      :: 0x0602
 EN_ALIGN_LTR_EC :: 0x0700
 EN_ALIGN_RTL_EC :: 0x0701
 
+// Toolbar Styles
+TBS_AUTOTICKS      :: 0x001
+TBS_VERT           :: 0x002
+TBS_HORZ           :: 0x000
+TBS_TOP            :: 0x004
+TBS_BOTTOM         :: 0x000
+TBS_LEFT           :: 0x004
+TBS_RIGHT          :: 0x000
+TBS_BOTH           :: 0x008
+TBS_NOTICKS        :: 0x010
+TBS_ENABLESELRANGE :: 0x020
+TBS_FIXEDLENGTH    :: 0x040
+TBS_NOTHUMB        :: 0x080
+TBS_TOOLTIPS       :: 0x100
+TBS_REVERSED       :: 0x200
+TBS_DOWNISLEFT     :: 0x400
+
+// Toolbar Button Styles
+TBSTYLE_BUTTON       :: 0x0000
+TBSTYLE_SEP          :: 0x0001
+TBSTYLE_CHECK        :: 0x0002
+TBSTYLE_GROUP        :: 0x0004
+TBSTYLE_CHECKGROUP   :: (TBSTYLE_GROUP | TBSTYLE_CHECK)
+TBSTYLE_DROPDOWN     :: 0x0008
+TBSTYLE_AUTOSIZE     :: 0x0010
+TBSTYLE_NOPREFIX     :: 0x0020
+TBSTYLE_TOOLTIPS     :: 0x0100
+TBSTYLE_WRAPABLE     :: 0x0200
+TBSTYLE_ALTDRAG      :: 0x0400
+TBSTYLE_FLAT         :: 0x0800
+TBSTYLE_LIST         :: 0x1000
+TBSTYLE_CUSTOMERASE  :: 0x2000
+TBSTYLE_REGISTERDROP :: 0x4000
+TBSTYLE_TRANSPARENT  :: 0x8000
+
+// Toolbar Button Styles (Aliases)
+BTNS_BUTTON        :: TBSTYLE_BUTTON
+BTNS_SEP           :: TBSTYLE_SEP
+BTNS_CHECK         :: TBSTYLE_CHECK
+BTNS_GROUP         :: TBSTYLE_GROUP
+BTNS_CHECKGROUP    :: TBSTYLE_CHECKGROUP
+BTNS_DROPDOWN      :: TBSTYLE_DROPDOWN
+BTNS_AUTOSIZE      :: TBSTYLE_AUTOSIZE
+BTNS_NOPREFIX      :: TBSTYLE_NOPREFIX
+BTNS_SHOWTEXT      :: 0x40
+BTNS_WHOLEDROPDOWN :: 0x80
+
+// Toolbar Extended Styles
+TBSTYLE_EX_DRAWDDARROWS       :: 0x01
+TBSTYLE_EX_MIXEDBUTTONS       :: 0x08
+TBSTYLE_EX_HIDECLIPPEDBUTTONS :: 0x10
+TBSTYLE_EX_DOUBLEBUFFER       :: 0x80
+
+// Toolbar Item State Codes
+TBSTATE_CHECKED       :: 0x01
+TBSTATE_PRESSED       :: 0x02
+TBSTATE_ENABLED       :: 0x04
+TBSTATE_HIDDEN        :: 0x08
+TBSTATE_INDETERMINATE :: 0x10
+TBSTATE_WRAP          :: 0x20
+TBSTATE_ELLIPSES      :: 0x40
+TBSTATE_MARKED        :: 0x80
+
+// Toolbar Constants
+TBCDRF_NOEDGES        :: 0x010000
+TBCDRF_HILITEHOTTRACK :: 0x020000
+TBCDRF_NOOFFSET       :: 0x040000
+TBCDRF_NOMARK         :: 0x080000
+TBCDRF_NOETCHEDEFFECT :: 0x100000
+TBCDRF_BLENDICON      :: 0x200000
+TBCDRF_NOBACKGROUND   :: 0x400000
+
+TBBF_LARGE :: 0x1
+
+TBIF_IMAGE   :: 0x00000001
+TBIF_TEXT    :: 0x00000002
+TBIF_STATE   :: 0x00000004
+TBIF_STYLE   :: 0x00000008
+TBIF_LPARAM  :: 0x00000010
+TBIF_COMMAND :: 0x00000020
+TBIF_SIZE    :: 0x00000040
+TBIF_BYINDEX :: 0x80000000
+
+TBMF_PAD           :: 0x1
+TBMF_BARPAD        :: 0x2
+TBMF_BUTTONSPACING :: 0x4
+
+IDB_STD_SMALL_COLOR  :: 0
+IDB_STD_LARGE_COLOR  :: 1
+IDB_VIEW_SMALL_COLOR :: 4
+IDB_VIEW_LARGE_COLOR :: 5
+IDB_HIST_SMALL_COLOR :: 8
+IDB_HIST_LARGE_COLOR :: 9
+
+STD_CUT        :: 0
+STD_COPY       :: 1
+STD_PASTE      :: 2
+STD_UNDO       :: 3
+STD_REDOW      :: 4
+STD_DELETE     :: 5
+STD_FILENEW    :: 6
+STD_FILEOPEN   :: 7
+STD_FILESAVE   :: 8
+STD_PRINTPRE   :: 9
+STD_PROPERTIES :: 10
+STD_HELP       :: 11
+STD_FIND       :: 12
+STD_REPLACE    :: 13
+STD_PRINT      :: 14
+
+VIEW_LARGEICONS    :: 0
+VIEW_SMALLICONS    :: 1
+VIEW_LIST          :: 2
+VIEW_DETAILS       :: 3
+VIEW_SORTNAME      :: 4
+VIEW_SORTSIZE      :: 5
+VIEW_SORTDATE      :: 6
+VIEW_SORTTYPE      :: 7
+VIEW_PARENTFOLDER  :: 8
+VIEW_NETCONNECT    :: 9
+VIEW_NETDISCONNECT :: 10
+VIEW_NEWFOLDER     :: 11
+VIEW_VIEWMENU      :: 12
+
+HIST_BACK           :: 0
+HIST_FORWARD        :: 1
+HIST_FAVORITES      :: 2
+HIST_ADDTOFAVORITES :: 3
+HIST_VIEWTREE       :: 4
+
+// Header Control Styles
+HDS_HORZ      :: 0x000
+HDS_BUTTONS   :: 0x002
+HDS_HOTTRACK  :: 0x004
+HDS_HIDDEN    :: 0x008
+HDS_DRAGDROP  :: 0x040
+HDS_FULLDRAG  :: 0x080
+HDS_FILTERBAR :: 0x100
+HDS_FLAT      :: 0x200
+
+// Header Control Notifications
+HDN_ITEMCHANGINGA    :: (HDN_FIRST-0)
+HDN_ITEMCHANGEDA     :: (HDN_FIRST-1)
+HDN_ITEMCLICKA       :: (HDN_FIRST-2)
+HDN_ITEMDBLCLICKA    :: (HDN_FIRST-3)
+HDN_DIVIDERDBLCLICKA :: (HDN_FIRST-5)
+HDN_BEGINTRACKA      :: (HDN_FIRST-6)
+HDN_ENDTRACKA        :: (HDN_FIRST-7)
+HDN_TRACKA           :: (HDN_FIRST-8)
+HDN_GETDISPINFOA     :: (HDN_FIRST-9)
+HDN_BEGINDRAG        :: (HDN_FIRST-10)
+HDN_ENDDRAG          :: (HDN_FIRST-11)
+HDN_FILTERCHANGE     :: (HDN_FIRST-12)
+HDN_FILTERBTNCLICK   :: (HDN_FIRST-13)
+HDN_ITEMCHANGINGW    :: (HDN_FIRST-20)
+HDN_ITEMCHANGEDW     :: (HDN_FIRST-21)
+HDN_ITEMCLICKW       :: (HDN_FIRST-22)
+HDN_ITEMDBLCLICKW    :: (HDN_FIRST-23)
+HDN_DIVIDERDBLCLICKW :: (HDN_FIRST-25)
+HDN_BEGINTRACKW      :: (HDN_FIRST-26)
+HDN_ENDTRACKW        :: (HDN_FIRST-27)
+HDN_TRACKW           :: (HDN_FIRST-28)
+HDN_GETDISPINFOW     :: (HDN_FIRST-29)
+
+// Header Control Constants
+HDFT_ISSTRING   :: 0x0000
+HDFT_ISNUMBER   :: 0x0001
+HDFT_HASNOVALUE :: 0x8000
+
+HDI_WIDTH      :: 0x001
+HDI_HEIGHT     :: HDI_WIDTH
+HDI_TEXT       :: 0x002
+HDI_FORMAT     :: 0x004
+HDI_LPARAM     :: 0x008
+HDI_BITMAP     :: 0x010
+HDI_IMAGE      :: 0x020
+HDI_DI_SETITEM :: 0x040
+HDI_ORDER      :: 0x080
+HDI_FILTER     :: 0x100
+
+HDF_LEFT            :: 0x0000000
+HDF_RIGHT           :: 0x0000001
+HDF_CENTER          :: 0x0000002
+HDF_JUSTIFYMASK     :: 0x0000003
+HDF_RTLREADING      :: 0x0000004
+HDF_CHECKBOX        :: 0x0000040
+HDF_CHECKED         :: 0x0000080
+HDF_FIXEDWIDTH      :: 0x0000100
+HDF_SORTDOWN        :: 0x0000200
+HDF_SORTUP          :: 0x0000400
+HDF_IMAGE           :: 0x0000800
+HDF_BITMAP_ON_RIGHT :: 0x0001000
+HDF_BITMAP          :: 0x0002000
+HDF_STRING          :: 0x0004000
+HDF_OWNERDRAW       :: 0x0008000
+HDF_SPLITBUTTON     :: 0x1000000
+
+HHT_NOWHERE        :: 0x001
+HHT_ONHEADER       :: 0x002
+HHT_ONDIVIDER      :: 0x004
+HHT_ONDIVOPEN      :: 0x008
+HHT_ONFILTER       :: 0x010
+HHT_ONFILTERBUTTON :: 0x020
+HHT_ABOVE          :: 0x100
+HHT_BELOW          :: 0x200
+HHT_TORIGHT        :: 0x400
+HHT_TOLEFT         :: 0x800
+
+// Rebar Control Styles
+RBS_TOOLTIPS        :: 0x0100
+RBS_VARHEIGHT       :: 0x0200
+RBS_BANDBORDERS     :: 0x0400
+RBS_FIXEDORDER      :: 0x0800
+RBS_REGISTERDROP    :: 0x1000
+RBS_AUTOSIZE        :: 0x2000
+RBS_VERTICALGRIPPER :: 0x4000
+RBS_DBLCLKTOGGLE    :: 0x8000
+
+// Tooltip Control Styles
+TTS_ALWAYSTIP :: 0x01
+TTS_NOPREFIX  :: 0x02
+TTS_NOANIMATE :: 0x10
+TTS_NOFADE    :: 0x20
+TTS_BALLOON   :: 0x40
+TTS_CLOSE     :: 0x80
+
+// Statusbar Control Styles
+SBARS_SIZEGRIP :: 0x100
+SBARS_TOOLTIPS :: 0x800
+
+// Statusbar Control Constants
+SBT_TOOLTIPS :: 0x800
+
+// Up-Down Control Styles
+UDS_WRAP        :: 0x001
+UDS_SETBUDDYINT :: 0x002
+UDS_ALIGNRIGHT  :: 0x004
+UDS_ALIGNLEFT   :: 0x008
+UDS_AUTOBUDDY   :: 0x010
+UDS_ARROWKEYS   :: 0x020
+UDS_HORZ        :: 0x040
+UDS_NOTHOUSANDS :: 0x080
+UDS_HOTTRACK    :: 0x100
+
+// Common Control Styles
+CCS_TOP           :: 0x01
+CCS_NOMOVEY       :: 0x02
+CCS_BOTTOM        :: 0x03
+CCS_NORESIZE      :: 0x04
+CCS_NOPARENTALIGN :: 0x08
+CCS_ADJUSTABLE    :: 0x20
+CCS_NODIVIDER     :: 0x40
+CCS_VERT          :: 0x80
+CCS_LEFT          :: (CCS_VERT | CCS_TOP)
+CCS_RIGHT         :: (CCS_VERT | CCS_BOTTOM)
+CCS_NOMOVEX       :: (CCS_VERT | CCS_NOMOVEY)
+
+// List-View Control Styles
+LVS_ICON            :: 0x0000
+LVS_REPORT          :: 0x0001
+LVS_SMALLICON       :: 0x0002
+LVS_LIST            :: 0x0003
+LVS_TYPEMASK        :: 0x0003
+LVS_SINGLESEL       :: 0x0004
+LVS_SHOWSELALWAYS   :: 0x0008
+LVS_SORTASCENDING   :: 0x0010
+LVS_SORTDESCENDING  :: 0x0020
+LVS_SHAREIMAGELISTS :: 0x0040
+LVS_NOLABELWRAP     :: 0x0080
+LVS_AUTOARRANGE     :: 0x0100
+LVS_EDITLABELS      :: 0x0200
+LVS_OWNERDATA       :: 0x1000
+LVS_NOSCROLL        :: 0x2000
+LVS_TYPESTYLEMASK   :: 0xFC00
+LVS_ALIGNTOP        :: 0x0000
+LVS_ALIGNLEFT       :: 0x0800
+LVS_ALIGNMASK       :: 0x0C00
+LVS_OWNERDRAWFIXED  :: 0x0400
+LVS_NOCOLUMNHEADER  :: 0x4000
+LVS_NOSORTHEADER    :: 0x8000
+
+// Tree-View Control Styles
+TVS_HASBUTTONS      :: 0x0001
+TVS_HASLINES        :: 0x0002
+TVS_LINESATROOT     :: 0x0004
+TVS_EDITLABELS      :: 0x0008
+TVS_DISABLEDRAGDROP :: 0x0010
+TVS_SHOWSELALWAYS   :: 0x0020
+TVS_RTLREADING      :: 0x0040
+TVS_NOTOOLTIPS      :: 0x0080
+TVS_CHECKBOXES      :: 0x0100
+TVS_TRACKSELECT     :: 0x0200
+TVS_SINGLEEXPAND    :: 0x0400
+TVS_INFOTIP         :: 0x0800
+TVS_FULLROWSELECT   :: 0x1000
+TVS_NOSCROLL        :: 0x2000
+TVS_NONEVENHEIGHT   :: 0x4000
+TVS_NOHSCROLL       :: 0x8000
+
+// Tree-View Control Constants
+TVE_COLLAPSE      :: 0x0001
+TVE_EXPAND        :: 0x0002
+TVE_TOGGLE        :: 0x0003
+TVE_EXPANDPARTIAL :: 0x4000
+TVE_COLLAPSERESET :: 0x8000
+
+TVSIL_NORMAL :: 0
+TVSIL_STATE  :: 2
+
+TVGN_ROOT            :: 0x0
+TVGN_NEXT            :: 0x1
+TVGN_PREVIOUS        :: 0x2
+TVGN_PARENT          :: 0x3
+TVGN_CHILD           :: 0x4
+TVGN_FIRSTVISIBLE    :: 0x5
+TVGN_NEXTVISIBLE     :: 0x6
+TVGN_PREVIOUSVISIBLE :: 0x7
+TVGN_DROPHILITE      :: 0x8
+TVGN_CARET           :: 0x9
+TVGN_LASTVISIBLE     :: 0xA
+
+TVSI_NOSINGLEEXPAND :: 0x8000
+
+TVHT_NOWHERE         :: 0x001
+TVHT_ONITEMICON      :: 0x002
+TVHT_ONITEMLABEL     :: 0x004
+TVHT_ONITEM          :: (TVHT_ONITEMICON | TVHT_ONITEMLABEL | TVHT_ONITEMSTATEICON)
+TVHT_ONITEMINDENT    :: 0x008
+TVHT_ONITEMBUTTON    :: 0x010
+TVHT_ONITEMRIGHT     :: 0x020
+TVHT_ONITEMSTATEICON :: 0x040
+TVHT_ABOVE           :: 0x100
+TVHT_BELOW           :: 0x200
+TVHT_TORIGHT         :: 0x400
+TVHT_TOLEFT          :: 0x800
+
+// Tab Control Styles
+TCS_SCROLLOPPOSITE    :: 0x0001
+TCS_BOTTOM            :: 0x0002
+TCS_RIGHT             :: 0x0002
+TCS_MULTISELECT       :: 0x0004
+TCS_FLATBUTTONS       :: 0x0008
+TCS_FORCEICONLEFT     :: 0x0010
+TCS_FORCELABELLEFT    :: 0x0020
+TCS_HOTTRACK          :: 0x0040
+TCS_VERTICAL          :: 0x0080
+TCS_TABS              :: 0x0000
+TCS_BUTTONS           :: 0x0100
+TCS_SINGLELINE        :: 0x0000
+TCS_MULTILINE         :: 0x0200
+TCS_RIGHTJUSTIFY      :: 0x0000
+TCS_FIXEDWIDTH        :: 0x0400
+TCS_RAGGEDRIGHT       :: 0x0800
+TCS_FOCUSONBUTTONDOWN :: 0x1000
+TCS_OWNERDRAWFIXED    :: 0x2000
+TCS_TOOLTIPS          :: 0x4000
+TCS_FOCUSNEVER        :: 0x8000
+
+// Tab Control Constants
+TCIF_TEXT       :: 0x01
+TCIF_IMAGE      :: 0x02
+TCIF_RTLREADING :: 0x04
+TCIF_PARAM      :: 0x08
+TCIF_STATE      :: 0x10
+
+TCIS_BUTTONPRESSED :: 0x1
+TCIS_HIGHLIGHTED   :: 0x2
+
+TCHT_NOWHERE     :: 0x1
+TCHT_ONITEMICON  :: 0x2
+TCHT_ONITEMLABEL :: 0x4
+TCHT_ONITEM      :: (TCHT_ONITEMICON | TCHT_ONITEMLABEL)
+
+// Animation Control Styles
+ACS_CENTER      :: 0x1
+ACS_TRANSPARENT :: 0x2
+ACS_AUTOPLAY    :: 0x4
+ACS_TIMER       :: 0x8
+
+// Month-Calendar Control Styles
+MCS_DAYSTATE      :: 0x01
+MCS_MULTISELECT   :: 0x02
+MCS_WEEKNUMBERS   :: 0x04
+MCS_NOTODAYCIRCLE :: 0x08
+MCS_NOTODAY       :: 0x10
+
+// Date-and-Time Picker Control Styles
+DTS_UPDOWN                 :: 0x01
+DTS_SHOWNONE               :: 0x02
+DTS_SHORTDATEFORMAT        :: 0x00
+DTS_LONGDATEFORMAT         :: 0x04
+DTS_SHORTDATECENTURYFORMAT :: 0x0C
+DTS_TIMEFORMAT             :: 0x09
+DTS_APPCANPARSE            :: 0x10
+DTS_RIGHTALIGN             :: 0x20
+
+// Pager Control Styles
+PGS_VERT       :: 0x0
+PGS_HORZ       :: 0x1
+PGS_AUTOSCROLL :: 0x2
+PGS_DRAGNDROP  :: 0x4
+
+// Native Font Control Styles
+NFS_EDIT         :: 0x01
+NFS_STATIC       :: 0x02
+NFS_LISTCOMBO    :: 0x04
+NFS_BUTTON       :: 0x08
+NFS_ALL          :: 0x10
+NFS_USEFONTASSOC :: 0x20
+
 // Font Weights
 FW_DONTCARE   :: 0
 FW_THIN       :: 100
@@ -1206,6 +1659,16 @@ NMHDR :: struct {
 	code:     UINT,      // NM_ code
 }
 
+NMCUSTOMDRAW :: struct {
+	hdr: NMHDR,
+	dwDrawStage: DWORD,
+	hdc: HDC,
+	rc: RECT,
+	dwItemSpec: DWORD_PTR,
+	uItemState: UINT,
+	lItemlParam: LPARAM,
+}
+
 NCCALCSIZE_PARAMS :: struct {
 	rgrc: [3]RECT,
 	lppos: PWINDOWPOS,

+ 170 - 0
core/sys/windows/window_messages.odin

@@ -687,10 +687,14 @@ EM_GETAUTOURLDETECT               :: 0x045c
 TB_GETSTRINGA                     :: 0x045c
 EM_SETPALETTE                     :: 0x045d
 EM_GETTEXTEX                      :: 0x045e
+TB_SETHOTITEM2                    :: 0x045e
 EM_GETTEXTLENGTHEX                :: 0x045f
 EM_SHOWSCROLLBAR                  :: 0x0460
+TB_SETLISTGAP                     :: 0x0460
 EM_SETTEXTEX                      :: 0x0461
+TB_GETIMAGELISTCOUNT              :: 0x0462
 TAPI_REPLY                        :: 0x0463
+TB_GETIDEALSIZE                   :: 0x0463
 ACM_OPENA                         :: 0x0464
 BFFM_SETSTATUSTEXTA               :: 0x0464
 CDM_FIRST                         :: 0x0464
@@ -704,6 +708,7 @@ CDM_GETFILEPATH                   :: 0x0465
 EM_GETPUNCTUATION                 :: 0x0465
 IPM_SETADDRESS                    :: 0x0465
 PSM_SETCURSEL                     :: 0x0465
+TB_GETMETRICS                     :: 0x0465
 UDM_SETRANGE                      :: 0x0465
 WM_CHOOSEFONT_SETLOGFONT          :: 0x0465
 ACM_STOP                          :: 0x0466
@@ -712,6 +717,7 @@ CDM_GETFOLDERPATH                 :: 0x0466
 EM_SETWORDWRAPMODE                :: 0x0466
 IPM_GETADDRESS                    :: 0x0466
 PSM_REMOVEPAGE                    :: 0x0466
+TB_SETMETRICS                     :: 0x0466
 UDM_GETRANGE                      :: 0x0466
 WM_CAP_SET_CALLBACK_ERRORW        :: 0x0466
 WM_CHOOSEFONT_SETFLAGS            :: 0x0466
@@ -721,6 +727,7 @@ CDM_GETFOLDERIDLIST               :: 0x0467
 EM_GETWORDWRAPMODE                :: 0x0467
 IPM_SETRANGE                      :: 0x0467
 PSM_ADDPAGE                       :: 0x0467
+TB_GETITEMDROPDOWNRECT            :: 0x0467
 UDM_SETPOS                        :: 0x0467
 WM_CAP_SET_CALLBACK_STATUSW       :: 0x0467
 BFFM_SETSTATUSTEXTW               :: 0x0468
@@ -728,11 +735,13 @@ CDM_SETCONTROLTEXT                :: 0x0468
 EM_SETIMECOLOR                    :: 0x0468
 IPM_SETFOCUS                      :: 0x0468
 PSM_CHANGED                       :: 0x0468
+TB_SETPRESSEDIMAGELIST            :: 0x0468
 UDM_GETPOS                        :: 0x0468
 CDM_HIDECONTROL                   :: 0x0469
 EM_GETIMECOLOR                    :: 0x0469
 IPM_ISBLANK                       :: 0x0469
 PSM_RESTARTWINDOWS                :: 0x0469
+TB_GETPRESSEDIMAGELIST            :: 0x0469
 UDM_SETBUDDY                      :: 0x0469
 CDM_SETDEFEXT                     :: 0x046a
 EM_SETIMEOPTIONS                  :: 0x046a
@@ -915,6 +924,10 @@ FM_GETDRIVEINFOW                  :: 0x0611
 FM_GETFILESELW                    :: 0x0614
 FM_GETFILESELLFNW                 :: 0x0615
 WLX_WM_SAS                        :: 0x0659
+LM_HITTEST                        :: 0x0700
+LM_GETIDEALHEIGHT                 :: 0x0701
+LM_SETITEM                        :: 0x0702
+LM_GETITEM                        :: 0x0703
 SM_GETSELCOUNT                    :: 0x07e8
 UM_GETSELCOUNT                    :: 0x07e8
 WM_CPL_LAUNCH                     :: 0x07e8
@@ -1011,6 +1024,7 @@ LVM_GETITEMW                      :: 0x104b
 LVM_SETITEMW                      :: 0x104c
 LVM_INSERTITEMW                   :: 0x104d
 LVM_GETTOOLTIPS                   :: 0x104e
+LVM_SORTITEMSEX                   :: 0x1051
 LVM_FINDITEMW                     :: 0x1053
 LVM_GETSTRINGWIDTHW               :: 0x1057
 LVM_GETCOLUMNW                    :: 0x105f
@@ -1065,7 +1079,143 @@ LVM_GETFOOTERITEM                 :: 0x10d0
 LVM_GETITEMINDEXRECT              :: 0x10d1
 LVM_SETITEMINDEXSTATE             :: 0x10d2
 LVM_GETNEXTITEMINDEX              :: 0x10d3
+TV_FIRST                          :: 0x1100
+TVM_INSERTITEMA                   :: (TV_FIRST+0)
+TVM_DELETEITEM                    :: (TV_FIRST+1)
+TVM_EXPAND                        :: (TV_FIRST+2)
+TVM_GETITEMRECT                   :: (TV_FIRST+4)
+TVM_GETCOUNT                      :: (TV_FIRST+5)
+TVM_GETINDENT                     :: (TV_FIRST+6)
+TVM_SETINDENT                     :: (TV_FIRST+7)
+TVM_GETIMAGELIST                  :: (TV_FIRST+8)
+TVM_SETIMAGELIST                  :: (TV_FIRST+9)
+TVM_GETNEXTITEM                   :: (TV_FIRST+10)
+TVM_SELECTITEM                    :: (TV_FIRST+11)
+TVM_GETITEMA                      :: (TV_FIRST+12)
+TVM_SETITEMA                      :: (TV_FIRST+13)
+TVM_EDITLABELA                    :: (TV_FIRST+14)
+TVM_GETEDITCONTROL                :: (TV_FIRST+15)
+TVM_GETVISIBLECOUNT               :: (TV_FIRST+16)
+TVM_HITTEST                       :: (TV_FIRST+17)
+TVM_CREATEDRAGIMAGE               :: (TV_FIRST+18)
+TVM_SORTCHILDREN                  :: (TV_FIRST+19)
+TVM_ENSUREVISIBLE                 :: (TV_FIRST+20)
+TVM_SORTCHILDRENCB                :: (TV_FIRST+21)
+TVM_ENDEDITLABELNOW               :: (TV_FIRST+22)
+TVM_GETISEARCHSTRINGA             :: (TV_FIRST+23)
+TVM_SETTOOLTIPS                   :: (TV_FIRST+24)
+TVM_GETTOOLTIPS                   :: (TV_FIRST+25)
+TVM_SETINSERTMARK                 :: (TV_FIRST+26)
+TVM_SETUNICODEFORMAT              :: CCM_SETUNICODEFORMAT
+TVM_GETUNICODEFORMAT              :: CCM_GETUNICODEFORMAT
+TVM_SETITEMHEIGHT                 :: (TV_FIRST+27)
+TVM_GETITEMHEIGHT                 :: (TV_FIRST+28)
+TVM_SETBKCOLOR                    :: (TV_FIRST+29)
+TVM_SETTEXTCOLOR                  :: (TV_FIRST+30)
+TVM_GETBKCOLOR                    :: (TV_FIRST+31)
+TVM_GETTEXTCOLOR                  :: (TV_FIRST+32)
+TVM_SETSCROLLTIME                 :: (TV_FIRST+33)
+TVM_GETSCROLLTIME                 :: (TV_FIRST+34)
+TVM_SETINSERTMARKCOLOR            :: (TV_FIRST+37)
+TVM_GETINSERTMARKCOLOR            :: (TV_FIRST+38)
+TVM_GETITEMSTATE                  :: (TV_FIRST+39)
+TVM_SETLINECOLOR                  :: (TV_FIRST+40)
+TVM_GETLINECOLOR                  :: (TV_FIRST+41)
+TVM_MAPACCIDTOHTREEITEM           :: (TV_FIRST+42)
+TVM_MAPHTREEITEMTOACCID           :: (TV_FIRST+43)
+TVM_INSERTITEMW                   :: (TV_FIRST+50)
+TVM_GETITEMW                      :: (TV_FIRST+62)
+TVM_SETITEMW                      :: (TV_FIRST+63)
+TVM_GETISEARCHSTRINGW             :: (TV_FIRST+64)
+TVM_EDITLABELW                    :: (TV_FIRST+65)
+HDM_FIRST                         :: 0x1200
+HDM_GETITEMCOUNT                  :: (HDM_FIRST+0)
+HDM_INSERTITEMA                   :: (HDM_FIRST+1)
+HDM_DELETEITEM                    :: (HDM_FIRST+2)
+HDM_GETITEMA                      :: (HDM_FIRST+3)
+HDM_SETITEMA                      :: (HDM_FIRST+4)
+HDM_LAYOUT                        :: (HDM_FIRST+5)
+HDM_HITTEST                       :: (HDM_FIRST+6)
+HDM_GETITEMRECT                   :: (HDM_FIRST+7)
+HDM_SETIMAGELIST                  :: (HDM_FIRST+8)
+HDM_GETIMAGELIST                  :: (HDM_FIRST+9)
+HDM_INSERTITEMW                   :: (HDM_FIRST+10)
+HDM_GETITEMW                      :: (HDM_FIRST+11)
+HDM_SETITEMW                      :: (HDM_FIRST+12)
+HDM_ORDERTOINDEX                  :: (HDM_FIRST+15)
+HDM_CREATEDRAGIMAGE               :: (HDM_FIRST+16)
+HDM_GETORDERARRAY                 :: (HDM_FIRST+17)
+HDM_SETORDERARRAY                 :: (HDM_FIRST+18)
+HDM_SETHOTDIVIDER                 :: (HDM_FIRST+19)
+HDM_SETBITMAPMARGIN               :: (HDM_FIRST+20)
+HDM_GETBITMAPMARGIN               :: (HDM_FIRST+21)
+HDM_SETFILTERCHANGETIMEOUT        :: (HDM_FIRST+22)
+HDM_SETUNICODEFORMAT              :: CCM_SETUNICODEFORMAT
+HDM_GETUNICODEFORMAT              :: CCM_GETUNICODEFORMAT
+HDM_EDITFILTER                    :: (HDM_FIRST+23)
+HDM_CLEARFILTER                   :: (HDM_FIRST+24)
+TCM_FIRST                         :: 0x1300
+TCM_GETIMAGELIST                  :: (TCM_FIRST+2)
+TCM_SETIMAGELIST                  :: (TCM_FIRST+3)
+TCM_GETITEMCOUNT                  :: (TCM_FIRST+4)
+TCM_GETITEMA                      :: (TCM_FIRST+5)
+TCM_SETITEMA                      :: (TCM_FIRST+6)
+TCM_INSERTITEMA                   :: (TCM_FIRST+7)
+TCM_DELETEITEM                    :: (TCM_FIRST+8)
+TCM_DELETEALLITEMS                :: (TCM_FIRST+9)
+TCM_GETITEMRECT                   :: (TCM_FIRST+10)
+TCM_GETCURSEL                     :: (TCM_FIRST+11)
+TCM_SETCURSEL                     :: (TCM_FIRST+12)
+TCM_HITTEST                       :: (TCM_FIRST+13)
+TCM_SETITEMEXTRA                  :: (TCM_FIRST+14)
+TCM_ADJUSTRECT                    :: (TCM_FIRST+40)
+TCM_SETITEMSIZE                   :: (TCM_FIRST+41)
+TCM_REMOVEIMAGE                   :: (TCM_FIRST+42)
+TCM_SETPADDING                    :: (TCM_FIRST+43)
+TCM_GETROWCOUNT                   :: (TCM_FIRST+44)
+TCM_GETTOOLTIPS                   :: (TCM_FIRST+45)
+TCM_SETTOOLTIPS                   :: (TCM_FIRST+46)
+TCM_GETCURFOCUS                   :: (TCM_FIRST+47)
+TCM_SETCURFOCUS                   :: (TCM_FIRST+48)
+TCM_SETMINTABWIDTH                :: (TCM_FIRST+49)
+TCM_DESELECTALL                   :: (TCM_FIRST+50)
+TCM_HIGHLIGHTITEM                 :: (TCM_FIRST+51)
+TCM_SETEXTENDEDSTYLE              :: (TCM_FIRST+52)
+TCM_GETEXTENDEDSTYLE              :: (TCM_FIRST+53)
+TCM_SETUNICODEFORMAT              :: CCM_SETUNICODEFORMAT
+TCM_GETUNICODEFORMAT              :: CCM_GETUNICODEFORMAT
+TCM_GETITEMW                      :: (TCM_FIRST+60)
+TCM_SETITEMW                      :: (TCM_FIRST+61)
+TCM_INSERTITEMW                   :: (TCM_FIRST+62)
+PGM_FIRST                         :: 0x1400
+PGM_SETCHILD                      :: (PGM_FIRST+1)
+PGM_RECALCSIZE                    :: (PGM_FIRST+2)
+PGM_FORWARDMOUSE                  :: (PGM_FIRST+3)
+PGM_SETBKCOLOR                    :: (PGM_FIRST+4)
+PGM_GETBKCOLOR                    :: (PGM_FIRST+5)
+PGM_SETBORDER                     :: (PGM_FIRST+6)
+PGM_GETBORDER                     :: (PGM_FIRST+7)
+PGM_SETPOS                        :: (PGM_FIRST+8)
+PGM_GETPOS                        :: (PGM_FIRST+9)
+PGM_SETBUTTONSIZE                 :: (PGM_FIRST+10)
+PGM_GETBUTTONSIZE                 :: (PGM_FIRST+11)
+PGM_GETBUTTONSTATE                :: (PGM_FIRST+12)
+PGM_GETDROPTARGET                 :: CCM_GETDROPTARGET
+ECM_FIRST                         :: 0x1500
+EM_SETCUEBANNER                   :: ECM_FIRST + 0x0001
+EM_GETCUEBANNER                   :: ECM_FIRST + 0x0002
+EM_SHOWBALLOONTIP                 :: ECM_FIRST + 0x0003
+EM_HIDEBALLOONTIP                 :: ECM_FIRST + 0x0004
+EM_SETHILITE                      :: ECM_FIRST + 0x0005
+EM_GETHILITE                      :: ECM_FIRST + 0x0006
+EM_NOSETFOCUS                     :: ECM_FIRST + 0x0007
+EM_TAKEFOCUS                      :: ECM_FIRST + 0x0008
 BCM_FIRST                         :: 0x1600
+BCM_GETIDEALSIZE                  :: BCM_FIRST + 0x0001
+BCM_SETIMAGELIST                  :: BCM_FIRST + 0x0002
+BCM_GETIMAGELIST                  :: BCM_FIRST + 0x0003
+BCM_SETTEXTMARGIN                 :: BCM_FIRST + 0x0004
+BCM_GETTEXTMARGIN                 :: BCM_FIRST + 0x0005
 BCM_SETDROPDOWNSTATE              :: BCM_FIRST + 0x0006
 BCM_SETSPLITINFO                  :: BCM_FIRST + 0x0007
 BCM_GETSPLITINFO                  :: BCM_FIRST + 0x0008
@@ -1073,9 +1223,29 @@ BCM_SETNOTE                       :: BCM_FIRST + 0x0009
 BCM_GETNOTE                       :: BCM_FIRST + 0x000A
 BCM_GETNOTELENGTH                 :: BCM_FIRST + 0x000B
 BCM_SETSHIELD                     :: BCM_FIRST + 0x000C
+CBM_FIRST                         :: 0x1700
+CB_SETMINVISIBLE                  :: CBM_FIRST + 0x0001
+CB_GETMINVISIBLE                  :: CBM_FIRST + 0x0002
+CCM_FIRST                         :: 0x2000
+CCM_LAST                          :: (CCM_FIRST+0x200)
+CCM_SETBKCOLOR                    :: (CCM_FIRST+1)
+CCM_SETCOLORSCHEME                :: (CCM_FIRST+2)
+CCM_GETCOLORSCHEME                :: (CCM_FIRST+3)
+CCM_GETDROPTARGET                 :: (CCM_FIRST+4)
+CCM_SETUNICODEFORMAT              :: (CCM_FIRST+5)
+CCM_GETUNICODEFORMAT              :: (CCM_FIRST+6)
+CCM_SETVERSION                    :: (CCM_FIRST+7)
+CCM_GETVERSION                    :: (CCM_FIRST+8)
+CCM_SETNOTIFYWINDOW               :: (CCM_FIRST+9)
+CCM_SETWINDOWTHEME                :: (CCM_FIRST+11)
+CCM_DPISCALE                      :: (CCM_FIRST+12)
 OCM__BASE                         :: 0x2000
 LVM_SETUNICODEFORMAT              :: 0x2005
+SB_SETUNICODEFORMAT               :: 0x2005
 LVM_GETUNICODEFORMAT              :: 0x2006
+SB_GETUNICODEFORMAT               :: 0x2006
+CBEM_SETWINDOWTHEME               :: 0x200b
+TB_SETWINDOWTHEME                 :: 0x200b
 OCM_CTLCOLOR                      :: 0x2019
 OCM_DRAWITEM                      :: 0x202b
 OCM_MEASUREITEM                   :: 0x202c