/***********************************************************************\
*                               commctrl.d                              *
*                                                                       *
*                       Windows API header module                       *
*                                                                       *
*             Translated from MinGW API for MS-Windows 3.12             *
*                                                                       *
*                       Placed into public domain                       *
\***********************************************************************/
module win32.commctrl;
pragma(lib, "comctl32.lib");

private import win32.w32api, win32.windef, win32.winuser;
private import win32.winbase; // for SYSTEMTIME
private import win32.objfwd;  // for LPSTREAM

import win32.prsht;

const COMCTL32_VERSION = 6;

const TCHAR[]
	DRAGLISTMSGSTRING  = "commctrl_DragListMsg",
	HOTKEY_CLASS       = "msctls_hotkey32",
	PROGRESS_CLASS     = "msctls_progress32",
	STATUSCLASSNAME    = "msctls_statusbar32",
	TOOLBARCLASSNAME   = "ToolbarWindow32",
	TOOLTIPS_CLASS     = "tooltips_class32",
	TRACKBAR_CLASS     = "msctls_trackbar32",
	UPDOWN_CLASS       = "msctls_updown32",
	ANIMATE_CLASS      = "SysAnimate32",
	DATETIMEPICK_CLASS = "SysDateTimePick32",
	MONTHCAL_CLASS     = "SysMonthCal32",
	REBARCLASSNAME     = "ReBarWindow32",
	WC_COMBOBOXEX      = "ComboBoxEx32",
	WC_IPADDRESS       = "SysIPAddress32",
	WC_LISTVIEW        = "SysListView32",
	WC_TABCONTROL      = "SysTabControl32",
	WC_TREEVIEW        = "SysTreeView32",
	WC_HEADER          = "SysHeader32",
	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_LINKA           = "SysLink";

enum {
	LVM_FIRST = 0x1000,
	TV_FIRST  = 0x1100,
	HDM_FIRST = 0x1200
}

enum {
	ACM_OPENA = WM_USER + 100,
	ACM_PLAY  = WM_USER + 101,
	ACM_STOP  = WM_USER + 102,
	ACM_OPENW = WM_USER + 103
}

enum {
	ACN_START = 1,
	ACN_STOP
}

enum {
	CBEIF_TEXT          = 0x00000001,
	CBEIF_IMAGE         = 0x00000002,
	CBEIF_SELECTEDIMAGE = 0x00000004,
	CBEIF_OVERLAY       = 0x00000008,
	CBEIF_INDENT        = 0x00000010,
	CBEIF_LPARAM        = 0x00000020,
	CBEIF_DI_SETITEM    = 0x10000000
}

enum {
	RBN_FIRST  = -831U,
	RBN_LAST   = -859U,
	MCN_FIRST  = -750U,
	MCN_LAST   = -759U,
	DTN_FIRST  = -760U,
	DTN_LAST   = -799U,
	CBEN_FIRST = -800U,
	CBEN_LAST  = -830U
}

enum {
	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
}

enum {
	CBENF_KILLFOCUS = 1,
	CBENF_RETURN,
	CBENF_ESCAPE,
	CBENF_DROPDOWN // = 4
}

const CBEMAXSTRLEN = 260;

enum {
	DL_BEGINDRAG  = 1157,
	DL_CANCELDRAG = 1160,
	DL_DRAGGING   = 1158,
	DL_DROPPED    = 1159,
	DL_CURSORSET  = 0,
	DL_STOPCURSOR = 1,
	DL_COPYCURSOR = 2,
	DL_MOVECURSOR = 3
}

enum {
	CCS_TOP           = 1,
	CCS_NOMOVEY       = 2,
	CCS_BOTTOM        = 3,
	CCS_NORESIZE      = 4,
	CCS_NOPARENTALIGN = 8,
	CCS_ADJUSTABLE    = 32,
	CCS_NODIVIDER     = 64
}
static if (_WIN32_IE >= 0x300) {
	enum {
		CCS_VERT    = 128,
		CCS_LEFT    = 129,
		CCS_NOMOVEX = 130,
		CCS_RIGHT   = 131
	}
}

enum {
	ACS_CENTER      = 0x0001,
	ACS_TRANSPARENT = 0x0002,
	ACS_AUTOPLAY    = 0x0004,
	ACS_TIMER       = 0x0008
}

enum {
	PGS_VERT       = 0x00000000,
	PGS_HORZ       = 0x00000001,
	PGS_AUTOSCROLL = 0x00000002,
	PGS_DRAGNDROP  = 0x00000004
}

const CMB_MASKED = 2;

const MINSYSCOMMAND = SC_SIZE;

enum {
	SBT_OWNERDRAW  = 0x1000,
	SBT_NOBORDERS  = 256,
	SBT_POPOUT     = 512,
	SBT_RTLREADING = 1024
}

enum {
	SB_SETTEXTA       = WM_USER + 1,
	SB_SETTEXTW       = WM_USER + 11,
	SB_GETTEXTA       = WM_USER + 2,
	SB_GETTEXTW       = WM_USER + 13,
	SB_GETTEXTLENGTHA = WM_USER + 3,
	SB_GETTEXTLENGTHW = WM_USER + 12,
	SB_SETPARTS       = WM_USER + 4,
	SB_GETPARTS       = WM_USER + 6,
	SB_GETBORDERS     = WM_USER + 7,
	SB_SETMINHEIGHT   = WM_USER + 8,
	SB_SIMPLE         = WM_USER + 9,
	SB_GETRECT        = WM_USER + 10
}

enum {
	MSGF_COMMCTRL_BEGINDRAG   = 0x4200,
	MSGF_COMMCTRL_SIZEHEADER  = 0x4201,
	MSGF_COMMCTRL_DRAGSELECT  = 0x4202,
	MSGF_COMMCTRL_TOOLBARCUST = 0x4203
}

enum {
	ILC_COLOR    = 0,
	ILC_COLOR4   = 4,
	ILC_COLOR8   = 8,
	ILC_COLOR16  = 16,
	ILC_COLOR24  = 24,
	ILC_COLOR32  = 32,
	ILC_COLORDDB = 254,
	ILC_MASK     = 1,
	ILC_PALETTE  = 2048
}

enum {
	ILCF_MOVE,
	ILCF_SWAP
}

enum {
	ILS_NORMAL        = 0,
	ILS_GLOW          = 1,
	ILS_SHADOW        = 2,
	ILS_SATURATE      = 4,
	ILS_ALPHA         = 8,
	ILD_BLEND25       = 2,
	ILD_BLEND50       = 4,
	ILD_SELECTED      = 4,
	ILD_BLEND         = 4,
	ILD_FOCUS         = 2,
	ILD_MASK          = 16,
	ILD_NORMAL        = 0,
	ILD_TRANSPARENT   = 1,
	ILD_IMAGE         = 0x0020,
	ILD_ROP           = 0x0040,
	ILD_OVERLAYMASK   = 0x0F00,
	ILD_PRESERVEALPHA = 0x1000,
	ILD_SCALE         = 0x2000,
	ILD_DPISCALE      = 0x4000
}

enum {
	HDS_HORZ    = 0,
	HDS_BUTTONS = 2,
	HDS_HIDDEN  = 8
}
static if (_WIN32_IE >= 0x400) {
	enum {
		HDS_HOTTRACK = 4,
		HDS_DRAGDROP = 0x0040,
		HDS_FULLDRAG = 0x0080
	}
}
static if (_WIN32_IE >= 0x500) {
	enum {
		HDS_FILTERBAR = 0x0100
	}
}

enum {
	NM_FIRST  = 0,
	NM_LAST   = -99U,
	LVN_FIRST = -100U,
	LVN_LAST  = -199U,
	HDN_FIRST = -300U,
	HDN_LAST  = -399U,
	TVN_FIRST = -400U,
	TVN_LAST  = -499U,
	TTN_FIRST = -520U,
	TTN_LAST  = -549U,
	TCN_FIRST = -550U,
	TCN_LAST  = -580U,
	CDN_FIRST = -601U, /* also in commdlg.h */
	CDN_LAST  = -699U,
	TBN_FIRST = -700U,
	TBN_LAST  = -720U,
	UDN_FIRST = -721U,
	UDN_LAST  = -740U
}
/*static if (_WIN32_IE >= 0x300) {
	enum {
		RBN_FIRST  = -831U,
		RBN_LAST   = -859U,
		MCN_FIRST  = -750U,
		MCN_LAST   = -759U,
		DTN_FIRST  = -760U,
		DTN_LAST   = -799U,
		CBEN_FIRST = -800U,
		CBEN_LAST  = -830U
	}
}*/
static if (_WIN32_IE >= 0x400) {
	enum {
		IPN_FIRST        = -860U,
		IPN_LAST         = -879U,
		IPN_FIELDCHANGED = IPN_FIRST,
		SBN_FIRST        = -880U,
		SBN_LAST         = -899U,
		PGN_FIRST        = -900U,
		PGN_LAST         = -950U,
		PGN_SCROLL       = PGN_FIRST-1,
		PGN_CALCSIZE     = PGN_FIRST-2
	}
}

enum {
	HDI_WIDTH  = 1,
	HDI_HEIGHT = 1,
	HDI_TEXT   = 2,
	HDI_FORMAT = 4,
	HDI_LPARAM = 8,
	HDI_BITMAP = 16
}
static if (_WIN32_IE >= 0x300) {
	enum {
		HDI_IMAGE      = 32,
		HDI_DI_SETITEM = 64,
		HDI_ORDER      = 128
	}
}
static if (_WIN32_IE >= 0x500) {
	enum {
		HDI_FILTER = 256
	}
}

enum {
	CBES_EX_NOEDITIMAGE       = 0x00000001,
	CBES_EX_NOEDITIMAGEINDENT = 0x00000002,
	CBES_EX_PATHWORDBREAKPROC = 0x00000004
}
static if (_WIN32_IE >= 0x400) {
	enum {
		CBES_EX_NOSIZELIMIT   = 0x00000008,
		CBES_EX_CASESENSITIVE = 0x00000010,
		CBEN_GETDISPINFOA     = CBEN_FIRST - 0,
		CBEN_GETDISPINFOW     = CBEN_FIRST - 7,
		CBEN_DRAGBEGINA       = CBEN_FIRST - 8,
		CBEN_DRAGBEGINW       = CBEN_FIRST - 9
	}
}

enum {
	HDF_LEFT,
	HDF_RIGHT,
	HDF_CENTER,
	HDF_JUSTIFYMASK,
	HDF_RTLREADING, // = 4
	HDF_OWNERDRAW = 0x8000,
	HDF_STRING    = 0x4000,
	HDF_BITMAP    = 0x2000
}
static if (_WIN32_IE >= 0x300) {
	enum {
		HDF_BITMAP_ON_RIGHT = 0x1000,
		HDF_IMAGE           = 0x0800
	}
}

enum {
	CCM_FIRST            = 0x2000,
	CCM_LAST             = CCM_FIRST + 0x200,
	CCM_SETBKCOLOR       = 8193,
	CCM_SETCOLORSCHEME   = 8194,
	CCM_GETCOLORSCHEME   = 8195,
	CCM_GETDROPTARGET    = 8196,
	CCM_SETUNICODEFORMAT = 8197,
	CCM_GETUNICODEFORMAT = 8198,
	CCM_SETVERSION       = 0x2007,
	CCM_GETVERSION       = 0x2008,
	CCM_SETNOTIFYWINDOW  = 0x2009
}

enum {
	HDM_GETITEMCOUNT = HDM_FIRST,
	HDM_INSERTITEMA  = HDM_FIRST + 1,
	HDM_INSERTITEMW  = HDM_FIRST + 10,
	HDM_DELETEITEM   = HDM_FIRST + 2,
	HDM_GETITEMA     = HDM_FIRST + 3,
	HDM_GETITEMW     = HDM_FIRST + 11,
	HDM_SETITEMA     = HDM_FIRST + 4,
	HDM_SETITEMW     = HDM_FIRST + 12,
	HDM_LAYOUT       = HDM_FIRST + 5
}
static if (_WIN32_IE >= 0x300) {
	enum {
		HDM_GETITEMRECT     = HDM_FIRST + 7,
		HDM_SETIMAGELIST    = HDM_FIRST + 8,
		HDM_GETIMAGELIST    = HDM_FIRST + 9,
		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
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		HDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
		HDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
	}
}

enum {
	HHT_NOWHERE   = 1,
	HHT_ONHEADER  = 2,
	HHT_ONDIVIDER = 4,
	HHT_ONDIVOPEN = 8,
	HHT_ABOVE     = 256,
	HHT_BELOW     = 512,
	HHT_TORIGHT   = 1024,
	HHT_TOLEFT    = 2048
}

enum {
	HDM_HITTEST = HDM_FIRST + 6
}

enum {
	HDN_ITEMCHANGINGA    = HDN_FIRST -0,
	HDN_ITEMCHANGINGW    = HDN_FIRST -20,
	HDN_ITEMCHANGEDA     = HDN_FIRST -1,
	HDN_ITEMCHANGEDW     = HDN_FIRST -21,
	HDN_ITEMCLICKA       = HDN_FIRST -2,
	HDN_ITEMCLICKW       = HDN_FIRST -22,
	HDN_ITEMDBLCLICKA    = HDN_FIRST -3,
	HDN_ITEMDBLCLICKW    = HDN_FIRST -23,
	HDN_DIVIDERDBLCLICKA = HDN_FIRST -5,
	HDN_DIVIDERDBLCLICKW = HDN_FIRST -25,
	HDN_BEGINTRACKA      = HDN_FIRST -6,
	HDN_BEGINTRACKW      = HDN_FIRST -26,
	HDN_ENDTRACKA        = HDN_FIRST -7,
	HDN_ENDTRACKW        = HDN_FIRST -27,
	HDN_TRACKA           = HDN_FIRST -8,
	HDN_TRACKW           = HDN_FIRST -28
}
static if (_WIN32_IE >= 0x300) {
	enum {
		HDN_ENDDRAG      = (HDN_FIRST-11),
		HDN_BEGINDRAG    = (HDN_FIRST-10),
		HDN_GETDISPINFOA = (HDN_FIRST-9),
		HDN_GETDISPINFOW = (HDN_FIRST-29)
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		HICF_OTHER          = 0x00,
		HICF_MOUSE          = 0x01,
		HICF_ARROWKEYS      = 0x02,
		HICF_ACCELERATOR    = 0x04,
		HICF_DUPACCEL       = 0x08,
		HICF_ENTERING       = 0x10,
		HICF_LEAVING        = 0x20,
		HICF_RESELECT       = 0x40,
		HICF_LMOUSE         = 0x80,
		HICF_TOGGLEDROPDOWN = 0x100
	}
}

enum {
	IPM_CLEARADDRESS = WM_USER + 100,
	IPM_SETADDRESS   = WM_USER + 101,
	IPM_GETADDRESS   = WM_USER + 102,
	IPM_SETRANGE     = WM_USER + 103,
	IPM_SETFOCUS     = WM_USER + 104,
	IPM_ISBLANK      = WM_USER + 105
}

static if (_WIN32_IE >= 0x500) {
	enum {
		I_INDENTCALLBACK = -1,
		I_IMAGENONE      = -2
	}
}

enum {
	TBSTATE_CHECKED       = 1,
	TBSTATE_PRESSED       = 2,
	TBSTATE_ENABLED       = 4,
	TBSTATE_HIDDEN        = 8,
	TBSTATE_INDETERMINATE = 16,
	TBSTATE_WRAP          = 32
}
static if (_WIN32_IE >= 0x300) {
	enum {
		TBSTATE_ELLIPSES = 0x40
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TBSTATE_MARKED = 0x0080
	}
}

enum {
	TBSTYLE_BUTTON     = 0,
	TBSTYLE_SEP        = 1,
	TBSTYLE_CHECK      = 2,
	TBSTYLE_GROUP      = 4,
	TBSTYLE_CHECKGROUP = TBSTYLE_GROUP | TBSTYLE_CHECK
}
static if (_WIN32_IE >= 0x300) {
	enum {
		TBSTYLE_DROPDOWN = 8
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TBSTYLE_AUTOSIZE = 16,
		TBSTYLE_NOPREFIX = 32
	}
}
enum {
	TBSTYLE_TOOLTIPS = 256,
	TBSTYLE_WRAPABLE = 512,
	TBSTYLE_ALTDRAG  = 1024
}
static if (_WIN32_IE >= 0x300) {
	enum {
		TBSTYLE_FLAT        = 2048,
		TBSTYLE_LIST        = 4096,
		TBSTYLE_CUSTOMERASE = 8192
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TBSTYLE_REGISTERDROP    = 0x4000,
		TBSTYLE_TRANSPARENT     = 0x8000,
		TBSTYLE_EX_DRAWDDARROWS = 0x00000001
	}
}
static if (_WIN32_IE >= 0x501) {
	enum {
		TBSTYLE_EX_MIXEDBUTTONS       = 8,
		TBSTYLE_EX_HIDECLIPPEDBUTTONS = 16
	}
}
static if (_WIN32_WINNT >= 0x501) {
	enum {
		TBSTYLE_EX_DOUBLEBUFFER = 0x80
	}
}

static if (_WIN32_IE >= 0x500) {
	enum {
		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_WHOLEDROPDOWN = 0x0080
	}
}
static if (_WIN32_IE >= 0x501) {
	enum {
		BTNS_SHOWTEXT = 0x0040
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TBCDRF_NOEDGES        = 0x10000,
		TBCDRF_HILITEHOTTRACK = 0x20000,
		TBCDRF_NOOFFSET       = 0x40000,
		TBCDRF_NOMARK         = 0x80000,
		TBCDRF_NOETCHEDEFFECT = 0x100000
	}
}

const HINST_COMMCTRL = cast(HINSTANCE) (-1);

enum {
	IDB_STD_SMALL_COLOR,
	IDB_STD_LARGE_COLOR,
	IDB_VIEW_SMALL_COLOR = 4,
	IDB_VIEW_LARGE_COLOR = 5
}
static if (_WIN32_IE >= 0x300) {
	enum {
		IDB_HIST_SMALL_COLOR = 8,
		IDB_HIST_LARGE_COLOR = 9
	}
}

enum {
	STD_CUT,
	STD_COPY,
	STD_PASTE,
	STD_UNDO,
	STD_REDOW,
	STD_DELETE,
	STD_FILENEW,
	STD_FILEOPEN,
	STD_FILESAVE,
	STD_PRINTPRE,
	STD_PROPERTIES,
	STD_HELP,
	STD_FIND,
	STD_REPLACE,
	STD_PRINT // = 14
}

enum {
	VIEW_LARGEICONS,
	VIEW_SMALLICONS,
	VIEW_LIST,
	VIEW_DETAILS,
	VIEW_SORTNAME,
	VIEW_SORTSIZE,
	VIEW_SORTDATE,
	VIEW_SORTTYPE,
	VIEW_PARENTFOLDER,
	VIEW_NETCONNECT,
	VIEW_NETDISCONNECT,
	VIEW_NEWFOLDER // = 11
}

enum {
	TB_ENABLEBUTTON          = WM_USER + 1,
	TB_CHECKBUTTON,
	TB_PRESSBUTTON,
	TB_HIDEBUTTON,
	TB_INDETERMINATE, //     = WM_USER + 5,
	TB_ISBUTTONENABLED       = WM_USER + 9,
	TB_ISBUTTONCHECKED,
	TB_ISBUTTONPRESSED,
	TB_ISBUTTONHIDDEN,
	TB_ISBUTTONINDETERMINATE, // = WM_USER + 13,
	TB_SETSTATE              = WM_USER + 17,
	TB_GETSTATE              = WM_USER + 18,
	TB_ADDBITMAP             = WM_USER + 19,
	TB_DELETEBUTTON          = WM_USER + 22,
	TB_GETBUTTON,
	TB_BUTTONCOUNT,
	TB_COMMANDTOINDEX,
	TB_SAVERESTOREA,
	TB_CUSTOMIZE,
	TB_ADDSTRINGA,
	TB_GETITEMRECT,
	TB_BUTTONSTRUCTSIZE,
	TB_SETBUTTONSIZE,
	TB_SETBITMAPSIZE,
	TB_AUTOSIZE, //          = WM_USER + 33,
	TB_GETTOOLTIPS           = WM_USER + 35,
	TB_SETTOOLTIPS           = WM_USER + 36,
	TB_SETPARENT             = WM_USER + 37,
	TB_SETROWS               = WM_USER + 39,
	TB_GETROWS,
	TB_GETBITMAPFLAGS,
	TB_SETCMDID,
	TB_CHANGEBITMAP,
	TB_GETBITMAP,
	TB_GETBUTTONTEXTA,
	TB_REPLACEBITMAP, //     = WM_USER + 46,
	TB_GETBUTTONSIZE         = WM_USER + 58,
	TB_SETBUTTONWIDTH        = WM_USER + 59,
	TB_GETBUTTONTEXTW        = WM_USER + 75,
	TB_SAVERESTOREW          = WM_USER + 76,
	TB_ADDSTRINGW            = WM_USER + 77,
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TB_MARKBUTTON = WM_USER + 6
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TB_ISBUTTONHIGHLIGHTED = WM_USER + 14
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TB_ADDBUTTONSA   = WM_USER + 20,
		TB_INSERTBUTTONA = WM_USER + 21
	}
} else {
	enum {
		TB_ADDBUTTONS   = WM_USER + 20,
		TB_INSERTBUTTON = WM_USER + 21
	}
}
static if (_WIN32_IE >= 0x300) {
	enum {
		TB_SETINDENT = WM_USER + 47,
		TB_SETIMAGELIST,
		TB_GETIMAGELIST,
		TB_LOADIMAGES,
		TB_GETRECT,
		TB_SETHOTIMAGELIST,
		TB_GETHOTIMAGELIST,
		TB_SETDISABLEDIMAGELIST,
		TB_GETDISABLEDIMAGELIST,
		TB_SETSTYLE,
		TB_GETSTYLE,
		//TB_GETBUTTONSIZE,
		//TB_SETBUTTONWIDTH,
		TB_SETMAXTEXTROWS,
		TB_GETTEXTROWS // = WM_USER + 61
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TB_GETOBJECT            = WM_USER + 62,
		TB_GETBUTTONINFOW,
		TB_SETBUTTONINFOW,
		TB_GETBUTTONINFOA,
		TB_SETBUTTONINFOA,
		TB_INSERTBUTTONW,
		TB_ADDBUTTONSW,
		TB_HITTEST, //          = WM_USER + 69
		TB_SETEXTENDEDSTYLE     = WM_USER + 84,
		TB_GETEXTENDEDSTYLE     = WM_USER + 85,
		TB_SETDRAWTEXTFLAGS     = WM_USER + 70,
		TB_GETHOTITEM,
		TB_SETHOTITEM,
		TB_SETANCHORHIGHLIGHT,
		TB_GETANCHORHIGHLIGHT, // = WM_USER + 74
		TB_MAPACCELERATORA      = WM_USER + 78,
		TB_GETINSERTMARK,
		TB_SETINSERTMARK,
		TB_INSERTMARKHITTEST,
		TB_MOVEBUTTON,
		TB_GETMAXSIZE,
		//TB_SETEXTENDEDSTYLE,
		//TB_GETEXTENDEDSTYLE,
		TB_GETPADDING,
		TB_SETPADDING,
		TB_SETINSERTMARKCOLOR,
		TB_GETINSERTMARKCOLOR,
		TB_MAPACCELERATORW,
		TB_GETSTRINGW,
		TB_GETSTRINGA, //       = WM_USER + 92
		TB_SETCOLORSCHEME       = CCM_SETCOLORSCHEME,
		TB_GETCOLORSCHEME       = CCM_GETCOLORSCHEME,
		TB_SETUNICODEFORMAT     = CCM_SETUNICODEFORMAT,
		TB_GETUNICODEFORMAT     = CCM_GETUNICODEFORMAT
	}
}

const TBBF_LARGE = 1;

enum {
	TBN_GETBUTTONINFOA = TBN_FIRST -0,
	TBN_BEGINDRAG      = TBN_FIRST -1,
	TBN_ENDDRAG        = TBN_FIRST -2,
	TBN_BEGINADJUST    = TBN_FIRST -3,
	TBN_ENDADJUST      = TBN_FIRST -4,
	TBN_RESET          = TBN_FIRST -5,
	TBN_QUERYINSERT    = TBN_FIRST -6,
	TBN_QUERYDELETE    = TBN_FIRST -7,
	TBN_TOOLBARCHANGE  = TBN_FIRST -8,
	TBN_CUSTHELP       = TBN_FIRST -9
}
static if (_WIN32_IE >= 0x300) {
	enum {
		TBN_DROPDOWN = TBN_FIRST - 10
	}
}
static if (_WIN32_IE >= 0x400) {
	enum {
		TBN_HOTITEMCHANGE  = TBN_FIRST - 13,
		TBN_DRAGOUT        = TBN_FIRST - 14,
		TBN_DELETINGBUTTON = TBN_FIRST - 15,
		TBN_GETDISPINFOA   = TBN_FIRST - 16,
		TBN_GETDISPINFOW   = TBN_FIRST - 17,
		TBN_GETINFOTIPA    = TBN_FIRST - 18,
		TBN_GETINFOTIPW    = TBN_FIRST - 19,
		TBN_GETBUTTONINFOW = TBN_FIRST - 20
	}
}
static if (_WIN32_IE >= 0x500) {
	enum {
		TBN_RESTORE       = TBN_FIRST - 21,
		TBN_SAVE          = TBN_FIRST - 22,
		TBN_INITCUSTOMIZE = TBN_FIRST - 23
	}

	enum {
		TBNRF_HIDEHELP = 1,
		TBNRF_ENDCUSTOMIZE
	}

	enum {
		TBNF_IMAGE      = 1,
		TBNF_TEXT       = 2,
		TBNF_DI_SETITEM = 0x10000000
	}
}

enum {
	TTS_ALWAYSTIP = 1,
	TTS_NOPREFIX
}
static if(_WIN32_IE >= 0x500) {
	enum {
		TTS_NOANIMATE = 0x10,
		TTS_NOFADE    = 0x20,
		TTS_BALLOON   = 0x40,
		TTS_CLOSE     = 0x80
	}
}

enum {
	TTF_IDISHWND   = 1,
	TTF_CENTERTIP  = 2,
	TTF_RTLREADING = 4,
	TTF_SUBCLASS   = 16
}
static if (_WIN32_IE >= 0x300) {
	enum {
		TTF_TRACK       = 0x0020,
		TTF_ABSOLUTE    = 0x0080,
		TTF_TRANSPARENT = 0x0100,
		TTF_DI_SETITEM  = 0x8000
	}

	static if (_WIN32_IE >= 0x501) {
		enum {
			TTF_PARSELINKS = 0x1000
		}
	}

	enum {
		TBCD_TICS = 1,
		TBCD_THUMB,
		TBCD_CHANNEL // = 3
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TBDDRET_DEFAULT,
		TBDDRET_NODEFAULT,
		TBDDRET_TREATPRESSED
	}

	enum {
		TBIMHT_AFTER = 1,
		TBIMHT_BACKGROUND
	}
}

enum {
	TTDT_AUTOMATIC,
	TTDT_RESHOW,
	TTDT_AUTOPOP,
	TTDT_INITIAL
}

enum {
	TTM_ACTIVATE        = WM_USER + 1,
	TTM_SETDELAYTIME    = WM_USER + 3,
	TTM_ADDTOOLA,
	TTM_DELTOOLA,
	TTM_NEWTOOLRECTA,
	TTM_RELAYEVENT,
	TTM_GETTOOLINFOA,
	TTM_SETTOOLINFOA,
	TTM_HITTESTA,
	TTM_GETTEXTA,
	TTM_UPDATETIPTEXTA,
	TTM_GETTOOLCOUNT,
	TTM_ENUMTOOLSA,
	TTM_GETCURRENTTOOLA,
	TTM_WINDOWFROMPOINT, // = WM_USER + 16
	TTM_ADDTOOLW        = WM_USER + 50,
	TTM_DELTOOLW,
	TTM_NEWTOOLRECTW,
	TTM_GETTOOLINFOW,
	TTM_SETTOOLINFOW,
	TTM_HITTESTW,
	TTM_GETTEXTW,
	TTM_UPDATETIPTEXTW,
	TTM_ENUMTOOLSW,
	TTM_GETCURRENTTOOLW // = WM_USER + 59
}

static if (_WIN32_IE >= 0x300) {
	enum {
		TTM_TRACKACTIVATE = WM_USER + 17,
		TTM_TRACKPOSITION,
		TTM_SETTIPBKCOLOR,
		TTM_SETTIPTEXTCOLOR,
		TTM_GETDELAYTIME,
		TTM_GETTIPBKCOLOR,
		TTM_GETTIPTEXTCOLOR,
		TTM_SETMAXTIPWIDTH,
		TTM_GETMAXTIPWIDTH,
		TTM_SETMARGIN,
		TTM_GETMARGIN,
		TTM_POP // = WM_USER + 28
	}
}

static if (_WIN32_IE >= 0x400) {  // IE4.0 ???
	enum {
		TTM_UPDATE = WM_USER + 29,
		TTM_GETBUBBLESIZE,
		TTM_ADJUSTRECT,
		TTM_SETTITLEA,
		TTM_SETTITLEW // = WM_USER + 33
	}
}

enum {
	TTN_GETDISPINFOA = TTN_FIRST - 0,
	TTN_GETDISPINFOW = TTN_FIRST - 10,
	TTN_NEEDTEXTA    = TTN_GETDISPINFOA,
	TTN_NEEDTEXTW    = TTN_GETDISPINFOW,
	TTN_SHOW         = TTN_FIRST-1,
	TTN_POP          = TTN_FIRST-2
}

const UD_MAXVAL = 0x7fff;
const UD_MINVAL = -UD_MAXVAL;

enum {
	UDN_DELTAPOS    = UDN_FIRST-1,
	UDS_WRAP        = 1,
	UDS_SETBUDDYINT = 2,
	UDS_ALIGNRIGHT  = 4,
	UDS_ALIGNLEFT   = 8,
	UDS_AUTOBUDDY   = 16,
	UDS_ARROWKEYS   = 32,
	UDS_HORZ        = 64,
	UDS_NOTHOUSANDS = 128
}

static if (_WIN32_IE >= 0x300) {
	enum {
		UDS_HOTTRACK = 0x0100
	}
}

enum {
	UDM_SETRANGE = WM_USER + 101,
	UDM_GETRANGE,
	UDM_SETPOS,
	UDM_GETPOS,
	UDM_SETBUDDY,
	UDM_GETBUDDY,
	UDM_SETACCEL,
	UDM_GETACCEL,
	UDM_SETBASE,
	UDM_GETBASE // = WM_USER + 110
}

static if (_WIN32_IE >= 0x400) {
	enum {
		UDM_SETRANGE32 = WM_USER + 111,
		UDM_GETRANGE32,
		UDM_SETPOS32,
		UDM_GETPOS32 // = WM_USER + 114
	}
}

static if (_WIN32_IE >= 0x500) {
	enum {
		UDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
		UDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
	}
}

/*enum {
	SB_SETTEXTA       = WM_USER + 1,
	SB_GETTEXTA,
	SB_GETTEXTLENGTHA,
	SB_SETPARTS,   // = WM_USER + 4
	SB_GETPARTS       = WM_USER + 6,
	SB_GETBORDERS,
	SB_SETMINHEIGHT,
	SB_SIMPLE,
	SB_GETRECT,
	SB_SETTEXTW,
	SB_GETTEXTLENGTHW,
	SB_GETTEXTW    // = WM_USER + 13
}*/

/*enum {
	SBT_OWNERDRAW  = 0x1000,
	SBT_NOBORDERS  = 256,
	SBT_POPOUT     = 512,
	SBT_RTLREADING = 1024
}*/

static if(_WIN32_IE >= 0x400) {
	enum {
		SBT_TOOLTIPS         = 0x0800,
		SBN_SIMPLEMODECHANGE = SBN_FIRST
	}
}

enum {
	TBS_AUTOTICKS      = 1,
	TBS_VERT           = 2,
	TBS_HORZ           = 0,
	TBS_TOP            = 4,
	TBS_BOTTOM         = 0,
	TBS_LEFT           = 4,
	TBS_RIGHT          = 0,
	TBS_BOTH           = 8,
	TBS_NOTICKS        = 16,
	TBS_ENABLESELRANGE = 32,
	TBS_FIXEDLENGTH    = 64,
	TBS_NOTHUMB        = 128
}

static if (_WIN32_IE >= 0x300) {
	enum {
		TBS_TOOLTIPS = 0x0100,
		TBTS_TOP     = 0,
		TBTS_LEFT,
		TBTS_BOTTOM,
		TBTS_RIGHT // = 3
	}
}

static if (_WIN32_IE >= 0x500) {
	enum {
		TBS_REVERSED = 0x0200
	}
}

static if (_WIN32_IE >= 0x501) {
	enum {
		TBS_DOWNISLEFT = 0x0400
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TBIF_BYINDEX = 0x80000000,
		TBIF_COMMAND = 32,
		TBIF_IMAGE   = 1,
		TBIF_LPARAM  = 16,
		TBIF_SIZE    = 64,
		TBIF_STATE   = 4,
		TBIF_STYLE   = 8,
		TBIF_TEXT    = 2
	}
}

enum {
	TBM_GETPOS           = WM_USER,
	TBM_GETRANGEMIN,
	TBM_GETRANGEMAX,
	TBM_GETTIC,
	TBM_SETTIC,
	TBM_SETPOS,
	TBM_SETRANGE,
	TBM_SETRANGEMIN,
	TBM_SETRANGEMAX,
	TBM_CLEARTICS,
	TBM_SETSEL,
	TBM_SETSELSTART,
	TBM_SETSELEND,    // = WM_USER+12,
	TBM_GETPTICS         = WM_USER+14,
	TBM_GETTICPOS,
	TBM_GETNUMTICS,
	TBM_GETSELSTART,
	TBM_GETSELEND,
	TBM_CLEARSEL,
	TBM_SETTICFREQ,
	TBM_SETPAGESIZE,
	TBM_GETPAGESIZE,
	TBM_SETLINESIZE,
	TBM_GETLINESIZE,
	TBM_GETTHUMBRECT,
	TBM_GETCHANNELRECT,
	TBM_SETTHUMBLENGTH,
	TBM_GETTHUMBLENGTH,
	TBM_SETTOOLTIPS,
	TBM_GETTOOLTIPS,
	TBM_SETTIPSIDE,
	TBM_SETBUDDY,
	TBM_GETBUDDY, //     = WM_USER+33,
	TBM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
	TBM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
}

enum {
	TB_LINEUP,
	TB_LINEDOWN,
	TB_PAGEUP,
	TB_PAGEDOWN,
	TB_THUMBPOSITION,
	TB_THUMBTRACK,
	TB_TOP,
	TB_BOTTOM,
	TB_ENDTRACK // = 8
}

enum {
	HOTKEYF_SHIFT   = 1,
	HOTKEYF_CONTROL = 2,
	HOTKEYF_ALT     = 4,
	HOTKEYF_EXT     = 8
}

enum {
	HKCOMB_NONE = 1,
	HKCOMB_S    = 2,
	HKCOMB_C    = 4,
	HKCOMB_A    = 8,
	HKCOMB_SC   = 16,
	HKCOMB_SA   = 32,
	HKCOMB_CA   = 64,
	HKCOMB_SCA  = 128
}

enum {
	HKM_SETHOTKEY = WM_USER + 1,
	HKM_GETHOTKEY = WM_USER + 2,
	HKM_SETRULES  = WM_USER + 3
}

enum {
	PBM_SETRANGE     = WM_USER + 1,
	PBM_SETPOS,
	PBM_DELTAPOS,
	PBM_SETSTEP,
	PBM_STEPIT,   // = WM_USER + 5
	PBM_SETRANGE32   = 1030,
	PBM_GETRANGE,
	PBM_GETPOS,
	PBM_SETBARCOLOR, // = 1033
	PBM_SETBKCOLOR   = CCM_SETBKCOLOR
}

enum {
	PBS_SMOOTH   = 1,
	PBS_VERTICAL = 4
}

enum {
	LVS_ICON,
	LVS_REPORT,
	LVS_SMALLICON,
	LVS_LIST,        // = 3
	LVS_TYPEMASK        = 3,
	LVS_SINGLESEL       = 4,
	LVS_SHOWSELALWAYS   = 8,
	LVS_SORTASCENDING   = 16,
	LVS_SORTDESCENDING  = 32,
	LVS_SHAREIMAGELISTS = 64,
	LVS_NOLABELWRAP     = 128,
	LVS_AUTOARRANGE     = 256,
	LVS_EDITLABELS      = 512,
	LVS_NOSCROLL        = 0x2000,
	LVS_TYPESTYLEMASK   = 0xFC00,
	LVS_ALIGNTOP        = 0,
	LVS_ALIGNLEFT       = 0x800,
	LVS_ALIGNMASK       = 0xC00,
	LVS_OWNERDRAWFIXED  = 0x400,
	LVS_NOCOLUMNHEADER  = 0x4000,
	LVS_NOSORTHEADER    = 0x8000
}

static if (_WIN32_IE >= 0x300) {
	enum {
		CDIS_CHECKED       = 8,
		CDIS_DEFAULT       = 32,
		CDIS_DISABLED      = 4,
		CDIS_FOCUS         = 16,
		CDIS_GRAYED        = 2,
		CDIS_HOT           = 64,
		CDIS_SELECTED      = 1,
		CDIS_MARKED        = 128,
		CDIS_INDETERMINATE = 256
	}

	static if (_WIN32_WINNT >= 0x501) {
		enum {
			CDIS_SHOWKEYBOARDCUES = 512
		}
	}

	enum {
		CDDS_POSTERASE     = 4,
		CDDS_POSTPAINT     = 2,
		CDDS_PREERASE      = 3,
		CDDS_PREPAINT      = 1,
		CDDS_ITEM          = 65536,
		CDDS_ITEMPOSTERASE = 65540,
		CDDS_ITEMPOSTPAINT = 65538,
		CDDS_ITEMPREERASE  = 65539,
		CDDS_ITEMPREPAINT  = 65537
	}

	static if (_WIN32_IE >= 0x400) {
		enum {
			CDDS_SUBITEM = 0x20000
		}
	}

	enum {
		CDRF_DODEFAULT         = 0x00,
		CDRF_NOTIFYITEMDRAW    = 0x20,
		CDRF_NOTIFYSUBITEMDRAW = 0x20,
		CDRF_NOTIFYITEMERASE   = 0x80,
		CDRF_NOTIFYPOSTERASE   = 0x40,
		CDRF_NOTIFYPOSTPAINT   = 0x10,
		CDRF_NEWFONT           = 0x02,
		CDRF_SKIPDEFAULT       = 0x04
	}

	static if (_WIN32_IE >= 0x400) {
		enum {
			LVBKIF_SOURCE_NONE    = 0x00000000,
			LVBKIF_SOURCE_HBITMAP = 0x00000001,
			LVBKIF_SOURCE_URL     = 0x00000002,
			LVBKIF_SOURCE_MASK    = 0x00000003,
			LVBKIF_STYLE_NORMAL   = 0x00000000,
			LVBKIF_STYLE_TILE     = 0x00000010,
			LVBKIF_STYLE_MASK     = 0x00000010
		}
	}

	static if (_WIN32_WINNT >= 0x501) {
		enum {
			LVBKIF_FLAG_TILEOFFSET = 0x00000100,
			LVBKIF_TYPE_WATERMARK  = 0x10000000
		}
	}

	enum {
		LVS_OWNERDATA = 4096
	}

	enum {
		LVS_EX_CHECKBOXES       = 4,
		LVS_EX_FULLROWSELECT    = 32,
		LVS_EX_GRIDLINES        = 1,
		LVS_EX_HEADERDRAGDROP   = 16,
		LVS_EX_ONECLICKACTIVATE = 64,
		LVS_EX_SUBITEMIMAGES    = 2,
		LVS_EX_TRACKSELECT      = 8,
		LVS_EX_TWOCLICKACTIVATE = 128
	}

	enum {
		LVSICF_NOINVALIDATEALL = 0x00000001,
		LVSICF_NOSCROLL        = 0x00000002
	}

	static if(_WIN32_IE >= 0x400) {
		enum {
			LVS_EX_FLATSB         = 0x00000100,
			LVS_EX_REGIONAL       = 0x00000200,
			LVS_EX_INFOTIP        = 0x00000400,
			LVS_EX_UNDERLINEHOT   = 0x00000800,
			LVS_EX_UNDERLINECOLD  = 0x00001000,
			LVS_EX_MULTIWORKAREAS = 0x00002000
		}
	}

	static if(_WIN32_IE >= 0x500) {
		enum {
			LVS_EX_LABELTIP     = 0x00004000,
			LVS_EX_BORDERSELECT = 0x00008000
		}
	}
}

enum {
	LVSIL_NORMAL,
	LVSIL_SMALL,
	LVSIL_STATE
}

enum {
	LVM_GETBKCOLOR             = LVM_FIRST,
	LVM_SETBKCOLOR,
	LVM_GETIMAGELIST,
	LVM_SETIMAGELIST,
	LVM_GETITEMCOUNT,       // = LVM_FIRST +   4
	LVM_SORTITEMSEX            = LVM_FIRST +  81,
	LVM_SETVIEW                = LVM_FIRST + 142,
	LVM_GETVIEW,            // = LVM_FIRST + 143
	LVM_INSERTGROUP            = LVM_FIRST + 145,
	LVM_SETGROUPINFO           = LVM_FIRST + 147,
	LVM_GETGROUPINFO           = LVM_FIRST + 149,
	LVM_REMOVEGROUP,
	LVM_MOVEGROUP,          // = LVM_FIRST + 151
	LVM_SETGROUPMETRICS        = LVM_FIRST + 155,
	LVM_GETGROUPMETRICS,
	LVM_ENABLEGROUPVIEW,
	LVM_SORTGROUPS,
	LVM_INSERTGROUPSORTED,
	LVM_REMOVEALLGROUPS,
	LVM_HASGROUP,
	LVM_SETTILEVIEWINFO,
	LVM_GETTILEVIEWINFO,
	LVM_SETTILEINFO,
	LVM_GETTILEINFO,
	LVM_SETINSERTMARK,
	LVM_GETINSERTMARK,
	LVM_INSERTMARKHITTEST,
	LVM_GETINSERTMARKRECT,
	LVM_SETINSERTMARKCOLOR,
	LVM_GETINSERTMARKCOLOR, // = LVM_FIRST + 171
	LVM_SETINFOTIP             = LVM_FIRST + 173,
	LVM_GETSELECTEDCOLUMN,
	LVM_ISGROUPVIEWENABLED,
	LVM_GETOUTLINECOLOR,
	LVM_SETOUTLINECOLOR,    // = LVM_FIRST + 177
	LVM_CANCELEDITLABEL        = LVM_FIRST + 179,
	LVM_MAPIDTOINDEX           = LVM_FIRST + 181
}

static if (_WIN32_WINNT >= 0x501) {
	enum {
		LVM_SETSELECTEDCOLUMN  = LVM_FIRST + 140
	}
}

enum {
	LVIF_TEXT  = 1,
	LVIF_IMAGE = 2,
	LVIF_PARAM = 4,
	LVIF_STATE = 8
}

static if (_WIN32_IE >= 0x300) {
	enum {
		LVIF_INDENT      = 16,
		LVIF_NORECOMPUTE = 2048
	}
}

static if (_WIN32_WINNT >= 0x501) {
	enum {
		LVIF_GROUPID = 128,
		LVIF_COLUMNS = 256
	}
}

enum {
	LVIS_FOCUSED        = 1,
	LVIS_SELECTED       = 2,
	LVIS_CUT            = 4,
	LVIS_DROPHILITED    = 8,
	LVIS_OVERLAYMASK    = 0xF00,
	LVIS_STATEIMAGEMASK = 0xF000
}

const LPWSTR LPSTR_TEXTCALLBACKW = cast(LPWSTR) -1;
const LPSTR  LPSTR_TEXTCALLBACKA = cast(LPSTR) -1;

const I_IMAGECALLBACK = -1;

static if(_WIN32_IE >= 0x400) {
	enum {
		LVM_SETBKIMAGEA          = LVM_FIRST + 68,
		LVM_SETBKIMAGEW          = LVM_FIRST + 138,
		LVM_GETBKIMAGEA          = LVM_FIRST + 69,
		LVM_GETBKIMAGEW          = LVM_FIRST + 139,
		LV_MAX_WORKAREAS         = 16,
		LVM_SETWORKAREAS         = LVM_FIRST + 65,
		LVM_GETWORKAREAS         = LVM_FIRST + 70,
		LVM_GETNUMBEROFWORKAREAS = LVM_FIRST + 73,
		LVM_GETSELECTIONMARK     = LVM_FIRST + 66,
		LVM_SETSELECTIONMARK     = LVM_FIRST + 67,
		LVM_SETHOVERTIME         = LVM_FIRST + 71,
		LVM_GETHOVERTIME         = LVM_FIRST + 72,
		LVM_SETTOOLTIPS          = LVM_FIRST + 74,
		LVM_GETTOOLTIPS          = LVM_FIRST + 78,
		LVM_SETUNICODEFORMAT     = CCM_SETUNICODEFORMAT,
		LVM_GETUNICODEFORMAT     = CCM_GETUNICODEFORMAT
	}
}

enum {
	LVNI_ALL,
	LVNI_FOCUSED     = 1,
	LVNI_SELECTED    = 2,
	LVNI_CUT         = 4,
	LVNI_DROPHILITED = 8,
	LVNI_ABOVE       = 256,
	LVNI_BELOW       = 512,
	LVNI_TOLEFT      = 1024,
	LVNI_TORIGHT     = 2048
}

enum {
	LVM_GETITEMA          = LVM_FIRST + 5,
	LVM_SETITEMA,
	LVM_INSERTITEMA,
	LVM_DELETEITEM,
	LVM_DELETEALLITEMS,
	LVM_GETCALLBACKMASK,
	LVM_SETCALLBACKMASK,
	LVM_GETNEXTITEM,
	LVM_FINDITEMA,
	LVM_GETITEMRECT,
	LVM_SETITEMPOSITION,
	LVM_GETITEMPOSITION,
	LVM_GETSTRINGWIDTHA,
	LVM_HITTEST,
	LVM_ENSUREVISIBLE,
	LVM_SCROLL,
	LVM_REDRAWITEMS,
	LVM_ARRANGE,
	LVM_EDITLABELA,
	LVM_GETEDITCONTROL,
	LVM_GETCOLUMNA,
	LVM_SETCOLUMNA,
	LVM_INSERTCOLUMNA,
	LVM_DELETECOLUMN,
	LVM_GETCOLUMNWIDTH,
	LVM_SETCOLUMNWIDTH, // = LVM_FIRST + 30,
	LVM_CREATEDRAGIMAGE   = LVM_FIRST + 33,
	LVM_GETVIEWRECT,
	LVM_GETTEXTCOLOR,
	LVM_SETTEXTCOLOR,
	LVM_GETTEXTBKCOLOR,
	LVM_SETTEXTBKCOLOR,
	LVM_GETTOPINDEX,
	LVM_GETCOUNTPERPAGE,
	LVM_GETORIGIN,
	LVM_UPDATE,
	LVM_SETITEMSTATE,
	LVM_GETITEMSTATE,
	LVM_GETITEMTEXTA,
	LVM_SETITEMTEXTA,
	LVM_SETITEMCOUNT,
	LVM_SORTITEMS,
	LVM_SETITEMPOSITION32,
	LVM_GETSELECTEDCOUNT,
	LVM_GETITEMSPACING,
	LVM_GETISEARCHSTRINGA, // = LVM_FIRST + 52,
	LVM_GETITEMW          = LVM_FIRST + 75,
	LVM_SETITEMW          = LVM_FIRST + 76,
	LVM_INSERTITEMW       = LVM_FIRST + 77,
	LVM_FINDITEMW         = LVM_FIRST + 83,
	LVM_GETSTRINGWIDTHW   = LVM_FIRST + 87,
	LVM_GETCOLUMNW        = LVM_FIRST + 95,
	LVM_SETCOLUMNW        = LVM_FIRST + 96,
	LVM_INSERTCOLUMNW     = LVM_FIRST + 97,
	LVM_GETITEMTEXTW      = LVM_FIRST + 115,
	LVM_SETITEMTEXTW,
	LVM_GETISEARCHSTRINGW,
	LVM_EDITLABELW     // = LVM_FIRST + 118,
}

static if (_WIN32_IE >= 0x300) {
	enum {
		LVM_GETHEADER                = LVM_FIRST + 31,
		LVM_SETICONSPACING           = LVM_FIRST + 53,
		LVM_SETEXTENDEDLISTVIEWSTYLE,
		LVM_GETEXTENDEDLISTVIEWSTYLE,
		LVM_GETSUBITEMRECT,
		LVM_SUBITEMHITTEST,
		LVM_SETCOLUMNORDERARRAY,
		LVM_GETCOLUMNORDERARRAY,
		LVM_SETHOTITEM,
		LVM_GETHOTITEM,
		LVM_SETHOTCURSOR,
		LVM_GETHOTCURSOR,
		LVM_APPROXIMATEVIEWRECT   // = LVM_FIRST + 64,
	}
}

enum {
	LVFI_PARAM     = 1,
	LVFI_STRING    = 2,
	LVFI_PARTIAL   = 8,
	LVFI_WRAP      = 32,
	LVFI_NEARESTXY = 64
}

enum {
	LVIF_DI_SETITEM = 0x1000
}

enum {
	LVIR_BOUNDS,
	LVIR_ICON,
	LVIR_LABEL,
	LVIR_SELECTBOUNDS // = 3
}

enum {
	LVHT_NOWHERE         = 1,
	LVHT_ONITEMICON      = 2,
	LVHT_ONITEMLABEL     = 4,
	LVHT_ONITEMSTATEICON = 8,
	LVHT_ONITEM          = LVHT_ONITEMICON | LVHT_ONITEMLABEL
	                       | LVHT_ONITEMSTATEICON,
	LVHT_ABOVE           = 8,
	LVHT_BELOW           = 16,
	LVHT_TORIGHT         = 32,
	LVHT_TOLEFT          = 64
}

enum {
	LVA_DEFAULT    = 0,
	LVA_ALIGNLEFT  = 1,
	LVA_ALIGNTOP   = 2,
	LVA_SNAPTOGRID = 5
}

enum {
	LVCF_FMT     = 1,
	LVCF_WIDTH   = 2,
	LVCF_TEXT    = 4,
	LVCF_SUBITEM = 8
}

static if (_WIN32_IE >= 0x300) {
	enum {
		LVCF_IMAGE = 16,
		LVCF_ORDER = 32
	}
}

enum {
	LVCFMT_LEFT,
	LVCFMT_RIGHT,
	LVCFMT_CENTER,
	LVCFMT_JUSTIFYMASK // = 3
}

static if (_WIN32_IE >= 0x300) {
	enum {
		LVCFMT_IMAGE           = 2048,
		LVCFMT_BITMAP_ON_RIGHT = 4096,
		LVCFMT_COL_HAS_IMAGES  = 32768
	}
}

enum {
	LVSCW_AUTOSIZE           = -1,
	LVSCW_AUTOSIZE_USEHEADER = -2
}

enum {
	LVN_ITEMCHANGING    = LVN_FIRST,
	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_ENDLABELEDITA   = LVN_FIRST - 6,
	LVN_COLUMNCLICK     = LVN_FIRST - 8,
	LVN_BEGINDRAG       = LVN_FIRST - 9,
	LVN_BEGINRDRAG      = LVN_FIRST - 11,
	LVN_GETDISPINFOA    = LVN_FIRST - 50,
	LVN_SETDISPINFOA    = LVN_FIRST - 51,
	LVN_KEYDOWN         = LVN_FIRST - 55,
	LVN_BEGINLABELEDITW = LVN_FIRST - 75,
	LVN_ENDLABELEDITW   = LVN_FIRST - 76,
	LVN_GETDISPINFOW    = LVN_FIRST - 77,
	LVN_SETDISPINFOW    = LVN_FIRST - 78
}

static if (_WIN32_IE >= 0x400) {
	enum {
		LVN_MARQUEEBEGIN = LVN_FIRST - 56,
		LVN_GETINFOTIPA  = LVN_FIRST - 57,
		LVN_GETINFOTIPW  = LVN_FIRST - 58,
		LVKF_ALT         = 1,
		LVKF_CONTROL     = 2,
		LVKF_SHIFT       = 4,
		LVGIT_UNFOLDED   = 1
	}
}

enum {
	TVS_HASBUTTONS      = 1,
	TVS_HASLINES        = 2,
	TVS_LINESATROOT     = 4,
	TVS_EDITLABELS      = 8,
	TVS_DISABLEDRAGDROP = 16,
	TVS_SHOWSELALWAYS   = 32
}

static if (_WIN32_IE >= 0x300) {
	enum {
		TVS_RTLREADING  = 64,
		TVS_NOTOOLTIPS  = 128,
		TVS_CHECKBOXES  = 256,
		TVS_TRACKSELECT = 512
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TVS_SINGLEEXPAND  = 1024,
		TVS_INFOTIP       = 2048,
		TVS_FULLROWSELECT = 4096,
		TVS_NOSCROLL      = 8192,
		TVS_NONEVENHEIGHT = 16384
	}
}

static if (_WIN32_IE >= 0x500) {
	enum {
		TVS_NOHSCROLL = 0x8000
	}
}

enum {
	TVIF_TEXT          = 1,
	TVIF_IMAGE         = 2,
	TVIF_PARAM         = 4,
	TVIF_STATE         = 8,
	TVIF_HANDLE        = 16,
	TVIF_SELECTEDIMAGE = 32,
	TVIF_CHILDREN      = 64
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TVIF_INTEGRAL = 0x0080
	}
}

enum {
	TVIS_FOCUSED        = 1,
	TVIS_SELECTED       = 2,
	TVIS_CUT            = 4,
	TVIS_DROPHILITED    = 8,
	TVIS_BOLD           = 16,
	TVIS_EXPANDED       = 32,
	TVIS_EXPANDEDONCE   = 64,
	TVIS_OVERLAYMASK    = 0xF00,
	TVIS_STATEIMAGEMASK = 0xF000,
	TVIS_USERMASK       = 0xF000
}

enum {
	I_CHILDRENCALLBACK = -1
}

alias HANDLE HTREEITEM;

const HTREEITEM
	TVI_ROOT  = cast(HTREEITEM) 0xFFFF0000,
	TVI_FIRST = cast(HTREEITEM) 0xFFFF0001,
	TVI_LAST  = cast(HTREEITEM) 0xFFFF0002,
	TVI_SORT  = cast(HTREEITEM) 0xFFFF0003;

enum {
	TVSIL_NORMAL = 0,
	TVSIL_STATE  = 2
}

enum {
	TVM_INSERTITEMA       = TV_FIRST,
	TVM_DELETEITEM        = TV_FIRST + 1,
	TVM_EXPAND            = TV_FIRST + 2,
	TVM_GETITEMRECT       = TV_FIRST + 4,
	TVM_GETCOUNT,
	TVM_GETINDENT,
	TVM_SETINDENT,
	TVM_GETIMAGELIST,
	TVM_SETIMAGELIST,
	TVM_GETNEXTITEM,
	TVM_SELECTITEM,
	TVM_GETITEMA,
	TVM_SETITEMA,
	TVM_EDITLABELA,
	TVM_GETEDITCONTROL,
	TVM_GETVISIBLECOUNT,
	TVM_HITTEST,
	TVM_CREATEDRAGIMAGE,
	TVM_SORTCHILDREN,
	TVM_ENSUREVISIBLE,
	TVM_SORTCHILDRENCB,
	TVM_ENDEDITLABELNOW,
	TVM_GETISEARCHSTRINGA, // = TV_FIRST + 23
	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
}

static if (_WIN32_IE >= 0x300) {
	enum {
		TVM_GETTOOLTIPS = TV_FIRST + 25,
		TVM_SETTOOLTIPS = TV_FIRST + 24
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TVM_SETINSERTMARK      = TV_FIRST + 26,
		TVM_SETITEMHEIGHT,
		TVM_GETITEMHEIGHT,
		TVM_SETBKCOLOR,
		TVM_SETTEXTCOLOR,
		TVM_GETBKCOLOR,
		TVM_GETTEXTCOLOR,
		TVM_SETSCROLLTIME,
		TVM_GETSCROLLTIME,  // = TV_FIRST + 34
		TVM_SETINSERTMARKCOLOR = TV_FIRST + 37,
		TVM_GETINSERTMARKCOLOR = TV_FIRST + 38,
		TVM_SETUNICODEFORMAT   = CCM_SETUNICODEFORMAT,
		TVM_GETUNICODEFORMAT   = CCM_GETUNICODEFORMAT
	}
}

static if (_WIN32_IE >= 0x500) {
	enum {
		TVM_GETITEMSTATE = TV_FIRST + 39,
		TVM_SETLINECOLOR = TV_FIRST + 40,
		TVM_GETLINECOLOR = TV_FIRST + 41
	}
}

enum {
	TVE_COLLAPSE      = 1,
	TVE_EXPAND        = 2,
	TVE_TOGGLE        = 3,
	TVE_COLLAPSERESET = 0x8000
}

static if (_WIN32_IE >= 0x300) {
	enum {
		TVE_EXPANDPARTIAL = 0x4000
	}
}

enum {
	TVC_UNKNOWN,
	TVC_BYMOUSE,
	TVC_BYKEYBOARD // = 2
}

enum {
	TVGN_ROOT,
	TVGN_NEXT,
	TVGN_PREVIOUS,
	TVGN_PARENT,
	TVGN_CHILD,
	TVGN_FIRSTVISIBLE,
	TVGN_NEXTVISIBLE,
	TVGN_PREVIOUSVISIBLE,
	TVGN_DROPHILITE,
	TVGN_CARET // = 9
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TVGN_LASTVISIBLE = 10
	}
}

enum {
	TVN_SELCHANGINGA    = TVN_FIRST - 1,
	TVN_SELCHANGEDA     = TVN_FIRST - 2,
	TVN_GETDISPINFOA    = TVN_FIRST - 3,
	TVN_SETDISPINFOA    = TVN_FIRST - 4,
	TVN_ITEMEXPANDINGA  = TVN_FIRST - 5,
	TVN_ITEMEXPANDEDA   = TVN_FIRST - 6,
	TVN_BEGINDRAGA      = TVN_FIRST - 7,
	TVN_BEGINRDRAGA     = TVN_FIRST - 8,
	TVN_DELETEITEMA     = TVN_FIRST - 9,
	TVN_BEGINLABELEDITA = TVN_FIRST - 10,
	TVN_ENDLABELEDITA   = TVN_FIRST - 11,
	TVN_KEYDOWN         = TVN_FIRST - 12,
	TVN_SELCHANGINGW    = TVN_FIRST - 50,
	TVN_SELCHANGEDW     = TVN_FIRST - 51,
	TVN_GETDISPINFOW    = TVN_FIRST - 52,
	TVN_SETDISPINFOW    = TVN_FIRST - 53,
	TVN_ITEMEXPANDINGW  = TVN_FIRST - 54,
	TVN_ITEMEXPANDEDW   = TVN_FIRST - 55,
	TVN_BEGINDRAGW      = TVN_FIRST - 56,
	TVN_BEGINRDRAGW     = TVN_FIRST - 57,
	TVN_DELETEITEMW     = TVN_FIRST - 58,
	TVN_BEGINLABELEDITW = TVN_FIRST - 59,
	TVN_ENDLABELEDITW   = TVN_FIRST - 60
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TVNRET_DEFAULT   = 0,
		TVNRET_SKIPOLD   = 1,
		TVNRET_SKIPNEW   = 2,
		TVN_GETINFOTIPA  = TVN_FIRST - 13,
		TVN_GETINFOTIPW  = TVN_FIRST - 14,
		TVN_SINGLEEXPAND = TVN_FIRST - 15
	}
}

enum {
	TVIF_DI_SETITEM = 0x1000
}

enum {
	TVHT_NOWHERE         = 1,
	TVHT_ONITEMICON      = 2,
	TVHT_ONITEMLABEL     = 4,
	TVHT_ONITEMINDENT    = 8,
	TVHT_ONITEMBUTTON    = 16,
	TVHT_ONITEMRIGHT     = 32,
	TVHT_ONITEMSTATEICON = 64,
	TVHT_ABOVE           = 256,
	TVHT_BELOW           = 512,
	TVHT_TORIGHT         = 1024,
	TVHT_TOLEFT          = 2048,
	TCHT_NOWHERE         = 1,
	TCHT_ONITEMICON      = 2,
	TCHT_ONITEMLABEL     = 4,
	TVHT_ONITEM          = TVHT_ONITEMICON | TVHT_ONITEMLABEL
	                       | TVHT_ONITEMSTATEICON,
	TCHT_ONITEM          = TCHT_ONITEMICON | TCHT_ONITEMLABEL
}

enum {
	TCS_TABS              = 0,
	TCS_RIGHTJUSTIFY      = 0,
	TCS_SINGLELINE        = 0,
	TCS_FORCEICONLEFT     = 16,
	TCS_FORCELABELLEFT    = 32,
	TCS_BUTTONS           = 256,
	TCS_MULTILINE         = 512,
	TCS_FIXEDWIDTH        = 1024,
	TCS_RAGGEDRIGHT       = 2048,
	TCS_FOCUSONBUTTONDOWN = 0x1000,
	TCS_OWNERDRAWFIXED    = 0x2000,
	TCS_TOOLTIPS          = 0x4000,
	TCS_FOCUSNEVER        = 0x8000
}

static if (_WIN32_IE >= 0x300) {
	enum {
		TCS_BOTTOM         = 2,
		TCS_RIGHT          = 2,
		TCS_VERTICAL       = 128,
		TCS_SCROLLOPPOSITE = 0x0001,
		TCS_HOTTRACK       = 0x0040,
		TCS_MULTISELECT    = 0x0004
	}
}

static if(_WIN32_IE >= 0x400) {
	enum {
		TCS_FLATBUTTONS       = 0x0008,
		TCS_EX_FLATSEPARATORS = 0x00000001,
		TCS_EX_REGISTERDROP   = 0x00000002
	}
}

enum {
	TCIF_TEXT       = 1,
	TCIF_IMAGE      = 2,
	TCIF_RTLREADING = 4,
	TCIF_PARAM      = 8
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TCIF_STATE = 16
	}
}

enum {
	TCIS_BUTTONPRESSED = 1
}

static if (_WIN32_IE >= 0x400) {
	enum {
		TCIS_HIGHLIGHTED = 2
	}
}

enum {
	TCM_FIRST          = 0x1300,
	TCM_GETIMAGELIST   = TCM_FIRST + 2,
	TCM_SETIMAGELIST,
	TCM_GETITEMCOUNT,
	TCM_GETITEMA,
	TCM_SETITEMA,
	TCM_INSERTITEMA,
	TCM_DELETEITEM,
	TCM_DELETEALLITEMS,
	TCM_GETITEMRECT,
	TCM_GETCURSEL,
	TCM_SETCURSEL,
	TCM_HITTEST,
	TCM_SETITEMEXTRA, // = TCM_FIRST + 14
	TCM_ADJUSTRECT     = TCM_FIRST + 40,
	TCM_SETITEMSIZE,
	TCM_REMOVEIMAGE,
	TCM_SETPADDING,
	TCM_GETROWCOUNT,
	TCM_GETTOOLTIPS,
	TCM_SETTOOLTIPS,
	TCM_GETCURFOCUS,
	TCM_SETCURFOCUS,
	TCM_SETMINTABWIDTH,
	TCM_DESELECTALL, // = TCM_FIRST + 50
	TCM_GETITEMW       = TCM_FIRST + 60,
	TCM_SETITEMW       = TCM_FIRST + 61,
	TCM_INSERTITEMW    = TCM_FIRST + 62
}

static if (_WIN32_IE >=0x0400) {
	enum {
		TCM_HIGHLIGHTITEM    = TCM_FIRST + 51,
		TCM_SETEXTENDEDSTYLE = TCM_FIRST + 52,
		TCM_GETEXTENDEDSTYLE = TCM_FIRST + 53,
		TCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
		TCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
	}
}

enum {
	TCN_KEYDOWN     = TCN_FIRST,
	TCN_SELCHANGE   = TCN_FIRST - 1,
	TCN_SELCHANGING = TCN_FIRST - 2
}

enum {
	NM_OUTOFMEMORY     = NM_FIRST - 1,
	NM_CLICK           = NM_FIRST - 2,
	NM_DBLCLK          = NM_FIRST - 3,
	NM_RETURN          = NM_FIRST - 4,
	NM_RCLICK          = NM_FIRST - 5,
	NM_RDBLCLK         = NM_FIRST - 6,
	NM_SETFOCUS        = NM_FIRST - 7,
	NM_KILLFOCUS       = NM_FIRST - 8,
	NM_CUSTOMDRAW      = NM_FIRST - 12,
	NM_HOVER           = NM_FIRST - 13,
	NM_NCHITTEST       = NM_FIRST - 14,
	NM_KEYDOWN         = NM_FIRST - 15,
	NM_RELEASEDCAPTURE = NM_FIRST - 16,
	NM_SETCURSOR       = NM_FIRST - 17,
	NM_CHAR            = NM_FIRST - 18,
	NM_TOOLTIPSCREATED = NM_FIRST - 19
}

enum {
	SBARS_SIZEGRIP = 256
}

/*enum {
	CCM_FIRST            = 0x2000,
	CCM_LAST             = CCM_FIRST + 0x200,
	CCM_SETBKCOLOR       = 8193,
	CCM_SETCOLORSCHEME   = 8194,
	CCM_GETCOLORSCHEME   = 8195,
	CCM_GETDROPTARGET    = 8196,
	CCM_SETUNICODEFORMAT = 8197,
	CCM_GETUNICODEFORMAT = 8198,
	CCM_SETVERSION       = 0x2007,
	CCM_GETVERSION       = 0x2008,
	CCM_SETNOTIFYWINDOW  = 0x2009
}*/

static if (_WIN32_WINNT >= 0x501) {
	enum {
		CCM_SETWINDOWTHEME = 0x200b,
		CCM_DPISCALE       = 0x200c
	}
}

enum {
	ICC_LISTVIEW_CLASSES = 1,
	ICC_TREEVIEW_CLASSES = 2,
	ICC_BAR_CLASSES      = 4,
	ICC_TAB_CLASSES      = 8,
	ICC_UPDOWN_CLASS     = 16,
	ICC_PROGRESS_CLASS   = 32,
	ICC_HOTKEY_CLASS     = 64,
	ICC_ANIMATE_CLASS    = 128,
	ICC_WIN95_CLASSES    = 255,
	ICC_DATE_CLASSES     = 256,
	ICC_USEREX_CLASSES   = 512,
	ICC_COOL_CLASSES     = 1024
}

static if (_WIN32_IE >= 0x400) {
	enum {
		INFOTIPSIZE            = 1024,
		ICC_INTERNET_CLASSES   = 2048,
		ICC_PAGESCROLLER_CLASS = 4096,
		ICC_NATIVEFNTCTL_CLASS = 8192
	}
}

static if (_WIN32_WINNT >= 0x501) {
	enum {
		ICC_STANDARD_CLASSES = 0x00004000,
		ICC_LINK_CLASS       = 0x00008000
	}
}

enum {
	GDTR_MIN = 1,
	GDTR_MAX = 2
}

enum {
	GMR_VISIBLE,
	GMR_DAYSTATE
}

enum {
	GDT_ERROR = -1,
	GDT_VALID = 0,
	GDT_NONE  = 1
}

enum {
	DTS_SHORTDATEFORMAT = 0,
	DTS_UPDOWN          = 1,
	DTS_SHOWNONE        = 2,
	DTS_LONGDATEFORMAT  = 4,
	DTS_TIMEFORMAT      = 9,
	DTS_APPCANPARSE     = 16,
	DTS_RIGHTALIGN      = 32
}

static if (_WIN32_IE >= 0x500) {
	enum {
		DTS_SHORTDATECENTURYFORMAT = 0x000C
	}
}

enum {
	MCS_DAYSTATE    = 1,
	MCS_MULTISELECT = 2,
	MCS_WEEKNUMBERS = 4
}

static if (_WIN32_IE >= 0x400) {
	enum {
		MCS_NOTODAYCIRCLE = 0x0008,
		MCS_NOTODAY       = 0x0010
	}
} else {
	enum {
		MCS_NOTODAY = 0x0008
	}
}

enum {
	DTM_GETSYSTEMTIME = 0x1001,
	DTM_SETSYSTEMTIME = 0x1002,
	DTM_GETRANGE      = 0x1003,
	DTM_SETRANGE      = 0x1004,
	DTM_SETFORMATA    = 0x1005,
	DTM_SETMCCOLOR    = 0x1006,
	DTM_GETMCCOLOR    = 0x1007,
	DTM_GETMONTHCAL   = 0x1008,
	DTM_SETMCFONT     = 0x1009,
	DTM_GETMCFONT     = 0x100a,
	DTM_SETFORMATW    = 0x1050
}

enum {
	DTN_USERSTRINGA    = -758U,
	DTN_USERSTRINGW    = -745U,
	DTN_WMKEYDOWNA     = -757U,
	DTN_WMKEYDOWNW     = -744U,
	DTN_FORMATA        = -756U,
	DTN_FORMATW        = -743U,
	DTN_FORMATQUERYA   = -755U,
	DTN_FORMATQUERYW   = -742U,
	DTN_DROPDOWN       = -754U,
	DTN_CLOSEUP        = -753U,
	DTN_DATETIMECHANGE = -759U,
}

enum {
	MCM_GETCURSEL         = 0x1001,
	MCM_SETCURSEL         = 0x1002,
	MCM_GETMAXSELCOUNT    = 0x1003,
	MCM_SETMAXSELCOUNT    = 0x1004,
	MCM_GETSELRANGE       = 0x1005,
	MCM_SETSELRANGE       = 0x1006,
	MCM_GETMONTHRANGE     = 0x1007,
	MCM_SETDAYSTATE       = 0x1008,
	MCM_GETMINREQRECT     = 0x1009,
	MCM_SETCOLOR          = 0x100a,
	MCM_GETCOLOR          = 0x100b,
	MCM_SETTODAY          = 0x100c,
	MCM_GETTODAY          = 0x100d,
	MCM_HITTEST           = 0x100e,
	MCM_SETFIRSTDAYOFWEEK = 0x100f,
	MCM_GETFIRSTDAYOFWEEK = 0x1010,
	MCM_GETRANGE          = 0x1011,
	MCM_SETRANGE          = 0x1012,
	MCM_GETMONTHDELTA     = 0x1013,
	MCM_SETMONTHDELTA     = 0x1014,
	MCM_GETMAXTODAYWIDTH  = 0x1015,
	MCM_GETUNICODEFORMAT  = CCM_GETUNICODEFORMAT,
	MCM_SETUNICODEFORMAT  = CCM_SETUNICODEFORMAT
}

enum {
	MCN_SELCHANGE   = -749U,
	MCN_GETDAYSTATE = -747U,
	MCN_SELECT      = -746U
}

enum {
	ODT_HEADER = 100,
	ODT_TAB,
	ODT_LISTVIEW // = 102
}

enum {
	SB_SETBKCOLOR = 0x2001
}

static if (_WIN32_IE >= 0x300) {
	enum {
		SB_ISSIMPLE = 1038
	}

	enum {
		MCSC_BACKGROUND,
		MCSC_TEXT,
		MCSC_TITLEBK,
		MCSC_TITLETEXT,
		MCSC_MONTHBK,
		MCSC_TRAILINGTEXT // = 5
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		MCHT_TITLE            = 0x10000,
		MCHT_CALENDAR         = 0x20000,
		MCHT_TODAYLINK        = 0x30000,
		MCHT_NEXT             = 0x1000000,
		MCHT_PREV             = 0x2000000,
		MCHT_NOWHERE          = 0x00,
		MCHT_TITLEBK          = MCHT_TITLE,
		MCHT_TITLEMONTH       = MCHT_TITLE | 0x0001,
		MCHT_TITLEYEAR        = MCHT_TITLE | 0x0002,
		MCHT_TITLEBTNNEXT     = MCHT_TITLE | MCHT_NEXT | 0x0003,
		MCHT_TITLEBTNPREV     = MCHT_TITLE | MCHT_PREV | 0x0003,
		MCHT_CALENDARBK       = MCHT_CALENDAR,
		MCHT_CALENDARDATE     = MCHT_CALENDAR | 0x0001,
		MCHT_CALENDARDATENEXT = MCHT_CALENDARDATE | MCHT_NEXT,
		MCHT_CALENDARDATEPREV = MCHT_CALENDARDATE | MCHT_PREV,
		MCHT_CALENDARDAY      = MCHT_CALENDAR | 0x0002,
		MCHT_CALENDARWEEKNUM  = MCHT_CALENDAR | 0x0003
	}
}

enum {
	RBS_TOOLTIPS    = 256,
	RBS_VARHEIGHT   = 512,
	RBS_BANDBORDERS = 1024,
	RBS_FIXEDORDER  = 2048
}

enum {
	RBIM_IMAGELIST = 1
}

enum {
	RB_SETCOLORSCHEME = CCM_SETCOLORSCHEME,
	RB_GETCOLORSCHEME = CCM_GETCOLORSCHEME
}

enum {
	RBBS_BREAK          = 0x0001,
	RBBS_FIXEDSIZE      = 0x0002,
	RBBS_CHILDEDGE      = 0x0004,
	RBBS_HIDDEN         = 0x0008,
	RBBS_NOVERT         = 0x0010,
	RBBS_FIXEDBMP       = 0x0020,
	RBBS_VARIABLEHEIGHT = 0x0040,
	RBBS_GRIPPERALWAYS  = 0x0080,
	RBBS_NOGRIPPER      = 0x0100
}

static if (_WIN32_IE >= 0x500) {
	enum {
		RBBS_USECHEVRON = 0x0200
	}
}

static if (_WIN32_IE >= 0x501) {
	enum {
		RBBS_HIDETITLE = 0x0400,
		RBBS_TOPALIGN  = 0x0800
	}
}

enum {
	RBBIM_STYLE      = 1,
	RBBIM_COLORS     = 2,
	RBBIM_TEXT       = 4,
	RBBIM_IMAGE      = 8,
	RBBIM_CHILD      = 16,
	RBBIM_CHILDSIZE  = 32,
	RBBIM_SIZE       = 64,
	RBBIM_BACKGROUND = 128,
	RBBIM_ID         = 256
}

enum {
	RB_INSERTBANDA  = WM_USER + 1,
	RB_DELETEBAND,
	RB_GETBARINFO,
	RB_SETBARINFO, // = WM_USER + 4
	RB_SETBANDINFOA = WM_USER + 6,
	RB_SETPARENT    = WM_USER + 7,
	RB_INSERTBANDW  = WM_USER + 10,
	RB_SETBANDINFOW,
	RB_GETBANDCOUNT,
	RB_GETROWCOUNT,
	RB_GETROWHEIGHT // = WM_USER + 14,
}

enum {
	RBN_HEIGHTCHANGE = RBN_FIRST
}

static if (_WIN32_IE >= 0x300) {
	enum {
		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
	}

	version (Unicode) {
		enum {
			LVN_ODFINDITEM = LVN_ODFINDITEMW
		}
	} else {
		enum {
			LVN_ODFINDITEM = LVN_ODFINDITEMA
		}
	}
}

static if (_WIN32_IE >= 0x400) {
	enum {
		SB_SETICON          = 1039,
		SB_SETTIPTEXTA,
		SB_SETTIPTEXTW,
		SB_GETTIPTEXTA,
		SB_GETTIPTEXTW,
		SB_GETICON,      // = 1044
		SB_SETUNICODEFORMAT = 0x2005,
		SB_GETUNICODEFORMAT = 0x2006
	}

	enum {
		PGF_INVISIBLE = 0,
		PGF_NORMAL    = 1,
		PGF_GRAYED    = 2,
		PGF_DEPRESSED = 4,
		PGF_HOT       = 8
	}

	enum {
		PGB_TOPORLEFT,
		PGB_BOTTOMORRIGHT
	}

	enum {
		PGF_SCROLLUP    = 1,
		PGF_SCROLLDOWN  = 2,
		PGF_SCROLLLEFT  = 4,
		PGF_SCROLLRIGHT = 8
	}

	enum {
		PGK_SHIFT   = 1,
		PGK_CONTROL = 2,
		PGK_MENU    = 4
	}

	enum {
		PGF_CALCWIDTH  = 1,
		PGF_CALCHEIGHT = 2
	}

	enum {
		PGM_FIRST    = 0x1400,
		PGM_SETCHILD = PGM_FIRST + 1,
		PGM_RECALCSIZE,
		PGM_FORWARDMOUSE,
		PGM_SETBKCOLOR,
		PGM_GETBKCOLOR,
		PGM_SETBORDER,
		PGM_GETBORDER,
		PGM_SETPOS,
		PGM_GETPOS,
		PGM_SETBUTTONSIZE,
		PGM_GETBUTTONSIZE,
		PGM_GETBUTTONSTATE, // = PGM_FIRST + 12
		PGM_GETDROPTARGET = CCM_GETDROPTARGET
	}

	enum {
		RBS_REGISTERDROP    = 4096,
		RBS_AUTOSIZE        = 8192,
		RBS_VERTICALGRIPPER = 16384,
		RBS_DBLCLKTOGGLE    = 32768
	}

	enum {
		RBBIM_IDEALSIZE  = 512,
		RBBIM_LPARAM     = 1024,
		RBBIM_HEADERSIZE = 2048
	}

	enum {
		RB_HITTEST          = WM_USER + 8,
		RB_GETRECT          = WM_USER + 9,
		RB_IDTOINDEX        = WM_USER + 16,
		RB_GETTOOLTIPS,
		RB_SETTOOLTIPS,
		RB_SETBKCOLOR,
		RB_GETBKCOLOR,
		RB_SETTEXTCOLOR,
		RB_GETTEXTCOLOR,
		RB_SIZETORECT,
		RB_BEGINDRAG,
		RB_ENDDRAG,
		RB_DRAGMOVE,
		RB_GETBARHEIGHT,
		RB_GETBANDINFOW,
		RB_GETBANDINFOA,
		RB_MINIMIZEBAND,
		RB_MAXIMIZEBAND, // = WM_USER + 31
		RB_GETDROPTARGET    = CCM_GETDROPTARGET,
		RB_GETBANDBORDERS   = WM_USER + 34,
		RB_SHOWBAND         = WM_USER + 35,
		RB_SETPALETTE       = WM_USER + 37,
		RB_GETPALETTE       = WM_USER + 38,
		RB_MOVEBAND         = WM_USER + 39,
		RB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
		RB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
	}

	enum {
		RBN_GETOBJECT     = RBN_FIRST - 1,
		RBN_LAYOUTCHANGED = RBN_FIRST - 2,
		RBN_AUTOSIZE      = RBN_FIRST - 3,
		RBN_BEGINDRAG     = RBN_FIRST - 4,
		RBN_ENDDRAG       = RBN_FIRST - 5,
		RBN_DELETINGBAND  = RBN_FIRST - 6,
		RBN_DELETEDBAND   = RBN_FIRST - 7,
		RBN_CHILDSIZE     = RBN_FIRST - 8
	}

	enum {
		RBNM_ID     = 1,
		RBNM_STYLE  = 2,
		RBNM_LPARAM = 4
	}

	enum {
		RBHT_NOWHERE = 1,
		RBHT_CAPTION,
		RBHT_CLIENT,
		RBHT_GRABBER
	}

	version (Unicode) {
		alias SB_SETTIPTEXTW SB_SETTIPTEXT;
		alias SB_GETTIPTEXTW SB_GETTIPTEXT;
		alias RB_GETBANDINFOW RB_GETBANDINFO;
	} else {
		alias SB_SETTIPTEXTA SB_SETTIPTEXT;
		alias SB_GETTIPTEXTA SB_GETTIPTEXT;
		alias RB_GETBANDINFOA RB_GETBANDINFO;
	}
} else {
	enum {
		RB_GETBANDINFO = WM_USER + 5
	}
}

enum {
	CBEM_INSERTITEMA = WM_USER + 1,
	CBEM_SETIMAGELIST,
	CBEM_GETIMAGELIST,
	CBEM_GETITEMA,
	CBEM_SETITEMA,
	CBEM_GETCOMBOCONTROL,
	CBEM_GETEDITCONTROL,
	CBEM_SETEXSTYLE,
	CBEM_GETEXSTYLE, // = WM_USER + 9)
	CBEM_DELETEITEM  = CB_DELETESTRING
}

static if (_WIN32_IE >= 0x400) {
	enum {
		CBEM_SETEXTENDEDSTYLE = WM_USER + 14,
		CBEM_GETEXTENDEDSTYLE = WM_USER + 9,
		CBEM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
		CBEM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
	}
}

enum {
	CBEM_HASEDITCHANGED = WM_USER + 10,
	CBEM_INSERTITEMW    = WM_USER + 11,
	CBEM_SETITEMW       = WM_USER + 12,
	CBEM_GETITEMW       = WM_USER + 13
}

enum {
	DA_LAST = 0x7fffffff
}

enum {
	DPA_APPEND = 0x7fffffff,
	DPA_ERR    = -1
}

enum {
	DSA_APPEND = 0x7fffffff,
	DSA_ERR    = -1
}

enum {
	DPAS_SORTED       = 1,
	DPAS_INSERTBEFORE = 2,
	DPAS_INSERTAFTER  = 4
}

static if (_WIN32_IE >= 0x400) {
	enum {
		WSB_PROP_CYVSCROLL = 1,
		WSB_PROP_CXHSCROLL = 2,
		WSB_PROP_CYHSCROLL = 4,
		WSB_PROP_CXVSCROLL = 8,
		WSB_PROP_CXHTHUMB  = 16,
		WSB_PROP_CYVTHUMB  = 32,
		WSB_PROP_VBKGCOLOR = 64,
		WSB_PROP_HBKGCOLOR = 128,
		WSB_PROP_VSTYLE    = 256,
		WSB_PROP_HSTYLE    = 512,
		WSB_PROP_WINSTYLE  = 1024,
		WSB_PROP_PALETTE   = 2048,
		WSB_PROP_MASK      = 0xfff,
		FSB_FLAT_MODE      = 2,
		FSB_ENCARTA_MODE   = 1,
		FSB_REGULAR_MODE   = 0
	}
}

static if (_WIN32_WINNT >= 0x0501) {
	enum {
		LIF_ITEMINDEX = 1,
		LIF_STATE     = 2,
		LIF_ITEMID    = 4,
		LIF_URL	      = 8
	}

	enum {
		LIS_FOCUSED = 1,
		LIS_ENABLED = 2,
		LIS_VISITED = 4
	}

	enum {
		LM_HITTEST        = WM_USER + 768,
		LM_GETIDEALHEIGHT,
		LM_SETITEM,
		LM_GETITEM     // = WM_USER + 771
	}

	const size_t MAX_LINKID_TEXT  =   48;
	const size_t L_MAX_URL_LENGTH = 2084;
}


struct COMBOBOXEXITEMA {
	UINT   mask;
	int    iItem;
	LPSTR  pszText;
	int    cchTextMax;
	int    iImage;
	int    iSelectedImage;
	int    iOverlay;
	int    iIndent;
	LPARAM lParam;
}
alias COMBOBOXEXITEMA*       PCOMBOBOXEXITEMA;
alias CPtr!(COMBOBOXEXITEMA) PCCOMBOEXITEMA;

struct COMBOBOXEXITEMW {
	UINT   mask;
	int    iItem;
	LPWSTR pszText;
	int    cchTextMax;
	int    iImage;
	int    iSelectedImage;
	int    iOverlay;
	int    iIndent;
	LPARAM lParam;
}
alias COMBOBOXEXITEMW*       PCOMBOBOXEXITEMW;
alias CPtr!(COMBOBOXEXITEMW) PCCOMBOEXITEMW;

static if (_WIN32_IE >= 0x400) {
	struct NMCOMBOBOXEXA {
		NMHDR           hdr;
		COMBOBOXEXITEMA ceItem;
	}
	alias NMCOMBOBOXEXA* PNMCOMBOBOXEXA;

	struct NMCOMBOBOXEXW {
		NMHDR           hdr;
		COMBOBOXEXITEMW ceItem;
	}
	alias NMCOMBOBOXEXW* PNMCOMBOBOXEXW;

	struct NMCBEDRAGBEGINW {
		NMHDR hdr;
		int   iItemid;
		WCHAR szText[CBEMAXSTRLEN];
	}
	alias NMCBEDRAGBEGINW* LPNMCBEDRAGBEGINW, PNMCBEDRAGBEGINW;

	struct NMCBEDRAGBEGINA {
		NMHDR hdr;
		int   iItemid;
		char  szText[CBEMAXSTRLEN];
	}
	alias NMCBEDRAGBEGINA* LPNMCBEDRAGBEGINA, PNMCBEDRAGBEGINA;

	struct NMIPADDRESS {
		NMHDR hdr;
		int   iField;
		int   iValue;
	}
	alias NMIPADDRESS* LPNMIPADDRESS;

	struct NMLVKEYDOWN {
		NMHDR hdr;
		WORD  wVKey;
		UINT  flags;
	}
	alias NMLVKEYDOWN* LPNMLVKEYDOWN;

	struct NMPGCALCSIZE {
		NMHDR hdr;
		DWORD dwFlag;
		int   iWidth;
		int   iHeight;
	}
	alias NMPGCALCSIZE* LPNMPGCALCSIZE;

	struct NMPGSCROLL {
		NMHDR hdr;
		BOOL  fwKeys;
		RECT  rcParent;
		int   iDir;
		int   iXpos;
		int   iYpos;
		int   iScroll;
	}
	alias NMPGSCROLL* LPNMPGSCROLL;

	struct NMSELCHANGE {
		NMHDR      nmhdr;
		SYSTEMTIME stSelStart;
		SYSTEMTIME stSelEnd;
	}
	alias NMSELCHANGE* LPNMSELCHANGE;

	struct NMTBHOTITEM {
		NMHDR hdr;
		int   idOld;
		int   idNew;
		DWORD dwFlags;
	}
	alias NMTBHOTITEM* LPNMTBHOTITEM;

	struct NMTBDISPINFOA {
		NMHDR     hdr;
		DWORD     dwMask;
		int       idCommand;
		DWORD_PTR lParam;
		int       iImage;
		LPSTR     pszText;
		int       cchText;
	}
	alias NMTBDISPINFOA* LPNMTBDISPINFOA;

	struct NMTBDISPINFOW {
		NMHDR     hdr;
		DWORD     dwMask;
		int       idCommand;
		DWORD_PTR lParam;
		int       iImage;
		LPWSTR    pszText;
		int       cchText;
	}
	alias NMTBDISPINFOW* LPNMTBDISPINFOW;

	struct NMTBGETINFOTIPA {
		NMHDR  hdr;
		LPSTR  pszText;
		int    cchTextMax;
		int    iItem;
		LPARAM lParam;
	}
	alias NMTBGETINFOTIPA* LPNMTBGETINFOTIPA;

	struct NMTBGETINFOTIPW {
		NMHDR  hdr;
		LPWSTR pszText;
		int    cchTextMax;
		int    iItem;
		LPARAM lParam;
	}
	alias NMTBGETINFOTIPW* LPNMTBGETINFOTIPW;

	struct NMMOUSE {
		NMHDR     hdr;
		DWORD_PTR dwItemSpec;
		DWORD_PTR dwItemData;
		POINT     pt;
		LPARAM    dwHitInfo;
	}
	alias NMMOUSE* LPNMMOUSE;
}

static if (_WIN32_IE >= 0x401) {
	struct NMTOOLTIPSCREATED {
		NMHDR hdr;
		HWND  hwndToolTips;
	}
	alias NMTOOLTIPSCREATED* LPNMTOOLTIPSCREATED;
}

struct NMDATETIMECHANGE {
	NMHDR      nmhdr;
	DWORD      dwFlags;
	SYSTEMTIME st;
}
alias NMDATETIMECHANGE* LPNMDATETIMECHANGE;

struct NMCBEENDEDITW {
	NMHDR hdr;
	BOOL  fChanged;
	int   iNewSelection;
	WCHAR szText[CBEMAXSTRLEN];
	int   iWhy;
}
alias NMCBEENDEDITW* LPNMCBEENDEDITW, PNMCBEENDEDITW;

struct NMCBEENDEDITA {
	NMHDR hdr;
	BOOL  fChanged;
	int   iNewSelection;
	char  szText[CBEMAXSTRLEN];
	int   iWhy;
}
alias NMCBEENDEDITA* LPNMCBEENDEDITA, PNMCBEENDEDITA;

struct COLORMAP {
	COLORREF from;
	COLORREF to;
}
alias COLORMAP* LPCOLORMAP;

struct DRAGLISTINFO {
	UINT  uNotification;
	HWND  hWnd;
	POINT ptCursor;
}
alias DRAGLISTINFO* LPDRAGLISTINFO;

struct TBBUTTON {
	int   iBitmap;
	int   idCommand;
	BYTE  fsState;
	BYTE  fsStyle;
	BYTE  bReserved[2];
	DWORD dwData;
	int   iString;
}
alias TBBUTTON*       PTBBUTTON, LPTBBUTTON;
alias CPtr!(TBBUTTON) LPCTBBUTTON;

static if (_WIN32_IE >= 0x400) {
	struct TBBUTTONINFOA {
		UINT  cbSize = TBBUTTONINFOA.sizeof;
		DWORD dwMask;
		int   idCommand;
		int   iImage;
		BYTE  fsState;
		BYTE  fsStyle;
		WORD  cx;
		DWORD lParam;
		LPSTR pszText;
		int   cchText;
	}
	alias TBBUTTONINFOA* LPTBBUTTONINFOA;

	struct TBBUTTONINFOW {
		UINT   cbSize = TBBUTTONINFOW.sizeof;
		DWORD  dwMask;
		int    idCommand;
		int    iImage;
		BYTE   fsState;
		BYTE   fsStyle;
		WORD   cx;
		DWORD  lParam;
		LPWSTR pszText;
		int    cchText;
	}
	alias TBBUTTONINFOW* LPTBBUTTONINFOW;

	struct TBINSERTMARK {
		int   iButton;
		DWORD dwFlags;
	}
	alias TBINSERTMARK* LPTBINSERTMARK;

	struct LVBKIMAGEA {
		ULONG   ulFlags;
		HBITMAP hbm;
		LPSTR   pszImage;
		UINT    cchImageMax;
		int     xOffsetPercent;
		int     yOffsetPercent;
	}
	alias LVBKIMAGEA* LPLVBKIMAGEA;

	struct LVBKIMAGEW {
		ULONG   ulFlags;
		HBITMAP hbm;
		LPWSTR  pszImage;
		UINT    cchImageMax;
		int     xOffsetPercent;
		int     yOffsetPercent;
	}
	alias LVBKIMAGEW* LPLVBKIMAGEW;
}

/*struct TBNOTIFY {
	NMHDR    hdr;
	int      iItem;
	TBBUTTON tbButton;
	int      cchText;
	LPTSTR   pszText;
}
alias TBNOTIFY* LPTBNOTIFY;
*/

/*struct TBSAVEPARAMS {
	HKEY    hkr;
	LPCTSTR pszSubKey;
	LPCTSTR pszValueName;
}*/

struct IMAGEINFO {
	HBITMAP hbmImage;
	HBITMAP hbmMask;
	int     Unused1;
	int     Unused2;
	RECT    rcImage;
}
alias IMAGEINFO* LPIMAGEINFO;

alias HANDLE HIMAGELIST;

static if (_WIN32_IE >= 0x500) {
	struct HDITEMA {
		UINT    mask;
		int     cxy;
		LPSTR   pszText;
		HBITMAP hbm;
		int     cchTextMax;
		int     fmt;
		LPARAM  lParam;
		int     iImage;
		int     iOrder;
		UINT    type;
		LPVOID  pvFilter;
	}

	struct HDITEMW {
		UINT    mask;
		int     cxy;
		LPWSTR  pszText;
		HBITMAP hbm;
		int     cchTextMax;
		int     fmt;
		LPARAM  lParam;
		int     iImage;
		int     iOrder;
		UINT    type;
		LPVOID  pvFilter;
	}
} else static if (_WIN32_IE >= 0x300) {
	struct HDITEMA {
		UINT    mask;
		int     cxy;
		LPSTR   pszText;
		HBITMAP hbm;
		int     cchTextMax;
		int     fmt;
		LPARAM  lParam;
		int     iImage;
		int     iOrder;
	}

	struct HDITEMW {
		UINT    mask;
		int     cxy;
		LPWSTR  pszText;
		HBITMAP hbm;
		int     cchTextMax;
		int     fmt;
		LPARAM  lParam;
		int     iImage;
		int     iOrder;
	}
} else {
	struct HDITEMA {
		UINT    mask;
		int     cxy;
		LPSTR   pszText;
		HBITMAP hbm;
		int     cchTextMax;
		int     fmt;
		LPARAM  lParam;
	}

	struct HDITEMW {
		UINT    mask;
		int     cxy;
		LPWSTR  pszText;
		HBITMAP hbm;
		int     cchTextMax;
		int     fmt;
		LPARAM  lParam;
	}
}
alias HDITEMA* LPHDITEMA;
alias HDITEMW* LPHDITEMW;

deprecated {
	alias HDITEMA HD_ITEMA;
	alias HDITEMW HD_ITEMW;
	//alias HDITEM HD_ITEM; fixme
}

struct HD_LAYOUT {
	RECT*      prc;
	WINDOWPOS* pwpos;
}
alias HDLAYOUT* LPHDLAYOUT;
deprecated alias HD_LAYOUT HDLAYOUT;

struct HD_HITTESTINFO {
	POINT pt;
	UINT  flags;
	int   iItem;
}
alias HD_HITTESTINFO* LPHDHITTESTINFO;

struct HD_NOTIFYA {
	NMHDR    hdr;
	int      iItem;
	int      iButton;
	HDITEMA* pitem;
}

struct HD_NOTIFYW {
	NMHDR    hdr;
	int      iItem;
	int      iButton;
	HDITEMW* pitem;
}

/* FIXME: NMHEADER structure (base for all events of the comctl controls)
   is the same as HD_NOTIFY depending on the value of _WIN32_IE macro.
   I'm defining both for now. */
struct NMHEADERA {
	NMHDR    hdr;
	int      iItem;
	int      iButton;
	HDITEMA* pitem;
}
alias NMHEADERA* LPNMHEADERA;

struct NMHEADERW {
	NMHDR    hdr;
	int      iItem;
	int      iButton;
	HDITEMW* pitem;
}
alias NMHEADERW* LPNMHEADERW;

version (Unicode) {
	alias NMHEADERW NMHEADER;
	alias LPNMHEADERW LPNMHEADER;
} else {
	alias NMHEADERA NMHEADER;
	alias LPNMHEADERA LPNMHEADER;
}
// End FIXME

struct NMHDDISPINFOA {
	NMHDR  hdr;
	int    iItem;
	UINT   mask;
	LPSTR  pszText;
	int    cchTextMax;
	int    iImage;
	LPARAM lParam;
}
alias NMHDDISPINFOA* LPNMHDDISPINFOA;

struct NMHDDISPINFOW {
	NMHDR  hdr;
	int    iItem;
	UINT   mask;
	LPWSTR pszText;
	int    cchTextMax;
	int    iImage;
	LPARAM lParam;
}
alias NMHDDISPINFOW* LPNMHDDISPINFOW;

struct NMCUSTOMDRAW {
	NMHDR  hdr;
	DWORD  dwDrawStage;
	HDC    hdc;
	RECT   rc;
	DWORD  dwItemSpec;
	UINT   uItemState;
	LPARAM lItemlParam;
}
alias NMCUSTOMDRAW* LPNMCUSTOMDRAW;

static if (_WIN32_IE >= 0x400) {
	struct NMLVCUSTOMDRAW {
		NMCUSTOMDRAW nmcd;
		COLORREF     clrText;
		COLORREF     clrTextBk;
		int          iSubItem;
	}
} else {
	struct NMLVCUSTOMDRAW {
		NMCUSTOMDRAW nmcd;
		COLORREF     clrText;
		COLORREF     clrTextBk;
	}
}
alias NMLVCUSTOMDRAW* LPNMLVCUSTOMDRAW;

static if (_WIN32_IE >= 0x400) {
	struct NMLVGETINFOTIPA {
		NMHDR  hdr;
		DWORD  dwFlags;
		LPSTR  pszText;
		int    cchTextMax;
		int    iItem;
		int    iSubItem;
		LPARAM lParam;
	}
	alias NMLVGETINFOTIPA* LPNMLVGETINFOTIPA;

	struct NMLVGETINFOTIPW {
		NMHDR  hdr;
		DWORD  dwFlags;
		LPWSTR pszText;
		int    cchTextMax;
		int    iItem;
		int    iSubItem;
		LPARAM lParam;
	}
	alias NMLVGETINFOTIPW* LPNMLVGETINFOTIPW;
}

static if (_WIN32_IE >= 0x400) {
	struct NMTVCUSTOMDRAW {
		NMCUSTOMDRAW nmcd;
		COLORREF     clrText;
		COLORREF     clrTextBk;
		int          iLevel;
	}
} else {
	struct NMTVCUSTOMDRAW {
		NMCUSTOMDRAW nmcd;
		COLORREF     clrText;
		COLORREF     clrTextBk;
	}
}
alias NMTVCUSTOMDRAW* LPNMTVCUSTOMDRAW;

static if (_WIN32_IE >= 0x400) {
	static if (_WIN32_WINNT >= 0x501) {
		struct NMTBCUSTOMDRAW {
			NMCUSTOMDRAW nmcd;
			HBRUSH       hbrMonoDither;
			HBRUSH       hbrLines;
			HPEN         hpenLines;
			COLORREF     clrText;
			COLORREF     clrMark;
			COLORREF     clrTextHighlight;
			COLORREF     clrBtnFace;
			COLORREF     clrBtnHighlight;
			COLORREF     clrHighlightHotTrack;
			RECT         rcText;
			int          nStringBkMode;
			int          nHLStringBkMode;
			int          iListGap;
		}
	} else {
		struct NMTBCUSTOMDRAW {
			NMCUSTOMDRAW nmcd;
			HBRUSH       hbrMonoDither;
			HBRUSH       hbrLines;
			HPEN         hpenLines;
			COLORREF     clrText;
			COLORREF     clrMark;
			COLORREF     clrTextHighlight;
			COLORREF     clrBtnFace;
			COLORREF     clrBtnHighlight;
			COLORREF     clrHighlightHotTrack;
			RECT         rcText;
			int          nStringBkMode;
			int          nHLStringBkMode;
		}
	}
	alias NMTBCUSTOMDRAW* LPNMTBCUSTOMDRAW;

	struct NMITEMACTIVATE {
		NMHDR  hdr;
		int    iItem;
		int    iSubItem;
		UINT   uNewState;
		UINT   uOldState;
		UINT   uChanged;
		POINT  ptAction;
		LPARAM lParam;
		UINT   uKeyFlags;
	}
	alias NMITEMACTIVATE* LPNMITEMACTIVATE;
}

struct TBADDBITMAP {
	HINSTANCE hInst;
	UINT      nID;
}
alias TBADDBITMAP* LPTBADDBITMAP;

struct TBSAVEPARAMSA {
	HKEY   hkr;
	LPCSTR pszSubKey;
	LPCSTR pszValueName;
}

struct TBSAVEPARAMSW {
	HKEY    hkr;
	LPCWSTR pszSubKey;
	LPCWSTR pszValueName;
}

struct TBREPLACEBITMAP {
	HINSTANCE hInstOld;
	UINT      nIDOld;
	HINSTANCE hInstNew;
	UINT      nIDNew;
	int       nButtons;
}
alias TBREPLACEBITMAP* LPTBREPLACEBITMAP;

static if (_WIN32_IE >= 0x500) {
	struct NMTOOLBARA {
		NMHDR    hdr;
		int      iItem;
		TBBUTTON tbButton;
		int      cchText;
		LPSTR    pszText;
		RECT     rcButton;
	}

	struct NMTOOLBARW {
		NMHDR    hdr;
		int      iItem;
		TBBUTTON tbButton;
		int      cchText;
		LPWSTR   pszText;
		RECT     rcButton;
	}
} else {
	struct NMTOOLBARA {
		NMHDR    hdr;
		int      iItem;
		TBBUTTON tbButton;
		int      cchText;
		LPSTR    pszText;
	}

	struct NMTOOLBARW {
		NMHDR    hdr;
		int      iItem;
		TBBUTTON tbButton;
		int      cchText;
		LPWSTR   pszText;
	}
}
alias NMTOOLBARA* LPNMTOOLBARA;
alias NMTOOLBARW* LPNMTOOLBARW;

alias NMTOOLBARA TBNOTIFYA;
alias LPNMTOOLBARA LPTBNOTIFYA;

alias NMTOOLBARW TBNOTIFYW;
alias LPNMTOOLBARW LPTBNOTIFYW;

static if (_WIN32_WINNT >= 0x501) {
	struct TOOLINFOA {
		UINT      cbSize = TOOLINFOA.sizeof;
		UINT      uFlags;
		HWND      hwnd;
		UINT      uId;
		RECT      rect;
		HINSTANCE hinst;
		LPSTR     lpszText;
		LPARAM    lParam;
		void*     lpReserved;
	}

	struct TOOLINFOW {
		UINT      cbSize = TOOLINFOW.sizeof;
		UINT      uFlags;
		HWND      hwnd;
		UINT      uId;
		RECT      rect;
		HINSTANCE hinst;
		LPWSTR    lpszText;
		LPARAM    lParam;
		void*     lpReserved;
	}

	const size_t
		TTTOOLINFOA_V1_SIZE = TOOLINFOA.lParam.offsetof,
		TTTOOLINFOW_V1_SIZE = TOOLINFOW.lParam.offsetof,
		TTTOOLINFOA_V2_SIZE = TOOLINFOA.lpReserved.offsetof,
		TTTOOLINFOW_V2_SIZE = TOOLINFOW.lpReserved.offsetof,
		TTTOOLINFOA_V3_SIZE = TOOLINFOA.sizeof,
		TTTOOLINFOW_V3_SIZE = TOOLINFOW.sizeof;
} else static if (_WIN32_IE >= 0x300) {
	struct TOOLINFOA {
		UINT      cbSize = TOOLINFOA.sizeof;
		UINT      uFlags;
		HWND      hwnd;
		UINT      uId;
		RECT      rect;
		HINSTANCE hinst;
		LPSTR     lpszText;
		LPARAM    lParam;
	}

	struct TOOLINFOW {
		UINT      cbSize = TOOLINFOW.sizeof;
		UINT      uFlags;
		HWND      hwnd;
		UINT      uId;
		RECT      rect;
		HINSTANCE hinst;
		LPWSTR    lpszText;
		LPARAM    lParam;
	}

	const size_t
		TTTOOLINFOA_V1_SIZE = TOOLINFOA.lParam.offsetof,
		TTTOOLINFOW_V1_SIZE = TOOLINFOW.lParam.offsetof,
		TTTOOLINFOA_V2_SIZE = TOOLINFOA.sizeof,
		TTTOOLINFOW_V2_SIZE = TOOLINFOW.sizeof;
} else {
	struct TOOLINFOA {
		UINT      cbSize = TOOLINFOA.sizeof;
		UINT      uFlags;
		HWND      hwnd;
		UINT      uId;
		RECT      rect;
		HINSTANCE hinst;
		LPSTR     lpszText;
	}

	struct TOOLINFOW {
		UINT      cbSize = TOOLINFOW.sizeof;
		UINT      uFlags;
		HWND      hwnd;
		UINT      uId;
		RECT      rect;
		HINSTANCE hinst;
		LPWSTR    lpszText;
	}

	const size_t
		TTTOOLINFOA_V1_SIZE = TOOLINFOA.sizeof,
		TTTOOLINFOW_V1_SIZE = TOOLINFOW.sizeof;
}
alias TOOLINFOA TTTOOLINFOA;
alias TOOLINFOW TTTOOLINFOW;
alias TTTOOLINFOA* LPTTTOOLINFOA, PTOOLINFOA, LPTOOLINFOA;
alias TTTOOLINFOW* LPTTTOOLINFOW, PTOOLINFOW, LPTOOLINFOW;

struct TTHITTESTINFOA {
	HWND      hwnd;
	POINT     pt;
	TOOLINFOA ti;
}
alias TTHITTESTINFOA* LPTTHITTESTINFOA, LPHITTESTINFOA;

struct TTHITTESTINFOW {
	HWND      hwnd;
	POINT     pt;
	TOOLINFOW ti;
}
alias TTHITTESTINFOW* LPTTHITTESTINFOW, LPHITTESTINFOW;

static if (_WIN32_IE >= 0x300) {
	struct NMTTDISPINFOA {
		NMHDR     hdr;
		LPSTR     lpszText;
		char      szText[80];
		HINSTANCE hinst;
		UINT      uFlags;
		LPARAM    lParam;
	}

	struct NMTTDISPINFOW {
		NMHDR     hdr;
		LPWSTR    lpszText;
		WCHAR     szText[80];
		HINSTANCE hinst;
		UINT      uFlags;
		LPARAM    lParam;
	}
} else {
	struct NMTTDISPINFOA {
		NMHDR     hdr;
		LPSTR     lpszText;
		char      szText[80];
		HINSTANCE hinst;
		UINT      uFlags;
	}

	struct NMTTDISPINFOW {
		NMHDR     hdr;
		LPWSTR    lpszText;
		WCHAR     szText[80];
		HINSTANCE hinst;
		UINT      uFlags;
	}
}
alias NMTTDISPINFOA* LPNMTTDISPINFOA;
alias NMTTDISPINFOW* LPNMTTDISPINFOW;
alias NMTTDISPINFOA TOOLTIPTEXTA;
alias LPNMTTDISPINFOA LPTOOLTIPTEXTA;
alias NMTTDISPINFOW TOOLTIPTEXTW;
alias LPNMTTDISPINFOW LPTOOLTIPTEXTW;

struct UDACCEL {
	UINT nSec;
	UINT nInc;
}
alias UDACCEL* LPUDACCEL;

struct NMUPDOWN {
	NMHDR hdr;
	int   iPos;
	int   iDelta;
}
alias NMUPDOWN* LPNMUPDOWN;

deprecated {
	alias NMUPDOWN NM_UPDOWN;
	alias LPNMUPDOWN LPNM_UPDOWN;
}

static if (_WIN32_WINNT >= 0x501) {
	struct LVITEMA {
		UINT   mask;
		int    iItem;
		int    iSubItem;
		UINT   state;
		UINT   stateMask;
		LPSTR  pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
		int    iIndent;
		int    iGroupId;
		UINT   cColumns;
		PUINT  puColumns;
	}

	struct LVITEMW {
		UINT   mask;
		int    iItem;
		int    iSubItem;
		UINT   state;
		UINT   stateMask;
		LPWSTR pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
		int    iIndent;
		int    iGroupId;
		UINT   cColumns;
		PUINT  puColumns;
	}
} else static if (_WIN32_IE >= 0x300) {
	struct LVITEMA {
		UINT   mask;
		int    iItem;
		int    iSubItem;
		UINT   state;
		UINT   stateMask;
		LPSTR  pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
		int    iIndent;
	}

	struct LVITEMW {
		UINT   mask;
		int    iItem;
		int    iSubItem;
		UINT   state;
		UINT   stateMask;
		LPWSTR pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
		int    iIndent;
	}
} else {
	struct LVITEMA {
		UINT   mask;
		int    iItem;
		int    iSubItem;
		UINT   state;
		UINT   stateMask;
		LPSTR  pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
	}

	struct LVITEMW {
		UINT   mask;
		int    iItem;
		int    iSubItem;
		UINT   state;
		UINT   stateMask;
		LPWSTR pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
	}
}
alias LVITEMA* LPLVITEMA;
alias LVITEMW* LPLVITEMW;
alias LVITEMA LV_ITEMA;
alias LVITEMW LV_ITEMW;

struct LVFINDINFOA {
	UINT   flags;
	LPCSTR psz;
	LPARAM lParam;
	POINT  pt;
	UINT   vkDirection;
}

struct LVFINDINFOW {
	UINT    flags;
	LPCWSTR psz;
	LPARAM  lParam;
	POINT   pt;
	UINT    vkDirection;
}

alias LVFINDINFOA* LPFINDINFOA;
alias LVFINDINFOA LV_FINDINFOA;
alias LVFINDINFOW* LPFINDINFOW;
alias LVFINDINFOW LV_FINDINFOW;

struct NMLVFINDITEMA {
	NMHDR       hdr;
	int         iStart;
	LVFINDINFOA lvfi;
}

struct NMLVFINDITEMW {
	NMHDR       hdr;
	int         iStart;
	LVFINDINFOW lvfi;
}

alias NMLVFINDITEMA* PNMLVFINDITEMA, LPNMLVFINDITEMA;
alias NMLVFINDITEMW* PNMLVFINDITEMW, LPNMLVFINDITEMW;

static if (_WIN32_IE >= 0x300) {
	struct LVHITTESTINFO {
		POINT pt;
		UINT  flags;
		int   iItem;
		int   iSubItem;
	}
} else {
	struct LVHITTESTINFO {
		POINT pt;
		UINT  flags;
		int   iItem;
	}
}
alias LVHITTESTINFO* LPLVHITTESTINFO;
alias LVHITTESTINFO LV_HITTESTINFO;

static if (_WIN32_IE >= 0x300) {
	struct LVCOLUMNA {
		UINT  mask;
		int   fmt;
		int   cx;
		LPSTR pszText;
		int   cchTextMax;
		int   iSubItem;
		int   iImage;
		int   iOrder;
	}
	struct LVCOLUMNW {
		UINT   mask;
		int    fmt;
		int    cx;
		LPWSTR pszText;
		int    cchTextMax;
		int    iSubItem;
		int    iImage;
		int    iOrder;
	}
} else {
	struct LVCOLUMNA {
		UINT  mask;
		int   fmt;
		int   cx;
		LPSTR pszText;
		int   cchTextMax;
		int   iSubItem;
	}
	struct LVCOLUMNW {
		UINT   mask;
		int    fmt;
		int    cx;
		LPWSTR pszText;
		int    cchTextMax;
		int    iSubItem;
	}
}
alias LVCOLUMNA* LPLVCOLUMNA;
alias LVCOLUMNW* LPLVCOLUMNW;
alias LVCOLUMNA LV_COLUMNA;
alias LVCOLUMNW LV_COLUMNW;

static if (_WIN32_WINNT >= 0x501) {
	/*	SG: The definitions in this static if block are from the MSDN docs.
	 *	They are not in MinGW, but nonetheless required for macros that are.
	 */
	struct LVGROUP {
		UINT    cbSize = LVGROUP.sizeof;
		UINT    mask;
		LPWSTR  pszHeader;
		int     cchHeader;
		LPWSTR  pszFooter;
		int     cchFooter;
		int     iGroupId;
		UINT    stateMask;
		UINT    state;
		UINT    uAlign;
		static if (_WIN32_WINNT >= 0x600) {
			LPWSTR  pszSubtitle;
			UINT    cchSubtitle;
			LPWSTR  pszTask;
			UINT    cchTask;
			LPWSTR  pszDescriptionTop;
			UINT    cchDescriptionTop;
			LPWSTR  pszDescriptionBottom;
			UINT    cchDescriptionBottom;
			int     iTitleImage;
			int     iExtendedImage;
			int     iFirstItem;         // Read only
			UINT    cItems;             // Read only
			LPWSTR  pszSubsetTitle;     // NULL if group is not subset
			UINT    cchSubsetTitle;
		}
	}
	alias LVGROUP* PLVGROUP;

	struct LVGROUPMETRICS {
		UINT     cbSize = LVGROUPMETRICS.sizeof;
		UINT     mask;
		UINT     Left;
		UINT     Top;
		UINT     Right;
		UINT     Bottom;
		COLORREF crLeft;
		COLORREF crTop;
		COLORREF crRight;
		COLORREF crBottom;
		COLORREF crHeader;
		COLORREF crFooter;
	}
	alias LVGROUPMETRICS* PLVGROUPMETRICS;

	struct LVINSERTMARK {
		UINT  cbSize = LVINSERTMARK.sizeof;
		DWORD dwFlags;
		int   iItem;
		DWORD dwReserved;
	}
	alias LVINSERTMARK* PLVINSERTMARK;

	struct LVTILEINFO {
		UINT     cbSize = LVTILEINFO.sizeof;
		int      iItem;
		UINT     cColumns;
		PUINT    puColumns;
		static if (_WIN32_WINNT >= 0x600) {
			int* piColFmt;
		}
	}
	alias LVTILEINFO* PLVTILEINFO;

	struct LVTILEVIEWINFO {
		UINT  cbSize = LVTILEVIEWINFO.sizeof;
		DWORD dwMask;
		DWORD dwFlags;
		SIZE  sizeTile;
		int   cLines;
		RECT  rcLabelMargin;
	}
	alias LVTILEVIEWINFO* PLVTILEVIEWINFO;

	struct LVINSERTGROUPSORTED {
		PFNLVGROUPCOMPARE pfnGroupCompare;
		LPVOID* pvData;
		LVGROUP lvGroup;
	}
	alias LVINSERTGROUPSORTED* PLVINSERTGROUPSORTED;

	alias int function(INT, INT, VOID*) PFNLVGROUPCOMPARE;

	struct LVSETINFOTIP {
		UINT    cbSize = LVSETINFOTIP.sizeof;
		DWORD   dwFlags;
		LPWSTR  pszText;
		int     iItem;
		int     iSubItem;
		HBITMAP hbmp;
	}
	alias LVSETINFOTIP* PLVSETINFOTIP;
}

alias int function(LPARAM, LPARAM, LPARAM) PFNLVCOMPARE;

struct NMLISTVIEW {
	NMHDR  hdr;
	int    iItem;
	int    iSubItem;
	UINT   uNewState;
	UINT   uOldState;
	UINT   uChanged;
	POINT  ptAction;
	LPARAM lParam;
}
alias NMLISTVIEW* LPNMLISTVIEW;

deprecated {
	alias NMLISTVIEW NM_LISTVIEW;
	alias LPNMLISTVIEW LPNM_LISTVIEW;
}

struct NMLVDISPINFOA {
	NMHDR    hdr;
	LV_ITEMA item;
}
alias NMLVDISPINFOA* LPNMLVDISPINFOA;
alias NMLVDISPINFOA LV_DISPINFOA;

struct NMLVDISPINFOW {
	NMHDR    hdr;
	LV_ITEMW item;
}
alias NMLVDISPINFOW* LPNMLVDISPINFOW;
alias NMLVDISPINFOW LV_DISPINFOW;

struct LV_KEYDOWN {
	NMHDR hdr;
	WORD  wVKey;
	UINT  flags;
}

struct NMLVCACHEHINT {
	NMHDR hdr;
	int   iFrom;
	int   iTo;
}
alias NMLVCACHEHINT* LPNMLVCACHEHINT, PNM_CACHEHINT, LPNM_CACHEHINT;
alias NMLVCACHEHINT NM_CACHEHINT;

struct TVITEMA {
	UINT      mask;
	HTREEITEM hItem;
	UINT      state;
	UINT      stateMask;
	LPSTR     pszText;
	int       cchTextMax;
	int       iImage;
	int       iSelectedImage;
	int       cChildren;
	LPARAM    lParam;
}
alias TVITEMA* LPTVITEMA, LPTV_ITEMA;
alias TVITEMA TV_ITEMA;

struct TVITEMW {
	UINT      mask;
	HTREEITEM hItem;
	UINT      state;
	UINT      stateMask;
	LPWSTR    pszText;
	int       cchTextMax;
	int       iImage;
	int       iSelectedImage;
	int       cChildren;
	LPARAM    lParam;
}
alias TVITEMW* LPTVITEMW, LPTV_ITEMW;
alias TVITEMW TV_ITEMW;

static if (_WIN32_IE >= 0x400) {
	struct TVITEMEXA {
		UINT      mask;
		HTREEITEM hItem;
		UINT      state;
		UINT      stateMask;
		LPSTR     pszText;
		int       cchTextMax;
		int       iImage;
		int       iSelectedImage;
		int       cChildren;
		LPARAM    lParam;
		int       iIntegral;
	}
	alias TVITEMEXA* LPTVITEMEXA;

	struct TVITEMEXW {
		UINT      mask;
		HTREEITEM hItem;
		UINT      state;
		UINT      stateMask;
		LPWSTR    pszText;
		int       cchTextMax;
		int       iImage;
		int       iSelectedImage;
		int       cChildren;
		LPARAM    lParam;
		int       iIntegral;
	}
	alias TVITEMEXW* LPTVITEMEXW;
}

static if (_WIN32_IE >= 0x400) {
	struct TVINSERTSTRUCTA {
		HTREEITEM hParent;
		HTREEITEM hInsertAfter;
		union {
			TVITEMEXA itemex;
			TV_ITEMA  item;
		}
	}

	struct TVINSERTSTRUCTW {
		HTREEITEM hParent;
		HTREEITEM hInsertAfter;
		union {
			TVITEMEXW itemex;
			TV_ITEMW  item;
		}
	}
} else {
	struct TVINSERTSTRUCTA {
		HTREEITEM hParent;
		HTREEITEM hInsertAfter;
		TV_ITEMA  item;
	}

	struct TVINSERTSTRUCTW {
		HTREEITEM hParent;
		HTREEITEM hInsertAfter;
		TV_ITEMW  item;
	}
}
alias TVINSERTSTRUCTA* LPTVINSERTSTRUCTA, LPTV_INSERTSTRUCTA;
alias TVINSERTSTRUCTA TV_INSERTSTRUCTA;
alias TVINSERTSTRUCTW* LPTVINSERTSTRUCTW, LPTV_INSERTSTRUCTW;
alias TVINSERTSTRUCTW TV_INSERTSTRUCTW;

struct TVHITTESTINFO {
	POINT     pt;
	UINT      flags;
	HTREEITEM hItem;
}
alias TVHITTESTINFO* LPTVHITTESTINFO, LPTV_HITTESTINFO;
alias TVHITTESTINFO TV_HITTESTINFO;

alias int function(LPARAM, LPARAM, LPARAM) PFNTVCOMPARE;
struct TVSORTCB {
	HTREEITEM    hParent;
	PFNTVCOMPARE lpfnCompare;
	LPARAM       lParam;
}
alias TVSORTCB* LPTVSORTCB, LPTV_SORTCB;
alias TVSORTCB TV_SORTCB;

struct NMTREEVIEWA {
	NMHDR    hdr;
	UINT     action;
	TV_ITEMA itemOld;
	TV_ITEMA itemNew;
	POINT    ptDrag;
}
alias NMTREEVIEWA* LPNMTREEVIEWA, LPNM_TREEVIEWA;
alias NMTREEVIEWA NM_TREEVIEWA;

struct NMTREEVIEWW {
	NMHDR    hdr;
	UINT     action;
	TV_ITEMW itemOld;
	TV_ITEMW itemNew;
	POINT    ptDrag;
}
alias NMTREEVIEWW* LPNMTREEVIEWW, LPNM_TREEVIEWW;
alias NMTREEVIEWW NM_TREEVIEWW;

struct NMTVDISPINFOA {
	NMHDR   hdr;
	TVITEMA item;
}
alias NMTVDISPINFOA* LPNMTVDISPINFOA;
alias NMTVDISPINFOA TV_DISPINFOA;

struct NMTVDISPINFOW {
	NMHDR   hdr;
	TVITEMW item;
}
alias NMTVDISPINFOW* LPNMTVDISPINFOW;
alias NMTVDISPINFOW TV_DISPINFOW;

static if (_WIN32_IE >= 0x400) {
	struct NMTVGETINFOTIPA {
		NMHDR     hdr;
		LPSTR     pszText;
		int       cchTextMax;
		HTREEITEM hItem;
		LPARAM    lParam;
	}
	alias NMTVGETINFOTIPA* LPNMTVGETINFOTIPA;

	struct NMTVGETINFOTIPW {
		NMHDR     hdr;
		LPWSTR    pszText;
		int       cchTextMax;
		HTREEITEM hItem;
		LPARAM    lParam;
	}
	alias NMTVGETINFOTIPW* LPNMTVGETINFOTIPW;
}

struct TV_KEYDOWN {
	NMHDR hdr;
	WORD  wVKey;
	UINT  flags;
}

struct TC_ITEMHEADERA {
	UINT  mask;
	UINT  lpReserved1;
	UINT  lpReserved2;
	LPSTR pszText;
	int   cchTextMax;
	int   iImage;
}

struct TC_ITEMHEADERW {
	UINT   mask;
	UINT   lpReserved1;
	UINT   lpReserved2;
	LPWSTR pszText;
	int    cchTextMax;
	int    iImage;
}

static if (_WIN32_IE >= 0x300) {
	struct TCITEMA {
		UINT   mask;
		DWORD  dwState;
		DWORD  dwStateMask;
		LPSTR  pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
	}

	struct TCITEMW {
		UINT   mask;
		DWORD  dwState;
		DWORD  dwStateMask;
		LPWSTR pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
	}
} else {
	struct TCITEMA {
		UINT   mask;
		UINT   lpReserved1;
		UINT   lpReserved2;
		LPSTR  pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
	}

	struct TCITEMW {
		UINT   mask;
		UINT   lpReserved1;
		UINT   lpReserved2;
		LPWSTR pszText;
		int    cchTextMax;
		int    iImage;
		LPARAM lParam;
	}
}
alias TCITEMA* LPTCITEMA;
alias TCITEMA TC_ITEMA;
alias TCITEMW* LPTCITEMW;
alias TCITEMW TC_ITEMW;

struct TCHITTESTINFO {
	POINT pt;
	UINT  flags;
}
alias TCHITTESTINFO* LPTCHITTESTINFO, LPTC_HITTESTINFO;
alias TCHITTESTINFO TC_HITTESTINFO;

struct TC_KEYDOWN {
	NMHDR hdr;
	WORD wVKey;
	UINT flags;
}

static if (_WIN32_IE >= 0x300) {
	struct INITCOMMONCONTROLSEX {
		DWORD dwSize = INITCOMMONCONTROLSEX.sizeof;
		DWORD dwICC;
	}
	alias INITCOMMONCONTROLSEX* LPINITCOMMONCONTROLSEX;
}

struct PBRANGE {
	int iLow;
	int iHigh;
}
alias PBRANGE* PPBRANGE;

struct COLORSCHEME {
	DWORD    dwSize = COLORSCHEME.sizeof;
	COLORREF clrBtnHighlight;
	COLORREF clrBtnShadow;
}
alias COLORSCHEME* LPCOLORSCHEME;

struct MCHITTESTINFO {
	UINT       cbSize = MCHITTESTINFO.sizeof;
	POINT      pt;
	UINT       uHit;
	SYSTEMTIME st;
}
alias MCHITTESTINFO* PMCHITTESTINFO;

alias DWORD MONTHDAYSTATE;
alias MONTHDAYSTATE* LPMONTHDAYSTATE;

struct NMDAYSTATE {
	NMHDR           nmhdr;
	SYSTEMTIME      stStart;
	int             cDayState;
	LPMONTHDAYSTATE prgDayState;
}
alias NMDAYSTATE* LPNMDAYSTATE;

struct REBARINFO {
	UINT       cbSize = REBARINFO.sizeof;
	UINT       fMask;
	HIMAGELIST himl;
}
alias REBARINFO* LPREBARINFO;

static if (_WIN32_IE >= 0x400) {
	struct REBARBANDINFOA {
		UINT     cbSize = REBARBANDINFOA.sizeof;
		UINT     fMask;
		UINT     fStyle;
		COLORREF clrFore;
		COLORREF clrBack;
		LPSTR    lpText;
		UINT     cch;
		int      iImage;
		HWND     hwndChild;
		UINT     cxMinChild;
		UINT     cyMinChild;
		UINT     cx;
		HBITMAP  hbmBack;
		UINT     wID;
		UINT     cyChild;
		UINT     cyMaxChild;
		UINT     cyIntegral;
		UINT     cxIdeal;
		LPARAM   lParam;
		UINT     cxHeader;
	}

	struct REBARBANDINFOW {
		UINT     cbSize = REBARBANDINFOW.sizeof;
		UINT     fMask;
		UINT     fStyle;
		COLORREF clrFore;
		COLORREF clrBack;
		LPWSTR   lpText;
		UINT     cch;
		int      iImage;
		HWND     hwndChild;
		UINT     cxMinChild;
		UINT     cyMinChild;
		UINT     cx;
		HBITMAP  hbmBack;
		UINT     wID;
		UINT     cyChild;
		UINT     cyMaxChild;
		UINT     cyIntegral;
		UINT     cxIdeal;
		LPARAM   lParam;
		UINT     cxHeader;
	}

	enum : size_t {
		REBARBANDINFOA_V3_SIZE = REBARBANDINFOA.cyChild.offsetof,
		REBARBANDINFOW_V3_SIZE = REBARBANDINFOW.cyChild.offsetof
	}
} else {
	struct REBARBANDINFOA {
		UINT     cbSize = REBARBANDINFOA.sizeof;
		UINT     fMask;
		UINT     fStyle;
		COLORREF clrFore;
		COLORREF clrBack;
		LPSTR    lpText;
		UINT     cch;
		int      iImage;
		HWND     hwndChild;
		UINT     cxMinChild;
		UINT     cyMinChild;
		UINT     cx;
		HBITMAP  hbmBack;
		UINT     wID;
	}

	struct REBARBANDINFOW {
		UINT     cbSize = REBARBANDINFOW.sizeof;
		UINT     fMask;
		UINT     fStyle;
		COLORREF clrFore;
		COLORREF clrBack;
		LPWSTR   lpText;
		UINT     cch;
		int      iImage;
		HWND     hwndChild;
		UINT     cxMinChild;
		UINT     cyMinChild;
		UINT     cx;
		HBITMAP  hbmBack;
		UINT     wID;
	}

	enum : size_t {
		REBARBANDINFOA_V3_SIZE = REBARBANDINFOA.sizeof,
		REBARBANDINFOW_V3_SIZE = REBARBANDINFOW.sizeof
	}
}
alias REBARBANDINFOA*       LPREBARBANDINFOA;
alias CPtr!(REBARBANDINFOA) LPCREBARBANDINFOA;
alias REBARBANDINFOW*       LPREBARBANDINFOW;
alias CPtr!(REBARBANDINFOW) LPCREBARBANDINFOW;

static if (_WIN32_IE >= 0x300) {
	struct NMLVODSTATECHANGE {
		NMHDR hdr;
		int iFrom;
		int iTo;
		UINT uNewState;
		UINT uOldState;
	}
	alias NMLVODSTATECHANGE* LPNMLVODSTATECHANGE;

	static if (_WIN32_WINNT >= 0x501) {
		struct IMAGELISTDRAWPARAMS {
			DWORD      cbSize = IMAGELISTDRAWPARAMS.sizeof;
			HIMAGELIST himl;
			int        i;
			HDC        hdcDst;
			int        x;
			int        y;
			int        cx;
			int        cy;
			int        xBitmap;
			int        yBitmap;
			COLORREF   rgbBk;
			COLORREF   rgbFg;
			UINT       fStyle;
			DWORD      dwRop;
			DWORD      fState;
			DWORD      Frame;
			COLORREF   crEffect;
		}
	} else {
		struct IMAGELISTDRAWPARAMS {
			DWORD      cbSize = IMAGELISTDRAWPARAMS.sizeof;
			HIMAGELIST himl;
			int        i;
			HDC        hdcDst;
			int        x;
			int        y;
			int        cx;
			int        cy;
			int        xBitmap;
			int        yBitmap;
			COLORREF   rgbBk;
			COLORREF   rgbFg;
			UINT       fStyle;
			DWORD      dwRop;
		}
	}
	alias IMAGELISTDRAWPARAMS* LPIMAGELISTDRAWPARAMS;
}

static if (_WIN32_IE >= 0x400) {
	struct NMREBARCHILDSIZE {
		NMHDR hdr;
		UINT  uBand;
		UINT  wID;
		RECT  rcChild;
		RECT  rcBand;
	}
	alias NMREBARCHILDSIZE* LPNMREBARCHILDSIZE;

	struct NMREBAR {
		NMHDR  hdr;
		DWORD  dwMask;
		UINT   uBand;
		UINT   fStyle;
		UINT   wID;
		LPARAM lParam;
	}
	alias NMREBAR* LPNMREBAR;

	struct NMRBAUTOSIZE {
		NMHDR hdr;
		BOOL  fChanged;
		RECT  rcTarget;
		RECT  rcActual;
	}
	alias NMRBAUTOSIZE* LPNMRBAUTOSIZE;

	static if (_WIN32_IE >= 0x500) {
		struct NMREBARCHEVRON {
			NMHDR  hdr;
			UINT   uBand;
			UINT   wID;
			LPARAM lParam;
			RECT   rc;
			LPARAM lParamNM;
		}
		alias NMREBARCHEVRON* LPNMREBARCHEVRON;
	}

	struct RBHITTESTINFO {
		POINT pt;
		UINT  flags;
		int   iBand;
	}
	alias RBHITTESTINFO* LPRBHITTESTINFO;
}

alias HANDLE HDSA;
alias HANDLE HDPA;

version (Unicode) {
	alias HDITEMW HDITEM;
	alias LPHDITEMW LPHDITEM;
	alias TOOLINFOW TOOLINFO;
	alias TOOLINFOW* PTOOLINFO, LPTOOLINFO;
	alias TTHITTESTINFOW TTHITTESTINFO;
	alias TTHITTESTINFOW* LPHITTESTINFO, LPTTHITTESTINFO;
	alias TOOLTIPTEXTW TOOLTIPTEXT;
	alias TOOLTIPTEXTW* LPTOOLTIPTEXT;
	alias NMTTDISPINFOW NMTTDISPINFO;
	alias NMTTDISPINFOW* LPNMTTDISPINFO;
	alias TV_ITEMW TV_ITEM;
	alias TV_ITEMW* LPTV_ITEM;
	alias TVITEMW TVITEM;
	alias TVITEMW* LPTVITEM;

	static if (_WIN32_IE >= 0x400) {
		alias TVITEMEXW TVITEMEX;
		alias TVITEMEXW* LPTVITEMEX;
	}

	alias TV_INSERTSTRUCTW TV_INSERTSTRUCT;
	alias TV_INSERTSTRUCTW* LPTV_INSERTSTRUCT;
	alias TVINSERTSTRUCTW TVINSERTSTRUCT;
	alias TVINSERTSTRUCTW* LPTVINSERTSTRUCT;
	alias NM_TREEVIEWW NM_TREEVIEW;
	alias NM_TREEVIEWW* LPNM_TREEVIEW;
	alias NMTREEVIEWW NMTREEVIEW;
	alias NMTREEVIEWW* LPNMTREEVIEW;
	alias NMHDDISPINFOW NMHDDISPINFO;
	alias NMHDDISPINFOW* LPNMHDDISPINFO;

	alias ACM_OPENW ACM_OPEN;
	alias COMBOBOXEXITEMW COMBOBOXEXITEM;
	alias PCOMBOBOXEXITEMW PCOMBOBOXEXITEM;
	//alias PCCOMBOBOXEXITEMW PCCOMBOBOXEXITEM; fixme
	alias CBEM_INSERTITEMW CBEM_INSERTITEM;
	alias CBEM_SETITEMW CBEM_SETITEM;
	alias CBEM_GETITEMW CBEM_GETITEM;
	alias CBEN_ENDEDITW CBEN_ENDEDIT;
	alias NMCBEENDEDITW NMCBEENDEDIT;
	alias LPNMCBEENDEDITW LPNMCBEENDEDIT;
	alias PNMCBEENDEDITW PNMCBEENDEDIT;

	static if (_WIN32_IE >= 0x400) {
		alias NMCOMBOBOXEXW NMCOMBOBOXEX;
		alias PNMCOMBOBOXEXW PNMCOMBOBOXEX;
		alias CBEN_GETDISPINFOW CBEN_GETDISPINFO;
		alias CBEN_DRAGBEGINW CBEN_DRAGBEGIN;
		alias NMCBEDRAGBEGINW NMCBEDRAGBEGIN;
		alias LPNMCBEDRAGBEGINW LPNMCBEDRAGBEGIN;
		alias PNMCBEDRAGBEGINW PNMCBEDRAGBEGIN;
	}

	alias SB_GETTEXTW SB_GETTEXT;
	alias SB_SETTEXTW SB_SETTEXT;
	alias SB_GETTEXTLENGTHW SB_GETTEXTLENGTH;
	alias HDM_INSERTITEMW HDM_INSERTITEM;
	alias HDM_GETITEMW HDM_GETITEM;
	alias HDM_SETITEMW HDM_SETITEM;
	alias HDN_ITEMCHANGINGW HDN_ITEMCHANGING;
	alias HDN_ITEMCHANGEDW HDN_ITEMCHANGED;
	alias HDN_ITEMCLICKW HDN_ITEMCLICK;
	alias HDN_ITEMDBLCLICKW HDN_ITEMDBLCLICK;
	alias HDN_DIVIDERDBLCLICKW HDN_DIVIDERDBLCLICK;
	alias HDN_BEGINTRACKW HDN_BEGINTRACK;
	alias HDN_ENDTRACKW HDN_ENDTRACK;
	alias HDN_TRACKW HDN_TRACK;

	static if (_WIN32_IE >= 0x300) {
		alias HDN_GETDISPINFOW HDN_GETDISPINFO;
	}

	alias HD_NOTIFYW HD_NOTIFY;
	alias TBSAVEPARAMSW TBSAVEPARAMS;
	alias TB_GETBUTTONTEXTW TB_GETBUTTONTEXT;
	alias TB_SAVERESTOREW TB_SAVERESTORE;
	alias TB_ADDSTRINGW TB_ADDSTRING;

	static if (_WIN32_IE >= 0x400) {
		alias TBN_GETBUTTONINFOW TBN_GETBUTTONINFO;  // fixme
		alias TB_GETBUTTONINFOW TB_GETBUTTONINFO;
		alias TB_SETBUTTONINFOW TB_SETBUTTONINFO;
		alias TB_INSERTBUTTONW TB_INSERTBUTTON;
		alias TB_ADDBUTTONSW TB_ADDBUTTONS;
		alias TB_MAPACCELERATORW TB_MAPACCELERATOR;
		alias TB_GETSTRINGW TB_GETSTRING;
		alias TBBUTTONINFOW TBBUTTONINFO;
		alias LPTBBUTTONINFOW LPTBBUTTONINFO;
		alias TBN_GETDISPINFOW TBN_GETDISPINFO;
		alias NMTBDISPINFOW NMTBDISPINFO;
		alias LPNMTBDISPINFOW LPNMTBDISPINFO;
		alias NMTBGETINFOTIPW NMTBGETINFOTIP;
		alias LPNMTBGETINFOTIPW LPNMTBGETINFOTIP;
	}

	alias TBNOTIFYW TBNOTIFY;
	alias LPTBNOTIFYW LPTBNOTIFY;
	alias NMTOOLBARW NMTOOLBAR;
	alias LPNMTOOLBARW LPNMTOOLBAR;
	alias TTM_ADDTOOLW TTM_ADDTOOL;
	alias TTM_DELTOOLW TTM_DELTOOL;
	alias TTM_NEWTOOLRECTW TTM_NEWTOOLRECT;
	alias TTM_GETTOOLINFOW TTM_GETTOOLINFO;
	alias TTM_SETTOOLINFOW TTM_SETTOOLINFO;
	alias TTM_HITTESTW TTM_HITTEST;
	alias TTM_GETTEXTW TTM_GETTEXT;
	alias TTM_UPDATETIPTEXTW TTM_UPDATETIPTEXT;
	alias TTM_ENUMTOOLSW TTM_ENUMTOOLS;
	alias TTM_GETCURRENTTOOLW TTM_GETCURRENTTOOL;
	alias TTN_NEEDTEXTW TTN_NEEDTEXT;
	alias TTN_GETDISPINFOW TTN_GETDISPINFO;
	//alias SB_GETTEXTW SB_GETTEXT;
	//alias SB_SETTEXTW SB_SETTEXT;
	//alias SB_GETTEXTLENGTHW SB_GETTEXTLENGTH;
	alias LV_ITEMW LV_ITEM;
	alias LVITEMW LVITEM;
	alias LVITEM* LPLVITEM;
	alias LPSTR_TEXTCALLBACKW LPSTR_TEXTCALLBACK;

	static if (_WIN32_IE >= 0x400) {
		alias LVBKIMAGEW LVBKIMAGE;
		alias LPLVBKIMAGEW LPLVBKIMAGE;
		alias LVM_SETBKIMAGEW LVM_SETBKIMAGE;
		alias LVM_GETBKIMAGEW LVM_GETBKIMAGE;
	}

	alias LVM_GETITEMW LVM_GETITEM;
	alias LVM_SETITEMW LVM_SETITEM;
	alias LVM_INSERTITEMW LVM_INSERTITEM;
	alias LV_FINDINFOW LV_FINDINFO;
	alias LVFINDINFOW LVFINDINFO;
	alias LPFINDINFOW LPFINDINFO;
	alias NMLVFINDITEMW NMLVFINDITEM;
	alias PNMLVFINDITEMW PNMLVFINDITEM;
	alias LPNMLVFINDITEMW LPNMLVFINDITEM;
	alias LVM_FINDITEMW LVM_FINDITEM;
	alias LVM_GETSTRINGWIDTHW LVM_GETSTRINGWIDTH;
	alias LVM_EDITLABELW LVM_EDITLABEL;
	alias LV_COLUMNW LV_COLUMN;
	alias LVCOLUMNW LVCOLUMN;
	alias LVCOLUMNW* LPLVCOLUMN;
	alias LVM_GETCOLUMNW LVM_GETCOLUMN;
	alias LVM_SETCOLUMNW LVM_SETCOLUMN;
	alias LVM_INSERTCOLUMNW LVM_INSERTCOLUMN;
	alias LVM_GETITEMTEXTW LVM_GETITEMTEXT;
	alias LVM_SETITEMTEXTW LVM_SETITEMTEXT;
	alias LVM_GETISEARCHSTRINGW LVM_GETISEARCHSTRING;
	alias LVN_BEGINLABELEDITW LVN_BEGINLABELEDIT;
	alias LVN_ENDLABELEDITW LVN_ENDLABELEDIT;
	alias LVN_GETDISPINFOW LVN_GETDISPINFO;
	alias LVN_SETDISPINFOW LVN_SETDISPINFO;

	static if (_WIN32_IE >= 0x400) {
		alias LVN_GETINFOTIPW LVN_GETINFOTIP;
		alias NMLVGETINFOTIPW NMLVGETINFOTIP;
		alias LPNMLVGETINFOTIPW LPNMLVGETINFOTIP;
	}

	alias LV_DISPINFOW LV_DISPINFO;
	alias NMLVDISPINFOW NMLVDISPINFO;
	alias LPNMLVDISPINFOW LPNMLVDISPINFO;
	alias TVM_INSERTITEMW TVM_INSERTITEM;
	alias TVM_GETITEMW TVM_GETITEM;
	alias TVM_SETITEMW TVM_SETITEM;
	alias TVM_EDITLABELW TVM_EDITLABEL;
	alias TVM_GETISEARCHSTRINGW TVM_GETISEARCHSTRING;
	alias NMTVDISPINFOW TV_DISPINFO;
	alias NMTVDISPINFOW NMTVDISPINFO;
	alias LPNMTVDISPINFOW LPNMTVDISPINFO;

	static if (_WIN32_IE >= 0x400) {
		alias NMTVGETINFOTIPW NMTVGETINFOTIP;
		alias LPNMTVGETINFOTIPW LPNMTVGETINFOTIP;
		alias TVN_GETINFOTIPW TVN_GETINFOTIP;
	}

	alias TVN_SELCHANGINGW TVN_SELCHANGING;
	alias TVN_SELCHANGEDW TVN_SELCHANGED;
	alias TVN_GETDISPINFOW TVN_GETDISPINFO;
	alias TVN_SETDISPINFOW TVN_SETDISPINFO;
	alias TVN_ITEMEXPANDINGW TVN_ITEMEXPANDING;
	alias TVN_ITEMEXPANDEDW TVN_ITEMEXPANDED;
	alias TVN_BEGINDRAGW TVN_BEGINDRAG;
	alias TVN_BEGINRDRAGW TVN_BEGINRDRAG;
	alias TVN_DELETEITEMW TVN_DELETEITEM;
	alias TVN_BEGINLABELEDITW TVN_BEGINLABELEDIT;
	alias TVN_ENDLABELEDITW TVN_ENDLABELEDIT;
	alias TC_ITEMHEADERW TC_ITEMHEADER;
	alias TC_ITEMW TC_ITEM;
	alias TCITEMW TCITEM;
	alias LPTCITEMW LPTCITEM;
	alias TCM_GETITEMW TCM_GETITEM;
	alias TCM_SETITEMW TCM_SETITEM;
	alias TCM_INSERTITEMW TCM_INSERTITEM;
	alias CreateStatusWindowW CreateStatusWindow;
	alias DrawStatusTextW DrawStatusText;
	alias ImageList_LoadImageW ImageList_LoadImage;
	alias DTM_SETFORMATW DTM_SETFORMAT;
	alias DTN_USERSTRINGW DTN_USERSTRING;
	alias DTN_WMKEYDOWNW DTN_WMKEYDOWN;
	alias DTN_FORMATW DTN_FORMAT;
	alias DTN_FORMATQUERYW DTN_FORMATQUERY;
	alias REBARBANDINFOW REBARBANDINFO;
	alias REBARBANDINFO* LPREBARBANDINFO;
	alias LPCREBARBANDINFOW LPCREBARBANDINFO;
	alias REBARBANDINFOW_V3_SIZE REBARBANDINFO_V3_SIZE;
	alias RB_INSERTBANDW RB_INSERTBAND;
	alias RB_SETBANDINFOW RB_SETBANDINFO;
} else {
	alias HDITEMA HDITEM;
	alias LPHDITEMA LPHDITEM;
	alias TOOLINFOA TOOLINFO;
	alias TOOLINFOA* PTOOLINFO, LPTOOLINFO;
	alias TTHITTESTINFOA TTHITTESTINFO;
	alias TTHITTESTINFOA* LPHITTESTINFO, LPTTHITTESTINFO;
	alias TOOLTIPTEXTA TOOLTIPTEXT;
	alias TOOLTIPTEXTA* LPTOOLTIPTEXT;
	alias NMTTDISPINFOA NMTTDISPINFO;
	alias NMTTDISPINFOA* LPNMTTDISPINFO;
	alias TV_ITEMA TV_ITEM;
	alias TV_ITEMA* LPTV_ITEM;
	alias TVITEMA TVITEM;
	alias TVITEMA* LPTVITEM;

	static if (_WIN32_IE >= 0x400) {
		alias TVITEMEXA TVITEMEX;
		alias TVITEMEXA* LPTVITEMEX;
	}

	alias TV_INSERTSTRUCTA TV_INSERTSTRUCT;
	alias TV_INSERTSTRUCTA* LPTV_INSERTSTRUCT;
	alias TVINSERTSTRUCTA TVINSERTSTRUCT;
	alias TVINSERTSTRUCTA* LPTVINSERTSTRUCT;
	alias NM_TREEVIEWA NM_TREEVIEW;
	alias NM_TREEVIEWA* LPNM_TREEVIEW;
	alias NMTREEVIEWA NMTREEVIEW;
	alias NMTREEVIEWA* LPNMTREEVIEW;
	alias NMHDDISPINFOW NMHDDISPINFO;
	alias NMHDDISPINFOW* LPNMHDDISPINFO;

	alias ACM_OPENA ACM_OPEN;
	alias COMBOBOXEXITEMA COMBOBOXEXITEM;
	alias PCOMBOBOXEXITEMA PCOMBOBOXEXITEM;
	//alias PCCOMBOBOXEXITEMA PCCOMBOBOXEXITEM; fixme
	alias CBEM_INSERTITEMA CBEM_INSERTITEM;
	alias CBEM_SETITEMA CBEM_SETITEM;
	alias CBEM_GETITEMA CBEM_GETITEM;
	alias CBEN_ENDEDITA CBEN_ENDEDIT;
	alias NMCBEENDEDITA NMCBEENDEDIT;
	alias LPNMCBEENDEDITA LPNMCBEENDEDIT;
	alias PNMCBEENDEDITA PNMCBEENDEDIT;

	static if (_WIN32_IE >= 0x400) {
		alias TB_GETBUTTONINFOA TB_GETBUTTONINFO;
		alias TB_SETBUTTONINFOA TB_SETBUTTONINFO;
		alias TB_INSERTBUTTONA TB_INSERTBUTTON;
		alias TB_ADDBUTTONSA TB_ADDBUTTONS;
		alias TB_MAPACCELERATORA TB_MAPACCELERATOR;
		alias TB_GETSTRINGA TB_GETSTRING;
		alias NMCOMBOBOXEXA NMCOMBOBOXEX;
		alias PNMCOMBOBOXEXA PNMCOMBOBOXEX;
		alias CBEN_DRAGBEGINA CBEN_DRAGBEGIN;
		alias CBEN_GETDISPINFOA CBEN_GETDISPINFO;
		alias NMCBEDRAGBEGINA NMCBEDRAGBEGIN;
		alias LPNMCBEDRAGBEGINA LPNMCBEDRAGBEGIN;
		alias PNMCBEDRAGBEGINA PNMCBEDRAGBEGIN;
		alias TBN_GETDISPINFOA TBN_GETDISPINFO;
		alias NMTBDISPINFOA NMTBDISPINFO;
		alias LPNMTBDISPINFOA LPNMTBDISPINFO;
		alias NMTBGETINFOTIPA NMTBGETINFOTIP;
		alias LPNMTBGETINFOTIPA LPNMTBGETINFOTIP;
	}

	alias SB_GETTEXTA SB_GETTEXT;
	alias SB_SETTEXTA SB_SETTEXT;
	alias SB_GETTEXTLENGTHA SB_GETTEXTLENGTH;
	alias HDM_INSERTITEMA HDM_INSERTITEM;
	alias HDM_GETITEMA HDM_GETITEM;
	alias HDM_SETITEMA HDM_SETITEM;
	alias HDN_ITEMCHANGINGA HDN_ITEMCHANGING;
	alias HDN_ITEMCHANGEDA HDN_ITEMCHANGED;
	alias HDN_ITEMCLICKA HDN_ITEMCLICK;
	alias HDN_ITEMDBLCLICKA HDN_ITEMDBLCLICK;
	alias HDN_DIVIDERDBLCLICKA HDN_DIVIDERDBLCLICK;
	alias HDN_BEGINTRACKA HDN_BEGINTRACK;
	alias HDN_ENDTRACKA HDN_ENDTRACK;
	alias HDN_TRACKA HDN_TRACK;

	static if (_WIN32_IE >= 0x300) {
		alias HDN_GETDISPINFOA HDN_GETDISPINFO;
	}

	alias HD_NOTIFYA HD_NOTIFY;
	alias TBSAVEPARAMSA TBSAVEPARAMS;
	alias TB_GETBUTTONTEXTA TB_GETBUTTONTEXT;
	alias TB_SAVERESTOREA TB_SAVERESTORE;
	alias TB_ADDSTRINGA TB_ADDSTRING;
	alias TBN_GETBUTTONINFOA TBN_GETBUTTONINFO;

	static if (_WIN32_IE >= 0x400) {
		alias TBBUTTONINFOA TBBUTTONINFO;
		alias LPTBBUTTONINFOA LPTBBUTTONINFO;
	}

	alias TBNOTIFYA TBNOTIFY;
	alias LPTBNOTIFYA LPTBNOTIFY;
	alias NMTOOLBARA NMTOOLBAR;
	alias LPNMTOOLBARA LPNMTOOLBAR;
	alias TTM_ADDTOOLA TTM_ADDTOOL;
	alias TTM_DELTOOLA TTM_DELTOOL;
	alias TTM_NEWTOOLRECTA TTM_NEWTOOLRECT;
	alias TTM_GETTOOLINFOA TTM_GETTOOLINFO;
	alias TTM_SETTOOLINFOA TTM_SETTOOLINFO;
	alias TTM_HITTESTA TTM_HITTEST;
	alias TTM_GETTEXTA TTM_GETTEXT;
	alias TTM_UPDATETIPTEXTA TTM_UPDATETIPTEXT;
	alias TTM_ENUMTOOLSA TTM_ENUMTOOLS;
	alias TTM_GETCURRENTTOOLA TTM_GETCURRENTTOOL;
	alias TTN_NEEDTEXTA TTN_NEEDTEXT;
	alias TTN_GETDISPINFOA TTN_GETDISPINFO;
	alias LV_ITEMA LV_ITEM;
	alias LVITEMA LVITEM;
	alias LVITEM* LPLVITEM;
	alias LPSTR_TEXTCALLBACKA LPSTR_TEXTCALLBACK;

	static if (_WIN32_IE >= 0x400) {
		alias LVBKIMAGEA LVBKIMAGE;
		alias LPLVBKIMAGEA LPLVBKIMAGE;
		alias LVM_SETBKIMAGEA LVM_SETBKIMAGE;
		alias LVM_GETBKIMAGEA LVM_GETBKIMAGE;
	}

	alias LVM_GETITEMA LVM_GETITEM;
	alias LVM_SETITEMA LVM_SETITEM;
	alias LVM_INSERTITEMA LVM_INSERTITEM;
	alias LV_FINDINFOA LV_FINDINFO;
	alias LVFINDINFOA LVFINDINFO;
	alias LPFINDINFOA LPFINDINFO;
	alias NMLVFINDITEMA NMLVFINDITEM;
	alias PNMLVFINDITEMA PNMLVFINDITEM;
	alias LPNMLVFINDITEMA LPNMLVFINDITEM;
	alias LVM_FINDITEMA LVM_FINDITEM;
	alias LVM_GETSTRINGWIDTHA LVM_GETSTRINGWIDTH;
	alias LVM_EDITLABELA LVM_EDITLABEL;
	alias LV_COLUMNA LV_COLUMN;
	alias LVCOLUMNA LVCOLUMN;
	alias LVCOLUMNA* LPLVCOLUMN;
	alias LVM_GETCOLUMNA LVM_GETCOLUMN;
	alias LVM_SETCOLUMNA LVM_SETCOLUMN;
	alias LVM_INSERTCOLUMNA LVM_INSERTCOLUMN;
	alias LVM_GETITEMTEXTA LVM_GETITEMTEXT;
	alias LVM_SETITEMTEXTA LVM_SETITEMTEXT;
	alias LVM_GETISEARCHSTRINGA LVM_GETISEARCHSTRING;
	alias LVN_BEGINLABELEDITA LVN_BEGINLABELEDIT;
	alias LVN_ENDLABELEDITA LVN_ENDLABELEDIT;
	alias LVN_GETDISPINFOA LVN_GETDISPINFO;
	alias LVN_SETDISPINFOA LVN_SETDISPINFO;

	static if (_WIN32_IE >= 0x400) {
		alias LVN_GETINFOTIPA LVN_GETINFOTIP;
		alias NMLVGETINFOTIPA NMLVGETINFOTIP;
		alias LPNMLVGETINFOTIPA LPNMLVGETINFOTIP;
	}

	alias LV_DISPINFOA LV_DISPINFO;
	alias NMLVDISPINFOA NMLVDISPINFO;
	alias LPNMLVDISPINFOA LPNMLVDISPINFO;
	alias TVM_INSERTITEMA TVM_INSERTITEM;
	alias TVM_GETITEMA TVM_GETITEM;
	alias TVM_SETITEMA TVM_SETITEM;
	alias TVM_EDITLABELA TVM_EDITLABEL;
	alias TVM_GETISEARCHSTRINGA TVM_GETISEARCHSTRING;
	alias NMTVDISPINFOA TV_DISPINFO;
	alias NMTVDISPINFOA NMTVDISPINFO;
	alias LPNMTVDISPINFOA LPNMTVDISPINFO;

	static if (_WIN32_IE >= 0x400) {
		alias NMTVGETINFOTIPA NMTVGETINFOTIP;
		alias LPNMTVGETINFOTIPA LPNMTVGETINFOTIP;
		alias TVN_GETINFOTIPA TVN_GETINFOTIP;
	}

	alias TVN_SELCHANGINGA TVN_SELCHANGING;
	alias TVN_SELCHANGEDA TVN_SELCHANGED;
	alias TVN_GETDISPINFOA TVN_GETDISPINFO;
	alias TVN_SETDISPINFOA TVN_SETDISPINFO;
	alias TVN_ITEMEXPANDINGA TVN_ITEMEXPANDING;
	alias TVN_ITEMEXPANDEDA TVN_ITEMEXPANDED;
	alias TVN_BEGINDRAGA TVN_BEGINDRAG;
	alias TVN_BEGINRDRAGA TVN_BEGINRDRAG;
	alias TVN_DELETEITEMA TVN_DELETEITEM;
	alias TVN_BEGINLABELEDITA TVN_BEGINLABELEDIT;
	alias TVN_ENDLABELEDITA TVN_ENDLABELEDIT;
	alias TC_ITEMHEADERA TC_ITEMHEADER;
	alias TC_ITEMA TC_ITEM;
	alias TCITEMA TCITEM;
	alias LPTCITEMA LPTCITEM;
	alias TCM_GETITEMA TCM_GETITEM;
	alias TCM_SETITEMA TCM_SETITEM;
	alias TCM_INSERTITEMA TCM_INSERTITEM;
	alias CreateStatusWindowA CreateStatusWindow;
	alias DrawStatusTextA DrawStatusText;
	alias ImageList_LoadImageA ImageList_LoadImage;
	alias DTM_SETFORMATA DTM_SETFORMAT;
	alias DTN_USERSTRINGA DTN_USERSTRING;
	alias DTN_WMKEYDOWNA DTN_WMKEYDOWN;
	alias DTN_FORMATA DTN_FORMAT;
	alias DTN_FORMATQUERYA DTN_FORMATQUERY;
	alias REBARBANDINFOA REBARBANDINFO;
	alias REBARBANDINFOA* LPREBARBANDINFO;
	alias LPCREBARBANDINFOA LPCREBARBANDINFO;
	alias REBARBANDINFOA_V3_SIZE REBARBANDINFO_V3_SIZE;
	alias RB_INSERTBANDA RB_INSERTBAND;
	alias RB_SETBANDINFOA RB_SETBANDINFO;
}


alias INT function(PVOID, PVOID) PFNDPAENUMCALLBACK;
alias INT function(PVOID, PVOID) PFNDSAENUMCALLBACK;
alias INT function(PVOID, PVOID, LPARAM) PFNDPACOMPARE;

static if (_WIN32_WINNT >= 0x501) {
	extern (Windows)
	alias LRESULT function(HWND, UINT, WPARAM, LPARAM, UINT_PTR, DWORD_PTR)
	  SUBCLASSPROC;

	struct LITEM {
		UINT mask;
		int  iLink;
		UINT state;
		UINT stateMask;
		WCHAR[MAX_LINKID_TEXT]  szID;
		WCHAR[L_MAX_URL_LENGTH] szUrl;
	}
	alias LITEM* PLITEM;

	struct LHITTESTINFO {
		POINT pt;
		LITEM item;
	}
	alias LHITTESTINFO* PLHITTESTINFO;

	struct NMLINK {
		NMHDR hdr;
		LITEM item;
	}
	alias NMLINK* PNMLINK;
}

uint INDEXTOOVERLAYMASK(uint i) { return i << 8; }
uint INDEXTOSTATEIMAGEMASK(uint i) { return i << 12; }

template HANDLE_WM_NOTIFY(R) {
	R HANDLE_WM_NOTIFY(HWND hwnd, WPARAM wParam, LPARAM lParam,
		  R function(HWND, int, NMHDR*) fn) {
		return fn(hwnd, wParam, cast(NMHDR*) lParam);
	}
}
int FORWARD_WM_NOTIFY(HWND hwnd, int idFrom, NMHDR* pnmhdr,
	  int function(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) fn) {
	return fn(hwnd, WM_NOTIFY, idFrom, cast(LPARAM) pnmhdr);
}

//#define CCSIZEOF_STRUCT(s, m) (((int)((PBYTE)(&((s*)0)->m)-((PBYTE)((s*)0))))+sizeof(((s*)0)->m))

LPARAM MAKEIPADDRESS(ubyte b1, ubyte b2, ubyte b3, ubyte b4) {
	return (cast(DWORD) b1 << 24)
	     | (cast(DWORD) b2 << 16)
	     | (cast(DWORD) b3 << 8)
	     | (cast(DWORD) b4);
}

LPARAM MAKEIPRANGE(ubyte low, ubyte high) {
	return (cast(int) high << 8) | low;
}

ubyte FIRST_IPADDRESS(LPARAM x) {
	return cast(ubyte) (x >> 24);
}

ubyte SECOND_IPADDRESS(LPARAM x) {
	return cast(ubyte) (x >> 16);
}

ubyte THIRD_IPADDRESS(LPARAM x) {
	return cast(ubyte) (x >> 8);
}

ubyte FOURTH_IPADDRESS(LPARAM x) {
	return cast(ubyte) x;
}

HWND Animate_Create(HWND hwndP, UINT id, DWORD dwStyle,
	  HINSTANCE hInstance) {
	return CreateWindow(cast(TCHAR*)ANIMATE_CLASS.ptr, null, dwStyle, 0, 0, 0, 0, hwndP,
	  cast(HMENU) id, hInstance, null);
}

BOOL Animate_Open(HWND hwnd, LPTSTR szName) {
	return SendMessage(hwnd, ACM_OPEN, 0, cast(LPARAM) szName);
}

BOOL Animate_OpenEx(HWND hwnd, HINSTANCE hInst, LPTSTR szName) {
	return SendMessage(hwnd, ACM_OPEN, cast(WPARAM) hInst,
	  cast(LPARAM) szName);
}

BOOL Animate_Play(HWND hwnd, int from, int to, int rep) {
	return SendMessage(hwnd, ACM_PLAY, rep,
	  MAKELONG(cast(ushort) from, cast(ushort) to));
}

BOOL Animate_Stop(HWND hwnd) {
	return SendMessage(hwnd, ACM_STOP, 0, 0);
}

BOOL Animate_Close(HWND hwnd) {
	return Animate_Open(hwnd, null);
}

BOOL Animate_Seek(HWND hwnd, int frame) {
	return Animate_Play(hwnd, frame, frame, 1);
}

extern (Windows) {
	HBITMAP CreateMappedBitmap(HINSTANCE, int, UINT, LPCOLORMAP, int);
	HWND CreateStatusWindowA(LONG, LPCSTR, HWND, UINT);
	HWND CreateStatusWindowW(LONG, LPCWSTR, HWND, UINT);
	HWND CreateToolbarEx(HWND, DWORD, UINT, int, HINSTANCE, UINT,
	  LPCTBBUTTON, int, int, int, int, int, UINT);
	HWND CreateUpDownControl(DWORD, int, int, int, int, HWND, int, HINSTANCE,
	  HWND, int, int, int);
}

HWND DateTime_GetMonthCal(HWND hwnd) {
	return cast(HWND) SendMessage(hwnd, DTM_GETMONTHCAL, 0, 0);
}

COLORREF DateTime_GetMonthCalColor(HWND hwnd, int iColor) {
	return cast(COLORREF) SendMessage(hwnd, DTM_GETMCCOLOR, iColor, 0);
}

HFONT DateTime_GetMonthCalFont(HWND hwnd) {
	return cast(HFONT) SendMessage(hwnd, DTM_GETMCFONT, 0, 0);
}

DWORD DateTime_GetRange(HWND hwnd, LPSYSTEMTIME lpSysTimeArray) {
	return SendMessage(hwnd, DTM_GETRANGE, 0, cast(LPARAM) lpSysTimeArray);
}

DWORD DateTime_GetSystemtime(HWND hwnd, LPSYSTEMTIME lpSysTime) {
	return SendMessage(hwnd, DTM_GETSYSTEMTIME, 0, cast(LPARAM) lpSysTime);
}

BOOL DateTime_SetFormat(HWND hwnd, LPCTSTR lpszFormat) {
	return cast(BOOL) SendMessage(hwnd, DTM_SETFORMAT, 0,
	  cast(LPARAM) lpszFormat);
}

LRESULT DateTime_SetMonthCalColor(HWND hwnd, int iColor, COLORREF clr) {
	return SendMessage(hwnd, DTM_SETMCCOLOR, cast(WPARAM) iColor,
	  cast(LPARAM) clr);
}

void DateTime_SetMonthCalFont(HWND hwnd, HFONT hfont, BOOL fRedraw) {
	SendMessage(hwnd, DTM_SETMCFONT, cast(WPARAM) hfont, fRedraw);
}

BOOL DateTime_SetRange(HWND hwnd, WPARAM flags, LPSYSTEMTIME lpSysTimeArray) {
	return cast(BOOL) SendMessage(hwnd, DTM_SETRANGE, flags,
	  cast(LPARAM) lpSysTimeArray);
}

BOOL DateTime_SetSystemtime(HWND hwnd, WPARAM flag, LPSYSTEMTIME lpSysTime) {
	return cast(BOOL) SendMessage(hwnd, DTM_SETSYSTEMTIME, flag,
	  cast(LPARAM) lpSysTime);
}

extern (Windows) {
	void DrawInsert(HWND, HWND, int);
	void DrawStatusTextA(HDC, LPRECT, LPCSTR, UINT);
	void DrawStatusTextW(HDC, LPRECT, LPCWSTR, UINT);
	void GetEffectiveClientRect(HWND, LPRECT, LPINT);
}

int Header_GetItemCount(HWND w) {
	return SendMessage(w, HDM_GETITEMCOUNT, 0, 0);
}

int Header_InsertItem(HWND w, int i, CPtr!(HDITEM) phdi) {
	return SendMessage(w, HDM_INSERTITEM, i, cast(LPARAM) phdi);
}

BOOL Header_DeleteItem(HWND w, int i) {
	return cast(BOOL) SendMessage(w, HDM_DELETEITEM, i, 0);
}

BOOL Header_GetItem(HWND w, int i, LPHDITEM phdi) {
	return cast(BOOL) SendMessage(w, HDM_GETITEM, i, cast(LPARAM) phdi);
}

BOOL Header_SetItem(HWND w, int i, CPtr!(HDITEM) phdi) {
	return cast(BOOL) SendMessage(w, HDM_SETITEM, i, cast(LPARAM) phdi);
}

BOOL Header_Layout(HWND w, LPHDLAYOUT playout) {
	return SendMessage(w, HDM_LAYOUT, 0, cast(LPARAM) playout);
}

static if (_WIN32_IE >= 0x300) {
	int Header_OrderToIndex(HWND w, int i) {
		return SendMessage(w, HDM_ORDERTOINDEX, i, 0);
	}

	BOOL Header_GetItemRect(HWND w, int i, RECT* r) {
		return cast(BOOL) SendMessage(w, HDM_GETITEMRECT, i, cast(LPARAM) r);
	}

	BOOL Header_GetOrderArray(HWND w, int iSize, LPINT lpiArray) {
		return cast(BOOL) SendMessage(w, HDM_GETORDERARRAY, iSize,
		  cast(LPARAM) lpiArray);
	}

	BOOL Header_SetOrderArray(HWND w, int iSize, LPINT lpiArray) {
		return cast(BOOL) SendMessage(w, HDM_SETORDERARRAY, iSize,
		  cast(LPARAM) lpiArray);
	}

	HIMAGELIST Header_CreateDragImage(HWND w, int i) {
		return cast(HIMAGELIST) SendMessage(w, HDM_CREATEDRAGIMAGE, i, 0);
	}

	HIMAGELIST Header_SetImageList(HWND w, HIMAGELIST himl) {
		return cast(HIMAGELIST) SendMessage(w, HDM_SETIMAGELIST, 0,
		  cast(LPARAM) himl);
	}

	HIMAGELIST Header_GetImageList(HWND w) {
		return cast(HIMAGELIST) SendMessage(w, HDM_GETIMAGELIST, 0, 0);
	}
}

static if (_WIN32_IE >= 0x400) {
	BOOL Header_GetUnicodeFormat(HWND w) {
		return cast(BOOL) SendMessage(w, HDM_GETUNICODEFORMAT, 0, 0);
	}

	BOOL Header_SetUnicodeFormat(HWND w, BOOL fUnicode) {
		return cast(BOOL) SendMessage(w, HDM_SETUNICODEFORMAT, fUnicode, 0);
	}
}

extern (Windows) {
	HDSA DSA_Create(INT, INT);
	BOOL DSA_Destroy(HDSA);
	VOID DSA_DestroyCallback(HDSA, PFNDSAENUMCALLBACK, PVOID);
	PVOID DSA_GetItemPtr(HDSA, INT);
	INT DSA_InsertItem(HDSA, INT, PVOID);
	HDPA DPA_Create(INT);
	BOOL DPA_Destroy(HDPA);
	PVOID DPA_DeletePtr(HDPA, INT);
	BOOL DPA_DeleteAllPtrs(HDPA);
	VOID DPA_EnumCallback(HDPA, PFNDPAENUMCALLBACK, PVOID);
	VOID DPA_DestroyCallback(HDPA, PFNDPAENUMCALLBACK, PVOID);
	BOOL DPA_SetPtr(HDPA, INT, PVOID);
	INT DPA_InsertPtr(HDPA, INT, PVOID);
	PVOID DPA_GetPtr(HDPA, INT_PTR);
	BOOL DPA_Sort(HDPA, PFNDPACOMPARE, LPARAM);
	INT DPA_Search(HDPA, PVOID, INT, PFNDPACOMPARE, LPARAM, UINT);
	BOOL Str_SetPtrW(LPWSTR*, LPCWSTR);

	static if (_WIN32_IE >= 0x400) {
		BOOL FlatSB_EnableScrollBar(HWND, INT, UINT);
		BOOL FlatSB_ShowScrollBar(HWND, INT, BOOL);
		BOOL FlatSB_GetScrollRange(HWND, INT, LPINT, LPINT);
		BOOL FlatSB_GetScrollInfo(HWND, INT, LPSCROLLINFO);
		INT FlatSB_GetScrollPos(HWND, INT);
		BOOL FlatSB_GetScrollProp(HWND, INT, LPINT);
		version (Win64) {
			BOOL FlatSB_GetScrollPropPtr(HWND, INT, PINT_PTR);
		} else {
			alias FlatSB_GetScrollProp FlatSB_GetScrollPropPtr;
		}
		INT FlatSB_SetScrollPos(HWND, INT, INT, BOOL);
		INT FlatSB_SetScrollInfo(HWND, INT, LPSCROLLINFO, BOOL);
		INT FlatSB_SetScrollRange(HWND, INT, INT, INT, BOOL);
		BOOL FlatSB_SetScrollProp(HWND, UINT, INT_PTR, BOOL);
		alias FlatSB_SetScrollProp FlatSB_SetScrollPropPtr;
		BOOL InitializeFlatSB(HWND);
		HRESULT UninitializeFlatSB(HWND);
	}

	static if (_WIN32_WINNT >= 0x501) {
		BOOL SetWindowSubclass(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR);
		BOOL GetWindowSubclass(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR*);
		BOOL RemoveWindowSubclass(HWND, SUBCLASSPROC, UINT_PTR);
		LRESULT DefSubclassProc(HWND, UINT, WPARAM, LPARAM);
		INT DrawShadowText(HDC, LPCWSTR, UINT, RECT*, DWORD, COLORREF,
		  COLORREF, INT, INT);
	}

	int ImageList_Add(HIMAGELIST, HBITMAP, HBITMAP);
	int ImageList_AddMasked(HIMAGELIST, HBITMAP, COLORREF);
	BOOL ImageList_BeginDrag(HIMAGELIST, int, int, int);
	HIMAGELIST ImageList_Create(int, int, UINT, int, int);
	BOOL ImageList_Destroy(HIMAGELIST);
	BOOL ImageList_DragEnter(HWND, int, int);
	BOOL ImageList_DragLeave(HWND);
	BOOL ImageList_DragMove(int, int);
	BOOL ImageList_DragShowNolock(BOOL);
	BOOL ImageList_Draw(HIMAGELIST, int, HDC, int, int, UINT);
	BOOL ImageList_DrawEx(HIMAGELIST, int, HDC, int, int, int, int, COLORREF,
	  COLORREF, UINT);
	void ImageList_EndDrag(PVOID);
	COLORREF ImageList_GetBkColor(HIMAGELIST);
	HIMAGELIST ImageList_GetDragImage(LPPOINT, LPPOINT);
	HICON ImageList_GetIcon(HIMAGELIST, int, UINT);
	BOOL ImageList_GetIconSize(HIMAGELIST, int*, int*);
	int ImageList_GetImageCount(HIMAGELIST);
	BOOL ImageList_GetImageInfo(HIMAGELIST, int, IMAGEINFO*);
	HIMAGELIST ImageList_LoadImageA(HINSTANCE, LPCSTR, int, int, COLORREF,
	  UINT, UINT);
	HIMAGELIST ImageList_LoadImageW(HINSTANCE, LPCWSTR, int, int, COLORREF,
	  UINT, UINT);
	HIMAGELIST ImageList_Merge(HIMAGELIST, int, HIMAGELIST, int, int, int);
	BOOL ImageList_Remove(HIMAGELIST, int);
	BOOL ImageList_Replace(HIMAGELIST, int, HBITMAP, HBITMAP);
	int ImageList_ReplaceIcon(HIMAGELIST, int, HICON);
	COLORREF ImageList_SetBkColor(HIMAGELIST, COLORREF);
	BOOL ImageList_SetDragCursorImage(HIMAGELIST, int, int, int);
	BOOL ImageList_SetIconSize(HIMAGELIST, int, int);
	BOOL ImageList_SetOverlayImage(HIMAGELIST, int, int);

	//#ifdef _OBJIDL_H
	HIMAGELIST ImageList_Read(LPSTREAM);
	BOOL ImageList_Write(HIMAGELIST, LPSTREAM);
	//#endif

	static if (_WIN32_IE >= 0x400) {
		HIMAGELIST ImageList_Duplicate(HIMAGELIST himl);
	}

	void InitCommonControls();

	static if (_WIN32_IE >= 0x300) {
		BOOL InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
	}

	int LBItemFromPt(HWND, POINT, BOOL);
}

int ImageList_AddIcon(HIMAGELIST himl, HICON hicon) {
	return ImageList_ReplaceIcon(himl, -1, hicon);
}

HICON ImageList_ExtractIcon(HINSTANCE hi, HIMAGELIST himl, int i) {
	return ImageList_GetIcon(himl, i, 0);
}

HIMAGELIST ImageList_LoadBitmap(HINSTANCE hi, LPCTSTR lpbmp, int cx,
	  int cGrow, COLORREF crMask) {
	return ImageList_LoadImage(hi, lpbmp, cx, cGrow, crMask, IMAGE_BITMAP, 0);
}

BOOL ImageList_RemoveAll(HIMAGELIST himl) {
	return ImageList_Remove(himl, -1);
}

COLORREF ListView_GetBkColor(HWND w) {
	return cast(COLORREF) SendMessage(w, LVM_GETBKCOLOR, 0, 0);
}

HIMAGELIST ListView_GetImageList(HWND w, int i) {
	return cast(HIMAGELIST) SendMessage(w, LVM_GETIMAGELIST, i, 0);
}

int ListView_GetItemCount(HWND w) {
	return SendMessage(w, LVM_GETITEMCOUNT, 0, 0);
}

BOOL ListView_GetItem(HWND w, LPLVITEM pitem) {
	return cast(BOOL) SendMessage(w, LVM_GETITEM, 0, cast(LPARAM) pitem);
}

BOOL ListView_SetBkColor(HWND w, COLORREF c) {
	return cast(BOOL) SendMessage(w, LVM_SETBKCOLOR, 0, cast(LPARAM) c);
}

HIMAGELIST ListView_SetImageList(HWND w, HIMAGELIST h, int i) {
	return cast(HIMAGELIST) SendMessage(w, LVM_SETIMAGELIST, i,
	  cast(LPARAM) h);
}

BOOL ListView_SetItem(HWND w, CPtr!(LV_ITEM) i) {
	return cast(BOOL) SendMessage(w, LVM_SETITEM, 0, cast(LPARAM) i);
}

int ListView_InsertItem(HWND w, CPtr!(LV_ITEM) i) {
	return SendMessage(w, LVM_INSERTITEM, 0, cast(LPARAM) i);
}

BOOL ListView_DeleteItem(HWND w, int i) {
	return cast(BOOL) SendMessage(w, LVM_DELETEITEM, i, 0);
}

BOOL ListView_DeleteAllItems(HWND w) {
	return cast(BOOL) SendMessage(w, LVM_DELETEALLITEMS, 0, 0);
}

UINT ListView_GetCallbackMask(HWND w) {
	return cast(UINT) SendMessage(w, LVM_GETCALLBACKMASK, 0, 0);
}

BOOL ListView_SetCallbackMask(HWND w, UINT m) {
	return cast(BOOL) SendMessage(w, LVM_SETCALLBACKMASK, m, 0);
}

int ListView_GetNextItem(HWND w, int i, UINT f) {
	return SendMessage(w, LVM_GETNEXTITEM, i, MAKELPARAM(cast(ushort)f, 0));
}

int ListView_FindItem(HWND w, int i, CPtr!(LV_FINDINFO) p) {
	return SendMessage(w, LVM_FINDITEM, i, cast(LPARAM) p);
}

BOOL ListView_GetItemRect(HWND w, int i, LPRECT p, int c) {
	return cast(BOOL) SendMessage(w, LVM_GETITEMRECT, i, p ?
	  (p.left = c, cast(LPARAM) p) : 0);
}

BOOL ListView_SetItemPosition(HWND w, int i, int x, int y) {
	return cast(BOOL) SendMessage(w, LVM_SETITEMPOSITION, i, MAKELPARAM(cast(ushort)x, cast(ushort)y));
}

BOOL ListView_GetItemPosition(HWND w, int i, POINT* p) {
	return cast(BOOL) SendMessage(w, LVM_GETITEMPOSITION, i, cast(LPARAM) p);
}

DWORD ListView_GetItemSpacing(HWND w, BOOL f) {
	return cast(DWORD) SendMessage(w, LVM_GETITEMSPACING, f, 0);
}

int ListView_GetStringWidth(HWND w, LPCSTR s) {
	return SendMessage(w, LVM_GETSTRINGWIDTH, 0, cast(LPARAM) s);
}

int ListView_HitTest(HWND w, LPLVHITTESTINFO p) {
	return SendMessage(w, LVM_HITTEST, 0, cast(LPARAM) p);
}

BOOL ListView_EnsureVisible(HWND w, int i, BOOL f) {
	return cast(BOOL) SendMessage(w, LVM_ENSUREVISIBLE, i, MAKELPARAM(cast(ushort)f, 0));
}

BOOL ListView_Scroll(HWND w, int dx, int dy) {
	return cast(BOOL) SendMessage(w, LVM_SCROLL, dx, dy);
}

BOOL ListView_RedrawItems(HWND w, int f, int l) {
	return cast(BOOL) SendMessage(w, LVM_REDRAWITEMS, f, l);
}

BOOL ListView_Arrange(HWND w, UINT c) {
	return cast(BOOL) SendMessage(w, LVM_ARRANGE, c, 0);
}

HWND ListView_EditLabel(HWND w, int i) {
	return cast(HWND) SendMessage(w, LVM_EDITLABEL, i, 0);
}

HWND ListView_GetEditControl(HWND w) {
	return cast(HWND) SendMessage(w, LVM_GETEDITCONTROL, 0, 0);
}

BOOL ListView_GetColumn(HWND w, int i, LPLVCOLUMN p) {
	return cast(BOOL) SendMessage(w, LVM_GETCOLUMN, i, cast(LPARAM) p);
}

BOOL ListView_SetColumn(HWND w, int i, CPtr!(LV_COLUMN) p) {
	return cast(BOOL) SendMessage(w, LVM_SETCOLUMN, i, cast(LPARAM) p);
}

int ListView_InsertColumn(HWND w, int i, CPtr!(LV_COLUMN) p) {
	return SendMessage(w, LVM_INSERTCOLUMN, i, cast(LPARAM) p);
}

BOOL ListView_DeleteColumn(HWND w, int i) {
	return cast(BOOL) SendMessage(w, LVM_DELETECOLUMN, i, 0);
}

int ListView_GetColumnWidth(HWND w, int i) {
	return SendMessage(w, LVM_GETCOLUMNWIDTH, i, 0);
}

BOOL ListView_SetColumnWidth(HWND w, int i, int x) {
	return cast(BOOL) SendMessage(w, LVM_SETCOLUMNWIDTH, i, MAKELPARAM(cast(ushort)x, 0));
}

HIMAGELIST ListView_CreateDragImage(HWND w, int i, LPPOINT p) {
	return cast(HIMAGELIST) SendMessage(w, LVM_CREATEDRAGIMAGE, i,
	  cast(LPARAM) p);
}

BOOL ListView_GetViewRect(HWND w, RECT* p) {
	return cast(BOOL) SendMessage(w, LVM_GETVIEWRECT, 0, cast(LPARAM) p);
}

COLORREF ListView_GetTextColor(HWND w) {
	return cast(COLORREF) SendMessage(w, LVM_GETTEXTCOLOR, 0, 0);
}

BOOL ListView_SetTextColor(HWND w, COLORREF c) {
	return cast(BOOL) SendMessage(w, LVM_SETTEXTCOLOR, 0, cast(LPARAM) c);
}

COLORREF ListView_GetTextBkColor(HWND w) {
	return cast(COLORREF) SendMessage(w, LVM_GETTEXTBKCOLOR, 0, 0);
}

BOOL ListView_SetTextBkColor(HWND w, COLORREF c) {
	return cast(BOOL) SendMessage(w, LVM_SETTEXTBKCOLOR, 0, cast(LPARAM) c);
}

int ListView_GetTopIndex(HWND w) {
	return SendMessage(w, LVM_GETTOPINDEX, 0, 0);
}

int ListView_GetCountPerPage(HWND w) {
	return SendMessage(w, LVM_GETCOUNTPERPAGE, 0, 0);
}

BOOL ListView_GetOrigin(HWND w, LPPOINT p) {
	return cast(BOOL) SendMessage(w, LVM_GETORIGIN, 0, cast(LPARAM) p);
}

BOOL ListView_Update(HWND w, WPARAM i) {
	return cast(BOOL) SendMessage(w, LVM_UPDATE, i, 0);
}

void ListView_SetItemState(HWND w, int i, UINT d, UINT m) {
	LV_ITEM _lvi;
	_lvi.stateMask = m;
	_lvi.state = d;
	SendMessage(w, LVM_SETITEMSTATE, i, cast(LPARAM) &_lvi);
}

UINT ListView_GetItemState(HWND w, int i, UINT m) {
	return cast(UINT) SendMessage(w, LVM_GETITEMSTATE, i, m);
}

void ListView_GetItemText(HWND w, int i, int iS, LPTSTR s, int n) {
	LV_ITEM _lvi;
	_lvi.iSubItem = iS;
	_lvi.cchTextMax = n;
	_lvi.pszText = s;
	SendMessage(w, LVM_GETITEMTEXT, i, cast(LPARAM) &_lvi);
}

void ListView_SetItemText(HWND w, int i, int iS, LPTSTR s) {
	LV_ITEM _lvi;
	_lvi.iSubItem = iS;
	_lvi.pszText = s;
	SendMessage(w, LVM_SETITEMTEXT, i, cast(LPARAM) &_lvi);
}

void ListView_SetItemCount(HWND w, int n) {
	SendMessage(w, LVM_SETITEMCOUNT, n, 0);
}

BOOL ListView_SortItems(HWND w, PFNLVCOMPARE f, LPARAM l) {
	return cast(BOOL) SendMessage(w, LVM_SORTITEMS, l, cast(LPARAM) f);
}

void ListView_SetItemPosition32(HWND w, int i, int x, int y) {
	POINT p;
	p.x = x;
	p.y = y;
	SendMessage(w, LVM_SETITEMPOSITION32, i, cast(LPARAM) &p);
}

UINT ListView_GetSelectedCount(HWND w) {
	return cast(UINT) SendMessage(w, LVM_GETSELECTEDCOUNT, 0, 0);
}

UINT ListView_GetCheckState(HWND w, UINT i) {
	return ((cast(UINT) SendMessage(w, LVM_GETITEMSTATE, i, LVIS_STATEIMAGEMASK)) >> 12) - 1;
}

void ListView_SetCheckState(HWND w, UINT i, BOOL f) {
	ListView_SetItemState(w, i, INDEXTOSTATEIMAGEMASK(f ? 2 : 1),
	  LVIS_STATEIMAGEMASK);
}

BOOL ListView_GetISearchString(HWND w, LPSTR lpsz) {
	return cast(BOOL) SendMessage(w, LVM_GETISEARCHSTRING, 0,
	  cast(LPARAM) lpsz);
}

void ListView_CancelEditLabel(HWND w) {
	SendMessage(w, LVM_CANCELEDITLABEL, 0, 0);
}

int ListView_EnableGroupView(HWND w, BOOL i) {
	return cast(int) SendMessage(w, LVM_ENABLEGROUPVIEW, i, 0);
}

static if (_WIN32_WINDOWS >= 0x410 && (_WIN32_WINNT >= 0x500 || _WIN32_IE >= 0x500)) {
	BOOL ListView_SortItemsEx(HWND w, PFNLVCOMPARE c, LPARAM p) {
		return SendMessage(w, LVM_SORTITEMSEX, cast(WPARAM) p, cast(LPARAM)c);
	}
}

static if (_WIN32_WINNT >= 0x501) {
	int ListView_GetGroupInfo(HWND w, int i, PLVGROUP p) {
		return SendMessage(w, LVM_GETGROUPINFO, i, cast(LPARAM) p);
	}

	void ListView_GetGroupMetrics(HWND w, PLVGROUPMETRICS p) {
		SendMessage(w, LVM_GETGROUPMETRICS, 0, cast(LPARAM) p);
	}

	BOOL ListView_GetInsertMark(HWND w, PLVINSERTMARK p) {
		return SendMessage(w, LVM_GETINSERTMARK, 0, cast(LPARAM) p);
	}

	COLORREF ListView_GetInsertMarkColor(HWND w) {
		return SendMessage(w, LVM_GETINSERTMARKCOLOR, 0, 0);
	}

	int ListView_GetInsertMarkRect(HWND w, LPRECT p) {
		return SendMessage(w, LVM_GETINSERTMARKRECT, 0, cast(LPARAM) p);
	}

	COLORREF ListView_GetOutlineColor(HWND w) {
		return SendMessage(w, LVM_GETOUTLINECOLOR, 0, 0);
	}

	UINT ListView_GetSelectedColumn(HWND w) {
		return SendMessage(w, LVM_GETSELECTEDCOLUMN, 0, 0);
	}

	void ListView_GetTileInfo(HWND w, PLVTILEINFO p) {
		SendMessage(w, LVM_GETTILEINFO, 0, cast(LPARAM) p);
	}

	void ListView_GetTileViewInfo(HWND w, PLVTILEVIEWINFO p) {
		SendMessage(w, LVM_GETTILEVIEWINFO, 0, cast(LPARAM) p);
	}

	DWORD ListView_GetView(HWND w) {
		return SendMessage(w, LVM_GETVIEW, 0, 0);
	}

	BOOL ListView_HasGroup(HWND w, int i) {
		return SendMessage(w, LVM_HASGROUP, i, 0);
	}

	int ListView_InsertGroup(HWND w, int i, PLVGROUP p) {
		return SendMessage(w, LVM_INSERTGROUP, i, cast(LPARAM) p);
	}

	void ListView_InsertGroupSorted(HWND w, PLVINSERTGROUPSORTED p) {
		SendMessage(w, LVM_INSERTGROUPSORTED, cast(WPARAM) p, 0);
	}

	BOOL ListView_InsertMarkHitTest(HWND w, LPPOINT p, PLVINSERTMARK t) {
		return SendMessage(w, LVM_INSERTMARKHITTEST, cast(WPARAM) p, cast(LPARAM) t);
	}

	BOOL ListView_IsGroupViewEnabled(HWND w) {
		return SendMessage(w, LVM_ISGROUPVIEWENABLED, 0, 0);
	}

	UINT ListView_MapIDToIndex(HWND w, UINT i) {
		return SendMessage(w, LVM_MAPIDTOINDEX, i, 0);
	}

	/*	??? MSDN documents this as "Not implemented", except in relation to
	 *	Windows CE/Mobile.
	 */
	void ListView_MoveGroup(HWND w, int i, int t) {
		SendMessage(w, LVM_MOVEGROUP, i, t);
	}

	void ListView_RemoveAllGroups(HWND w) {
		SendMessage(w, LVM_REMOVEALLGROUPS, 0, 0);
	}

	int ListView_RemoveGroup(HWND w, int i) {
		return SendMessage(w, LVM_REMOVEGROUP, i, 0);
	}

	int ListView_SetGroupInfo(HWND w, int i, PLVGROUP p) {
		return SendMessage(w, LVM_SETGROUPINFO, i, cast(LPARAM) p);
	}

	void ListView_SetGroupMetrics(HWND w, PLVGROUPMETRICS p) {
		SendMessage(w, LVM_SETGROUPMETRICS, 0, cast(LPARAM) p);
	}

	BOOL ListView_SetInfoTip(HWND w, PLVSETINFOTIP p) {
		return SendMessage(w, LVM_SETINFOTIP, 0, cast(LPARAM) p);
	}

	BOOL ListView_SetInsertMark(HWND w, PLVINSERTMARK p) {
		return SendMessage(w, LVM_SETINSERTMARK, 0, cast(LPARAM) p);
	}

	COLORREF ListView_SetInsertMarkColor(HWND w, COLORREF c) {
		return SendMessage(w, LVM_SETINSERTMARKCOLOR, 0, c);
	}

	COLORREF ListView_SetOutlineColor(HWND w, COLORREF c) {
		return SendMessage(w, LVM_SETOUTLINECOLOR, 0, c);
	}

	void ListView_SetSelectedColumn(HWND w, int i) {
		SendMessage(w, LVM_SETSELECTEDCOLUMN, i, 0);
	}

	BOOL ListView_SetTileInfo(HWND w, PLVTILEINFO p) {
		return SendMessage(w, LVM_SETTILEINFO, 0, cast(LPARAM) p);
	}

	BOOL ListView_SetTileViewInfo(HWND w, PLVTILEVIEWINFO p) {
		return SendMessage(w, LVM_SETTILEVIEWINFO, 0, cast(LPARAM) p);
	}

	int ListView_SetView(HWND w, DWORD i) {
		return SendMessage(w, LVM_SETVIEW, i, 0);
	}

	int ListView_SortGroups(HWND w, PFNLVGROUPCOMPARE c, LPVOID p) {
		return SendMessage(w, LVM_SORTGROUPS, cast(WPARAM) c, cast(LPARAM) p);
	}
}

static if (_WIN32_WINNT >= 0x501) {
	enum {
		CBM_FIRST        = 0x1700,
		CB_SETMINVISIBLE = CBM_FIRST + 1,
		CB_GETMINVISIBLE = CBM_FIRST + 2
	}

	BOOL ComboBox_SetMinVisible(HWND w, INT i) {
		return cast(BOOL) SendMessage(w, CB_SETMINVISIBLE, cast(WPARAM) i, 0);
	}

	int ComboBox_GetMinVisible(HWND w) {
		return SendMessage(w, CB_GETMINVISIBLE, 0, 0);
	}
}

extern (Windows) BOOL MakeDragList(HWND);
extern (Windows) void MenuHelp(UINT, WPARAM, LPARAM, HMENU, HINSTANCE, HWND,
  PUINT);

COLORREF MonthCal_GetColor(HWND hwnd, INT icolor) {
	return cast(COLORREF) SendMessage(hwnd, MCM_GETCOLOR,
	  cast(WPARAM) icolor, 0);
}

BOOL MonthCal_GetCurSel(HWND hwnd, LPSYSTEMTIME lpsystime) {
	return cast(BOOL) SendMessage(hwnd, MCM_GETCURSEL, 0,
	  cast(LPARAM) lpsystime);
}

DWORD MonthCal_GetFirstDayOfWeek(HWND hwnd) {
	return cast(DWORD) SendMessage(hwnd, MCM_GETFIRSTDAYOFWEEK, 0, 0);
}

DWORD MonthCal_GetMaxSelCount(HWND hwnd) {
	return cast(DWORD) SendMessage(hwnd, MCM_GETMAXSELCOUNT, 0, 0);
}

DWORD MonthCal_GetMaxTodayWidth(HWND hwnd) {
	return cast(DWORD) SendMessage(hwnd, MCM_GETMAXTODAYWIDTH, 0, 0);
}

BOOL MonthCal_GetMinReqRect(HWND hwnd, LPRECT lpRectInfo) {
	return cast(BOOL) SendMessage(hwnd, MCM_GETMINREQRECT, 0,
	  cast(LPARAM) lpRectInfo);
}

INT MonthCal_GetMonthDelta(HWND hwnd) {
	return SendMessage(hwnd, MCM_GETMONTHDELTA, 0, 0);
}

INT MonthCal_GetMonthRange(HWND hwnd, DWORD flag, LPSYSTEMTIME systimearray) {
	return SendMessage(hwnd, MCM_GETMONTHRANGE, cast(WPARAM) flag,
	  cast(LPARAM) systimearray);
}

DWORD MonthCal_GetRange(HWND hwnd, LPSYSTEMTIME systimearray) {
	return cast(DWORD) SendMessage(hwnd, MCM_GETRANGE, 0,
	  cast(LPARAM) systimearray);
}

BOOL MonthCal_GetSelRange(HWND hwnd, LPSYSTEMTIME systimearray) {
	return cast(BOOL) SendMessage(hwnd, MCM_GETSELRANGE, 0,
	  cast(LPARAM) systimearray);
}

BOOL MonthCal_GetToday(HWND hwnd, LPSYSTEMTIME systime) {
	return cast(BOOL) SendMessage(hwnd, MCM_GETTODAY, 0,
	  cast(LPARAM) systime);
}

BOOL MonthCal_GetUnicodeFormat(HWND hwnd) {
	return cast(BOOL) SendMessage(hwnd, MCM_GETUNICODEFORMAT, 0, 0);
}

DWORD MonthCal_HitTest(HWND hwnd, PMCHITTESTINFO pmchittest) {
	return cast(DWORD) SendMessage(hwnd, MCM_HITTEST, 0,
	  cast(LPARAM) pmchittest);
}

COLORREF MonthCal_SetColor(HWND hwnd, INT icolor, COLORREF clr) {
	return cast(COLORREF) SendMessage(hwnd, MCM_SETCOLOR, cast(WPARAM) icolor,
	  cast(LPARAM) clr);
}

BOOL MonthCal_SetCurSel(HWND hwnd, LPSYSTEMTIME lpsystime) {
	return cast(BOOL) SendMessage(hwnd, MCM_SETCURSEL, 0,
	  cast(LPARAM) lpsystime);
}

BOOL MonthCal_SetDayState(HWND hwnd, INT imonths, LPMONTHDAYSTATE lpdatestatearray) {
	return cast(BOOL) SendMessage(hwnd, MCM_SETDAYSTATE, cast(WPARAM) imonths,
	  cast(LPARAM) lpdatestatearray);
}

DWORD MonthCal_SetFirstDayOfWeek(HWND hwnd, INT iday) {
	return cast(DWORD) SendMessage(hwnd, MCM_SETFIRSTDAYOFWEEK, 0,
	  cast(LPARAM) iday);
}

BOOL MonthCal_SetMaxSelCount(HWND hwnd, UINT imax) {
	return cast(BOOL) SendMessage(hwnd, MCM_SETMAXSELCOUNT,
	  cast(WPARAM) imax, 0);
}

INT MonthCal_SetMonthDelta(HWND hwnd, INT idelta) {
	return SendMessage(hwnd, MCM_SETMONTHDELTA, cast(WPARAM) idelta, 0);
}

BOOL MonthCal_SetSelRange(HWND hwnd, LPSYSTEMTIME systimearray) {
	return cast(BOOL) SendMessage(hwnd, MCM_SETSELRANGE, 0,
	  cast(LPARAM) systimearray);
}

void MonthCal_SetToday(HWND hwnd, LPSYSTEMTIME systime) {
	SendMessage(hwnd, MCM_SETTODAY, 0, cast(LPARAM) systime);
}

BOOL MonthCal_SetUnicodeFormat(HWND hwnd, BOOL unicode) {
	return cast(BOOL) SendMessage(hwnd, MCM_SETUNICODEFORMAT,
	  cast(WPARAM) unicode, 0);
}

BOOL MonthCal_SetRange(HWND w, DWORD f, LPSYSTEMTIME st) {
	return cast(BOOL) SendMessage(w, MCM_SETRANGE, cast(WPARAM) f,
	  cast(LPARAM) st);
}

extern (Windows) BOOL ShowHideMenuCtl(HWND, UINT, PINT);

BOOL TabCtrl_GetItem(HWND w, int i, LPTCITEM p) {
	return cast(BOOL) SendMessage(w, TCM_GETITEM, i, cast(LPARAM) p);
}

BOOL TabCtrl_SetItem(HWND w, int i, LPTCITEM p) {
	return cast(BOOL) SendMessage(w, TCM_SETITEM, i, cast(LPARAM) p);
}

int TabCtrl_InsertItem(HWND w, int i, CPtr!(TC_ITEM) p) {
	return SendMessage(w, TCM_INSERTITEM, i, cast(LPARAM) p);
}

BOOL TabCtrl_DeleteItem(HWND w, int i) {
	return cast(BOOL) SendMessage(w, TCM_DELETEITEM, i, 0);
}

BOOL TabCtrl_DeleteAllItems(HWND w) {
	return cast(BOOL) SendMessage(w, TCM_DELETEALLITEMS, 0, 0);
}

BOOL TabCtrl_GetItemRect(HWND w, int i, LPRECT p) {
	return cast(BOOL) SendMessage(w, TCM_GETITEMRECT, i, cast(LPARAM) p);
}

int TabCtrl_GetCurSel(HWND w) {
	return SendMessage(w, TCM_GETCURSEL, 0, 0);
}

int TabCtrl_SetCurSel(HWND w, int i) {
	return SendMessage(w, TCM_SETCURSEL, i, 0);
}

int TabCtrl_HitTest(HWND w, LPTCHITTESTINFO p) {
	return SendMessage(w, TCM_HITTEST, 0, cast(LPARAM) p);
}

BOOL TabCtrl_SetItemExtra(HWND w, int c) {
	return cast(BOOL) SendMessage(w, TCM_SETITEMEXTRA, c, 0);
}

int TabCtrl_AdjustRect(HWND w, BOOL b, LPRECT p) {
	return SendMessage(w, TCM_ADJUSTRECT, b, cast(LPARAM) p);
}

DWORD TabCtrl_SetItemSize(HWND w, int x, int y) {
	return cast(DWORD) SendMessage(w, TCM_SETITEMSIZE, 0, MAKELPARAM(cast(ushort)x, cast(ushort)y));
}

void TabCtrl_RemoveImage(HWND w, int i) {
	SendMessage(w, TCM_REMOVEIMAGE, i, 0);
}

void TabCtrl_SetPadding(HWND w, int x, int y) {
	SendMessage(w, TCM_SETPADDING, 0, MAKELPARAM(cast(ushort)x, cast(ushort)y));
}

int TabCtrl_GetRowCount(HWND w) {
	return SendMessage(w, TCM_GETROWCOUNT, 0, 0);
}

HWND TabCtrl_GetToolTips(HWND w) {
	return cast(HWND) SendMessage(w, TCM_GETTOOLTIPS, 0, 0);
}

void TabCtrl_SetToolTips(HWND w, HWND t) {
	SendMessage(w, TCM_SETTOOLTIPS, cast(WPARAM) t, 0);
}

int TabCtrl_GetCurFocus(HWND w) {
	return SendMessage(w, TCM_GETCURFOCUS, 0, 0);
}

void TabCtrl_SetCurFocus(HWND w, int i) {
	SendMessage(w, TCM_SETCURFOCUS, i, 0);
}

HIMAGELIST TabCtrl_GetImageList(HWND w) {
	return cast(HIMAGELIST) SendMessage(w, TCM_GETIMAGELIST, 0, 0);
}

HIMAGELIST TabCtrl_SetImageList(HWND w, HIMAGELIST h) {
	return cast(HIMAGELIST) SendMessage(w, TCM_SETIMAGELIST, 0,
	  cast(LPARAM) h);
}

int TabCtrl_GetItemCount(HWND w) {
	return SendMessage(w, TCM_GETITEMCOUNT, 0, 0);
}

extern (Windows) BOOL _TrackMouseEvent(LPTRACKMOUSEEVENT);

HTREEITEM TreeView_InsertItem(HWND w, LPTVINSERTSTRUCT i) {
	return cast(HTREEITEM) SendMessage(w, TVM_INSERTITEM, 0, cast(LPARAM) i);
}

BOOL TreeView_DeleteItem(HWND w, HTREEITEM i) {
	return cast(BOOL) SendMessage(w, TVM_DELETEITEM, 0, cast(LPARAM) i);
}

BOOL TreeView_DeleteAllItems(HWND w) {
	return cast(BOOL) SendMessage(w, TVM_DELETEITEM, 0, cast(LPARAM) TVI_ROOT);
}

BOOL TreeView_Expand(HWND w, HTREEITEM i, UINT c) {
	return cast(BOOL) SendMessage(w, TVM_EXPAND, c, cast(LPARAM) i);
}

BOOL TreeView_GetItemRect(HWND w, HTREEITEM i, LPRECT p, BOOL c) {
	*cast(HTREEITEM*) p = i;
	return cast(BOOL) SendMessage(w, TVM_GETITEMRECT, c, cast(LPARAM) p);
}

UINT TreeView_GetCount(HWND w) {
	return cast(UINT) SendMessage(w, TVM_GETCOUNT, 0, 0);
}

UINT TreeView_GetIndent(HWND w) {
	return cast(UINT) SendMessage(w, TVM_GETINDENT, 0, 0);
}

BOOL TreeView_SetIndent(HWND w, INT i) {
	return cast(BOOL) SendMessage(w, TVM_SETINDENT, i, 0);
}

HIMAGELIST TreeView_GetImageList(HWND w, INT i) {
	return cast(HIMAGELIST) SendMessage(w, TVM_GETIMAGELIST, i, 0);
}

HIMAGELIST TreeView_SetImageList(HWND w, HIMAGELIST h, INT i) {
	return cast(HIMAGELIST) SendMessage(w, TVM_SETIMAGELIST, i,
	  cast(LPARAM) h);
}

HTREEITEM TreeView_GetNextItem(HWND w, HTREEITEM i, UINT c) {
	return cast(HTREEITEM) SendMessage(w, TVM_GETNEXTITEM, c, cast(LPARAM) i);
}

HTREEITEM TreeView_GetChild(HWND w, HTREEITEM i) {
	return TreeView_GetNextItem(w, i, TVGN_CHILD);
}

HTREEITEM TreeView_GetNextSibling(HWND w, HTREEITEM i) {
	return TreeView_GetNextItem(w, i, TVGN_NEXT);
}

HTREEITEM TreeView_GetPrevSibling(HWND w, HTREEITEM i) {
	return TreeView_GetNextItem(w, i, TVGN_PREVIOUS);
}

HTREEITEM TreeView_GetParent(HWND w, HTREEITEM i) {
	return TreeView_GetNextItem(w, i, TVGN_PARENT);
}

HTREEITEM TreeView_GetFirstVisible(HWND w) {
	return TreeView_GetNextItem(w, null, TVGN_FIRSTVISIBLE);
}

HTREEITEM TreeView_GetNextVisible(HWND w, HTREEITEM i) {
	return TreeView_GetNextItem(w, i, TVGN_NEXTVISIBLE);
}

HTREEITEM TreeView_GetPrevVisible(HWND w, HTREEITEM i) {
	return TreeView_GetNextItem(w, i, TVGN_PREVIOUSVISIBLE);
}

HTREEITEM TreeView_GetSelection(HWND w) {
	return TreeView_GetNextItem(w, null, TVGN_CARET);
}

HTREEITEM TreeView_GetDropHilight(HTREEITEM w) {
	return TreeView_GetNextItem(w, null, TVGN_DROPHILITE);
}

HTREEITEM TreeView_GetRoot(HWND w) {
	return TreeView_GetNextItem(w, null, TVGN_ROOT);
}

BOOL TreeView_Select(HWND w, HTREEITEM i, UINT c) {
	return cast(BOOL) SendMessage(w, TVM_SELECTITEM, c, cast(LPARAM) i);
}

BOOL TreeView_SelectItem(HWND w, HTREEITEM i) {
	return TreeView_Select(w, i, TVGN_CARET);
}

BOOL TreeView_SelectDropTarget(HWND w, HTREEITEM i) {
	return TreeView_Select(w, i, TVGN_DROPHILITE);
}

BOOL TreeView_SelectSetFirstVisible(HWND w, HTREEITEM i) {
	return TreeView_Select(w, i, TVGN_FIRSTVISIBLE);
}

BOOL TreeView_GetItem(HWND w, LPTVITEM i) {
 return cast(BOOL) SendMessage(w, TVM_GETITEM, 0, cast(LPARAM) i);
}

BOOL TreeView_SetItem(HWND w, CPtr!(TV_ITEM) i) {
	return cast(BOOL) SendMessage(w, TVM_SETITEM, 0, cast(LPARAM) i);
}

HWND TreeView_EditLabel(HWND w, HTREEITEM i) {
	return cast(HWND) SendMessage(w, TVM_EDITLABEL, 0, cast(LPARAM) i);
}

HWND TreeView_GetEditControl(HWND w) {
	return cast(HWND) SendMessage(w, TVM_GETEDITCONTROL, 0, 0);
}

UINT TreeView_GetVisibleCount(HWND w) {
	return cast(UINT) SendMessage(w, TVM_GETVISIBLECOUNT, 0, 0);
}

HTREEITEM TreeView_HitTest(HWND w, LPTVHITTESTINFO p) {
	return cast(HTREEITEM) SendMessage(w, TVM_HITTEST, 0, cast(LPARAM) p);
}

HIMAGELIST TreeView_CreateDragImage(HWND w, HTREEITEM i) {
	return cast(HIMAGELIST) SendMessage(w, TVM_CREATEDRAGIMAGE, 0,
	  cast(LPARAM) i);
}

BOOL TreeView_SortChildren(HWND w, HTREEITEM i, BOOL r) {
	return cast(BOOL) SendMessage(w, TVM_SORTCHILDREN, r, cast(LPARAM) i);
}

BOOL TreeView_EnsureVisible(HWND w, HTREEITEM i) {
	return cast(BOOL) SendMessage(w, TVM_ENSUREVISIBLE, 0, cast(LPARAM) i);
}

BOOL TreeView_SortChildrenCB(HWND w, LPTVSORTCB s, BOOL r) {
	return cast(BOOL) SendMessage(w, TVM_SORTCHILDRENCB, r, cast(LPARAM) s);
}

BOOL TreeView_EndEditLabelNow(HWND w, BOOL f) {
	return cast(BOOL) SendMessage(w, TVM_ENDEDITLABELNOW, f, 0);
}

BOOL TreeView_GetISearchString(HWND w, LPTSTR s) {
	return cast(BOOL) SendMessage(w, TVM_GETISEARCHSTRING, 0, cast(LPARAM) s);
}

static if (_WIN32_IE >= 0x300) {
	DWORD ListView_ApproximateViewRect(HWND w, int iw, int ih, int i) {
		return cast(DWORD) SendMessage(w, LVM_APPROXIMATEVIEWRECT, i,
		  MAKELPARAM(cast(ushort)iw, cast(ushort)ih));
	}

	DWORD ListView_SetExtendedListViewStyle(HWND w, DWORD s) {
		return cast(DWORD) SendMessage(w, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, s);
	}

	DWORD ListView_GetExtendedListViewStyle(HWND w) {
		return cast(DWORD) SendMessage(w, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
	}

	BOOL ListView_SetColumnOrderArray(HWND w, int i, int* a) {
		return cast(BOOL) SendMessage(w, LVM_SETCOLUMNORDERARRAY,
		  cast(WPARAM) i, cast(LPARAM) a);
	}

	BOOL ListView_GetColumnOrderArray(HWND w, int i, int* a) {
		return cast(BOOL) SendMessage(w, LVM_GETCOLUMNORDERARRAY,
		  cast(WPARAM) i, cast(LPARAM) a);
	}

	HWND ListView_GetHeader(HWND w) {
		return cast(HWND) SendMessage(w, LVM_GETHEADER, 0, 0);
	}

	HCURSOR ListView_GetHotCursor(HWND w) {
		return cast(HCURSOR) SendMessage(w, LVM_GETHOTCURSOR, 0, 0);
	}

	INT ListView_GetHotItem(HWND w) {
		return SendMessage(w, LVM_GETHOTITEM, 0, 0);
	}

	BOOL ListView_GetSubItemRect(HWND w, int i, int isi, int c, LPRECT p) {
		return cast(BOOL) SendMessage(w, LVM_GETSUBITEMRECT, i,
		  p ? (p.left = c, p.top = isi, cast(LPARAM) p) : 0);
	}

	HCURSOR ListView_SetHotCursor(HWND w, HCURSOR c) {
		return cast(HCURSOR) SendMessage(w, LVM_SETHOTCURSOR, 0,
		  cast(LPARAM) c);
	}

	INT ListView_SetHotItem(HWND w, INT i) {
		return SendMessage(w, LVM_SETHOTITEM, cast(WPARAM) i, 0);
	}

	DWORD ListView_SetIconSpacing(HWND w, int x, int y) {
		return cast(DWORD) SendMessage(w, LVM_SETICONSPACING, 0,
		  MAKELONG(cast(ushort)x, cast(ushort)y));
	}

	INT ListView_SubItemHitTest(HWND w, LPLVHITTESTINFO p) {
		return SendMessage(w, LVM_SUBITEMHITTEST, 0, cast(LPARAM) p);
	}

	BOOL ListView_SetItemCountEx(HWND w, int i, DWORD f) {
		return cast(BOOL) SendMessage(w, LVM_SETITEMCOUNT, i, cast(LPARAM) f);
	}

	extern (Windows) {
		WINBOOL ImageList_SetImageCount(HIMAGELIST, UINT);
		WINBOOL ImageList_Copy(HIMAGELIST, int, HIMAGELIST, int, UINT);
		WINBOOL ImageList_DrawIndirect(IMAGELISTDRAWPARAMS*);
	}

	int TabCtrl_SetMinTabWidth(HWND hwnd, int x) {
		return SendMessage(hwnd, TCM_SETMINTABWIDTH, 0, x);
	}

	VOID TabCtrl_DeselectAll(HWND hwnd, UINT fExcludeFocus) {
		SendMessage(hwnd, TCM_DESELECTALL, fExcludeFocus, 0);
	}

	HWND TreeView_GetToolTips(HWND w) {
		return cast(HWND) SendMessage(w, TVM_GETTOOLTIPS, 0, 0);
	}

	HWND TreeView_SetToolTips(HWND w, HWND wt) {
		return cast(HWND) SendMessage(w, TVM_SETTOOLTIPS, cast(WPARAM) wt, 0);
	}
}

static if (_WIN32_IE >= 0x400) {
	BOOL ListView_GetBkImage(HWND h, LPLVBKIMAGE plvbki) {
		return cast(BOOL) SendMessage(h, LVM_GETBKIMAGE, 0,
		  cast(LPARAM) plvbki);
	}

	BOOL ListView_SetBkImage(HWND h, LPLVBKIMAGE plvbki) {
		return cast(BOOL) SendMessage(h, LVM_SETBKIMAGE, 0,
		  cast(LPARAM) plvbki);
	}

	DWORD ListView_SetExtendedListViewStyleEx(HWND w, DWORD m, DWORD s) {
		return cast(DWORD) SendMessage(w, LVM_SETEXTENDEDLISTVIEWSTYLE, m, s);
	}

	VOID ListView_SetWorkAreas(HWND w, INT n, LPRECT r) {
		SendMessage(w, LVM_SETWORKAREAS, cast(WPARAM) n, cast(LPARAM) r);
	}

	VOID ListView_GetWorkAreas(HWND w, INT n, LPRECT r) {
		SendMessage(w, LVM_GETWORKAREAS, cast(WPARAM) n, cast(LPARAM) r);
	}

	BOOL ListView_GetNumberOfWorkAreas(HWND w, LPUINT n) {
		return cast(BOOL) SendMessage(w, LVM_GETNUMBEROFWORKAREAS, 0,
		  cast(LPARAM) n);
	}

	DWORD ListView_SetHoverTime(HWND w, DWORD t) {
		return cast(DWORD) SendMessage(w, LVM_SETHOVERTIME, 0,
		  cast(LPARAM) t);
	}

	DWORD ListView_GetHoverTime(HWND w) {
		return cast(DWORD) SendMessage(w, LVM_GETHOVERTIME, 0, 0);
	}

	INT ListView_GetSelectionMark(HWND w) {
		return SendMessage(w, LVM_GETSELECTIONMARK, 0, 0);
	}

	INT ListView_SetSelectionMark(HWND w, INT i) {
		return SendMessage(w, LVM_SETSELECTIONMARK, 0, cast(LPARAM) i);
	}

	HWND ListView_SetToolTips(HWND w, HWND n) {
		return cast(HWND) SendMessage(w, LVM_SETTOOLTIPS, cast(WPARAM) n, 0);
	}

	HWND ListView_GetToolTips(HWND w) {
		return cast(HWND) SendMessage(w, LVM_GETTOOLTIPS, 0, 0);
	}

	BOOL ListView_SetUnicodeFormat(HWND w, BOOL f) {
		return cast(BOOL) SendMessage(w, LVM_SETUNICODEFORMAT,
		  cast(WPARAM) f, 0);
	}

	BOOL ListView_GetUnicodeFormat(HWND w) {
		return cast(BOOL) SendMessage(w, LVM_GETUNICODEFORMAT, 0, 0);
	}

	BOOL TabCtrl_HighlightItem(HWND hwnd, INT i, WORD fHighlight) {
		return cast(BOOL) SendMessage(hwnd, TCM_HIGHLIGHTITEM,
		  cast(WPARAM) i, cast(LPARAM) MAKELONG(fHighlight, 0));
	}

	DWORD TabCtrl_SetExtendedStyle(HWND hwnd, DWORD dw) {
		return cast(DWORD) SendMessage(hwnd, TCM_SETEXTENDEDSTYLE, 0, dw);
	}

	DWORD TabCtrl_GetExtendedStyle(HWND hwnd) {
		return cast(DWORD) SendMessage(hwnd, TCM_GETEXTENDEDSTYLE, 0, 0);
	}

	BOOL TabCtrl_SetUnicodeFormat(HWND hwnd, HWND fUnicode) {
		return cast(BOOL) SendMessage(hwnd, TCM_SETUNICODEFORMAT,
		  cast(WPARAM) fUnicode, 0);
	}

	BOOL TabCtrl_GetUnicodeFormat(HWND hwnd) {
		return cast(BOOL) SendMessage(hwnd, TCM_GETUNICODEFORMAT, 0, 0);
	}

	COLORREF TreeView_GetBkColor(HWND w) {
		return cast(COLORREF) SendMessage(w, TVM_GETBKCOLOR, 0, 0);
	}

	COLORREF TreeView_GetInsertMarkColor(HWND w) {
		return cast(COLORREF) SendMessage(w, TVM_GETINSERTMARKCOLOR, 0, 0);
	}

	int TreeView_GetItemHeight(HWND w) {
		return SendMessage(w, TVM_GETITEMHEIGHT, 0, 0);
	}

	UINT TreeView_GetScrollTime(HWND w) {
		return cast(UINT) SendMessage(w, TVM_GETSCROLLTIME, 0, 0);
	}

	COLORREF TreeView_GetTextColor(HWND w) {
		return cast(COLORREF) SendMessage(w, TVM_GETTEXTCOLOR, 0, 0);
	}

	COLORREF TreeView_SetBkColor(HWND w, COLORREF c) {
		return cast(COLORREF) SendMessage(w, TVM_SETBKCOLOR, 0,
		  cast(LPARAM) c);
	}

	COLORREF TreeView_SetInsertMarkColor(HWND w, COLORREF c) {
		return cast(COLORREF) SendMessage(w, TVM_SETINSERTMARKCOLOR, 0,
		  cast(LPARAM) c);
	}

	int TreeView_SetItemHeight(HWND w, SHORT h) {
		return SendMessage(w, TVM_SETITEMHEIGHT, cast(WPARAM) h, 0);
	}

	UINT TreeView_SetScrollTime(HWND w, UINT t) {
		return cast(UINT) SendMessage(w, TVM_SETSCROLLTIME, cast(WPARAM) t, 0);
	}

	COLORREF TreeView_SetTextColor(HWND w, COLORREF c) {
		return cast(COLORREF) SendMessage(w, TVM_SETTEXTCOLOR, 0,
		  cast(LPARAM) c);
	}

	BOOL TreeView_SetInsertMark(HWND w, HTREEITEM i, BOOL a) {
		return cast(BOOL) SendMessage(w, TVM_SETINSERTMARK, cast(WPARAM) a,
		  cast(LPARAM) i);
	}

	BOOL TreeView_SetUnicodeFormat(HWND w, BOOL u) {
		return cast(BOOL) SendMessage(w, TVM_SETUNICODEFORMAT,
		  cast(WPARAM) u, 0);
	}

	BOOL TreeView_GetUnicodeFormat(HWND w) {
		return cast(BOOL) SendMessage(w, TVM_GETUNICODEFORMAT, 0, 0);
	}

	HTREEITEM TreeView_GetLastVisible(HWND w) {
		return TreeView_GetNextItem(w, null, TVGN_LASTVISIBLE);
	}
}

static if (_WIN32_IE >= 0x500) {
	UINT TreeView_GetItemState(HWND w, HTREEITEM i, UINT m) {
		return cast(UINT) SendMessage(w, TVM_GETITEMSTATE, cast(WPARAM) i,
		  cast(LPARAM) m);
	}

	BOOL TreeView_SetItemState(HWND w, HTREEITEM i, UINT d, UINT m) {
		TVITEM _tvi;
		_tvi.mask = TVIF_STATE;
		_tvi.hItem = i;
		_tvi.stateMask = m;
		_tvi.state = d;
		return cast(BOOL) SendMessage(w, TVM_SETITEM, 0, cast(LPARAM) &_tvi);
	}
}


//#ifdef _WIN32_WCE               // these are PPC only
/+
extern (Windows) {
	HWND  CommandBar_Create(HINSTANCE, HWND, int);
	BOOL  CommandBar_Show(HWND, BOOL);
	int   CommandBar_AddBitmap(HWND, HINSTANCE, int, int, int, int);
	HWND  CommandBar_InsertComboBox(HWND, HINSTANCE, int, UINT, WORD, WORD);
	BOOL  CommandBar_InsertMenubar(HWND, HINSTANCE, WORD, WORD );
	BOOL  CommandBar_InsertMenubarEx(HWND, HINSTANCE, LPTSTR, WORD);
	BOOL  CommandBar_DrawMenuBar(HWND, WORD);
	HMENU CommandBar_GetMenu(HWND, WORD);
	BOOL  CommandBar_AddAdornments(HWND, DWORD, DWORD);
	int   CommandBar_Height(HWND hwndCB);
}

// MinGW: These two are not in the DLL
void CommandBar_InsertButton(HWND hwnd, int i, LPTBBUTTON lptbbutton) {
    SendMessage(hwnd, TB_INSERTBUTTON, i, lptbbutton);
}
alias DestroyWindow CommandBar_Destroy;
+/
//#endif // _WIN32_WCE
