********************************************************************************
*!* ctl32_structures.prg
********************************************************************************
*!* This classes are based on the work of Christian Eischeld with vfp2c32
*!* vfp2c32.fll must be loaded with SET LIBRARY
********************************************************************************
#Include ctl32.h

If Not Sys(16) $ Upper(Set("Procedure")) Then
	Set Procedure To Sys(16) Additive
Endif

Return

********************************************************************************
*!* This is the base class for all structure classes below
********************************************************************************
Define Class _STRUCTBASE As Exception

	Address = 0
	InitMembersDone = FALSE
	Protected Embedded
	Embedded = FALSE
	Name = "STRUCTBASE"
	SizeOf = 0
	Value = FALSE

	Protected _MemberData
	_MemberData = '<VFPData>' + ;
		'<memberdata name="address" type="property" display="Address"/>' + ;
		'<memberdata name="initmembersdone" type="method" display="InitMembersDone"/>' + ;
		'<memberdata name="embedded" type="method" display="Embedded"/>' + ;
		'<memberdata name="name" type="property" display="Name"/>' + ;
		'<memberdata name="sizeof" type="property" display="SizeOf"/>' + ;
		'<memberdata name="value" type="property" display="Value"/>' + ;
		'</VFPData>'

	Protected Procedure Init(pnAddress)
		If Vartype(m.pnAddress) # "N" Then
			This.Address = AllocMem(This.SizeOf)
			If This.Address = 0
				Error(43)
				Return FALSE
			Endif
		Else
			This.Address = m.pnAddress
			This.Embedded = TRUE
		Endif
		This.InitMembers()
		This.InitMembersDone = TRUE
	Endproc

	Protected Procedure Destroy()
		This.FreeMembers()
		If This.Embedded = FALSE Then
			FreeMem(This.Address)
		Endif
	Endproc

	Procedure InitMembers()
		*!* Here we set up initial values, like size of structure member
		*!* And also create aditional substructures
	Endproc

	Procedure FreeMembers()
		*!* Here we free aditional substructures
	Endproc

	Hidden Procedure Value_Access()
		*!* This returns the whole structure
		Return Sys(2600, This.Address, This.SizeOf)
	Endproc

	Hidden Procedure Value_Assign(pnNewVal)
		*!* This assigns a string to the structure as a whole
		Sys(2600, This.Address, This.SizeOf, m.pnNewVal)
	Endproc

	*!*		Protected Procedure AllocMem(pnLength)
	*!*			*!* Allocates memory
	*!*			Return apiHeapAlloc(apiGetProcessHeap(), HEAP_ZERO_MEMORY, m.pnLength)
	*!*		Endproc

	*!*		Protected Procedure FreeMem(pnAddress)
	*!*			*!* Frees allocated memory
	*!*			Return apiHeapFree(apiGetProcessHeap(), 0, m.pnAddress)
	*!*		Endproc

	*!*		Protected Procedure ReadCharArray(pnAddress, pnLength)
	*!*			*!* Reads a string array of m.pnLength, stops at first nul char
	*!*			Local m.lcString As String
	*!*			m.lcString = Sys(2600, m.pnAddress, m.pnLength)
	*!*			Return Left(m.lcString , At(NULCHAR, m.lcString) - 1)
	*!*		Endproc

	*!*		Protected Procedure WriteCharArray(pnAddress, pcCharArray, pnLength)
	*!*			*!* Writes a string array of m.pnLength
	*!*			=Sys(2600, m.pnAddress, Min(Len(m.pcCharArray), m.pnLength) , m.pcCharArray)
	*!*			Return m.pnAddress
	*!*		Endproc

	*!*		Protected Procedure FreePMem(pnAddress)
	*!*			This.FreeMem(This.ReadUInt(m.pnAddress))
	*!*		Endproc

	*!*		Protected Procedure ReadPCString(pnAddress)
	*!*			*!* pnAddress is a pointer to a memory pointer
	*!*			Local m.lnAddress, m.lnLength, m.lcString
	*!*			*!* Get address pointer
	*!*			m.lnAddress = This.ReadUInt(m.pnAddress)
	*!*			If m.lnAddress <> 0 Then
	*!*				*!* Get length of memory pointer:
	*!*				m.lnLength = apiHeapSize(apiGetProcessHeap(), 0, m.lnAddress)
	*!*			Else
	*!*				m.lnLength = 0
	*!*			Endif
	*!*			*!* Read value of string pointer, then reads string
	*!*			If m.lnLength > 0 Then
	*!*				m.lcString = Sys(2600, m.lnAddress, m.lnLength)
	*!*				m.lcString = Left(m.lcString , At(NULCHAR, m.lcString) - 1)
	*!*			Else
	*!*				m.lcString = ""
	*!*			Endif
	*!*			?"m.lcString", m.lcString
	*!*			Return m.lcString
	*!*		Endproc


	Protected Procedure ReadPCString(pnAddress, pnLen)
		*!* pnAddress is a pointer to a memory pointer
		Local m.lnAddress, m.lnLength, m.lcString
		*!* Get address pointer
		m.lnAddress = ReadUInt(m.pnAddress)
		If m.lnAddress <> 0 Then
			m.lcString = Sys(2600, m.lnAddress, m.pnLen)
		Else
			m.lcString = ""
		Endif
		Return m.lcString
	Endproc

	*!*		Protected Procedure WritePCString(pnAddress, pcString)
	*!*			Local m.lnAdress As Integer
	*!*			*!* Release memory
	*!*			This.FreePMem(m.pnAddress)
	*!*			*!* Get a new handle for the string:
	*!*			m.lnAddress = This.AllocMem(Len(m.pcString))
	*!*			*!* Save string to handle
	*!*			=Sys(2600, m.lnAddress, Len(m.pcString), m.pcString)
	*!*			*!* Save value of handle in memory pointer
	*!*			This.WriteUInt(m.pnAddress, m.lnAddress)
	*!*		Endproc

	*!*		Protected Procedure ReadUInt(pnAddress)
	*!*			*!* Reads an unsigned integer (4 bytes)
	*!*			Local m.lnUInt As Integer
	*!*			m.lnUInt = CToBin(Sys(2600, m.pnAddress, 4), "4rs")
	*!*			If m.lnUInt < 0 Then
	*!*				m.lnUInt = m.lnUInt + 0x100000000
	*!*			Endif
	*!*			Return m.lnUInt
	*!*		Endproc

	*!*		Protected Procedure WriteUInt(pnAddress, pnUInt)
	*!*			*!* Writes an unsigned integer (4 bytes)
	*!*			=Sys(2600, m.pnAddress, 4, BinToC(m.pnUInt, "4rs"))
	*!*		Endproc

	*!*		Protected Procedure ReadUShort(pnAddress)
	*!*			Local m.lnShort As Short
	*!*			m.lnShort = CToBin(Sys(2600, m.pnAddress, 2), "2rs")
	*!*			If m.lnShort < 0 Then
	*!*				m.lnShort = m.lnShort + 0x10000
	*!*			Endif
	*!*			Return m.lnShort
	*!*		Endproc

	*!*		Protected Procedure WriteUShort(pnAddress, pnShort)
	*!*			*!* Writes an unsigned short (2 bytes)
	*!*			=Sys(2600, m.pnAddress, 2, BinToC(m.pnShort, "2rs"))
	*!*		Endproc

	*!*		Protected Procedure ReadPointer(pnAddress)
	*!*			*!* Reads an integer (4 bytes)
	*!*			Return CToBin(Sys(2600, m.pnAddress, 4), "4rs")
	*!*		Endproc

	*!*		Protected Procedure WritePointer(pnAddress, pnInt)
	*!*			*!* Writes an integer (4 bytes)
	*!*			=Sys(2600, m.pnAddress, 4, BinToC(m.pnInt, "4rs"))
	*!*		Endproc

	*!*		Protected Procedure ReadInt(pnAddress)
	*!*			*!* Reads an integer (4 bytes)
	*!*			Return CToBin(Sys(2600, m.pnAddress, 4), "4rs")
	*!*		Endproc

	*!*		Protected Procedure WriteInt(pnAddress, pnInt)
	*!*			*!* Writes an integer (4 bytes)
	*!*			=Sys(2600, m.pnAddress, 4, BinToC(m.pnInt, "4rs"))
	*!*		Endproc

	Protected Procedure ReadByte(pnAddress)
		*!* Reads an integer (1 bytes)
		Return CToBin(Sys(2600, m.pnAddress, 1), "1rs")
	Endproc

	Protected Procedure WriteByte(pnAddress, pnInt)
		*!* Writes an integer (1 bytes)
		=Sys(2600, m.pnAddress, 1, BinToC(m.pnInt, "1rs"))
	Endproc

	*!*		Protected Procedure ReadPointer(pnAddress)
	*!*			*!* Reads an integer (4 bytes)
	*!*			Return This.ReadUInt(m.pnAddress)
	*!*		Endproc

	*!*		Protected Procedure WritePointer(pnAddress, pnInt)
	*!*			*!* Writes an integer (4 bytes)
	*!*			Return This.WriteUInt(m.pnAddress, m.pnInt)
	*!*		Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagBITMAPFILEHEADER {
*!*	  WORD    bfType;
*!*	  DWORD   bfSize;
*!*	  WORD    bfReserved1;
*!*	  WORD    bfReserved2;
*!*	  DWORD   bfOffBits;
*!*	} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
********************************************************************************
Define Class _BITMAPFILEHEADER As _STRUCTBASE

	SizeOf = 14
	Name = "BITMAPFILEHEADER"
	&& structure fields
	bfType = FALSE
	bfSize = FALSE
	bfReserved1 = FALSE
	bfReserved2 = FALSE
	bfOffBits = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="bftype" type="property" display="bfType"/>' + ;
		'<memberdata name="bfsize" type="property" display="bfSize"/>' + ;
		'<memberdata name="bfreserved1" type="property" display="bfReserved1"/>' + ;
		'<memberdata name="bfreserved2" type="property" display="bfReserved2"/>' + ;
		'<memberdata name="bfoffbits" type="property" display="bfOffBits"/>' + ;
		'</VFPData>'

	Procedure bfType_Access()
		Return ReadUShort(This.Address)
	Endproc

	Procedure bfType_Assign(pnNewVal)
		WriteUShort(This.Address, m.pnNewVal)
	Endproc

	Procedure bfSize_Access()
		Return ReadUInt(This.Address + 2)
	Endproc

	Procedure bfSize_Assign(pnNewVal)
		WriteUInt(This.Address + 2, m.pnNewVal)
	Endproc

	Procedure bfReserved1_Access()
		Return ReadUShort(This.Address + 6)
	Endproc

	Procedure bfReserved1_Assign(pnNewVal)
		WriteUShort(This.Address + 6, m.pnNewVal)
	Endproc

	Procedure bfReserved2_Access()
		Return ReadUShort(This.Address + 8)
	Endproc

	Procedure bfReserved2_Assign(pnNewVal)
		WriteUShort(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure bfOffBits_Access()
		Return ReadUInt(This.Address + 10)
	Endproc

	Procedure bfOffBits_Assign(pnNewVal)
		WriteUInt(This.Address+10, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagBITMAPINFOHEADER{
*!*	  DWORD  biSize;
*!*	  LONG   biWidth;
*!*	  LONG   biHeight;
*!*	  WORD   biPlanes;
*!*	  WORD   biBitCount;
*!*	  DWORD  biCompression;
*!*	  DWORD  biSizeImage;
*!*	  LONG   biXPelsPerMeter;
*!*	  LONG   biYPelsPerMeter;
*!*	  DWORD  biClrUsed;
*!*	  DWORD  biClrImportant;
*!*	} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
********************************************************************************
Define Class _BITMAPINFOHEADER As _STRUCTBASE

	SizeOf = 40
	Name = "BITMAPINFOHEADER"
	&& structure fields
	biSize = FALSE
	biWidth = FALSE
	biHeight = FALSE
	biPlanes = FALSE
	biBitCount = FALSE
	biCompression = FALSE
	biSizeImage = FALSE
	biXPelsPerMeter = FALSE
	biYPelsPerMeter = FALSE
	biClrUsed = FALSE
	biClrImportant = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="bisize" type="property" display="biSize"/>' + ;
		'<memberdata name="biwidth" type="property" display="biWidth"/>' + ;
		'<memberdata name="biheight" type="property" display="biHeight"/>' + ;
		'<memberdata name="biplanes" type="property" display="biPlanes"/>' + ;
		'<memberdata name="bibitcount" type="property" display="biBitCount"/>' + ;
		'<memberdata name="bicompression" type="property" display="biCompression"/>' + ;
		'<memberdata name="bisizeimage" type="property" display="biSizeImage"/>' + ;
		'<memberdata name="bixpelspermeter" type="property" display="biXPelsPerMeter"/>' + ;
		'<memberdata name="biypelspermeter" type="property" display="biYPelsPerMeter"/>' + ;
		'<memberdata name="biclrused" type="property" display="biClrUsed"/>' + ;
		'<memberdata name="biclrimportant" type="property" display="biClrImportant"/>' + ;
		'</VFPData>'

	Procedure biSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure biSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure biWidth_Access()
		Return ReadInt(This.Address + 4)
	Endproc

	Procedure biWidth_Assign(pnNewVal)
		WriteInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure biHeight_Access()
		Return ReadInt(This.Address + 8)
	Endproc

	Procedure biHeight_Assign(pnNewVal)
		WriteInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure biPlanes_Access()
		Return ReadUShort(This.Address + 12)
	Endproc

	Procedure biPlanes_Assign(pnNewVal)
		WriteUShort(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure biBitCount_Access()
		Return ReadUShort(This.Address + 14)
	Endproc

	Procedure biBitCount_Assign(pnNewVal)
		WriteUShort(This.Address + 14, m.pnNewVal)
	Endproc

	Procedure biCompression_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Procedure biCompression_Assign(pnNewVal)
		WriteUInt(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure biSizeImage_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure biSizeImage_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure biXPelsPerMeter_Access()
		Return ReadInt(This.Address + 24)
	Endproc

	Procedure biXPelsPerMeter_Assign(pnNewVal)
		WriteInt(This.Address + 24, m.pnNewVal)
	Endproc

	Procedure biYPelsPerMeter_Access()
		Return ReadInt(This.Address + 28)
	Endproc

	Procedure biYPelsPerMeter_Assign(pnNewVal)
		WriteInt(This.Address + 28, m.pnNewVal)
	Endproc

	Procedure biClrUsed_Access()
		Return ReadUInt(This.Address + 32)
	Endproc

	Procedure biClrUsed_Assign(pnNewVal)
		WriteUInt(This.Address + 32, m.pnNewVal)
	Endproc

	Procedure biClrImportant_Access()
		Return ReadUInt(This.Address + 36)
	Endproc

	Procedure biClrImportant_Assign(pnNewVal)
		WriteUInt(This.Address + 36, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _browseinfo {
*!*	    HWND hwndOwner;
*!*	    UINT pidlRoot;
*!*	    LPTSTR pszDisplayName;
*!*	    LPCTSTR lpszTitle;
*!*	    UINT ulFlags;
*!*	    UINT lpfn;
*!*	    LPARAM lParam;
*!*	    int iImage;
*!*	} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
********************************************************************************
Define Class _BROWSEINFO As _STRUCTBASE

	Address = 0
	SizeOf = 32
	Name = "BROWSEINFO"
	&& structure fields
	hwndOwner = .F.
	pidlRoot = .F.
	pszDisplayName = .F.
	lpszTitle = .F.
	ulFlags = .F.
	lpfn = .F.
	Lparam = .F.
	iImage = .F.

	_MemberData = '<VFPData>' + ;
		'<memberdata name="hwndowner" type="property" display="hwndOwner"/>' + ;
		'<memberdata name="pidlroot" type="property" display="pidlRoot"/>' + ;
		'<memberdata name="pszdisplayname" type="property" display="pszDisplayName"/>' + ;
		'<memberdata name="lpsztitle" type="property" display="lpszTitle"/>' + ;
		'<memberdata name="ulflags" type="property" display="ulFlags"/>' + ;
		'<memberdata name="lpfn" type="property" display="lpfn"/>' + ;
		'<memberdata name="lparam" type="property" display="lParam"/>' + ;
		'<memberdata name="iimage" type="property" display="iImage"/>' + ;
		'</VFPData>'

	Procedure FreeMembers()
		FreePMem(This.Address + 8)
		FreePMem(This.Address + 12)
	Endproc

	Procedure hwndOwner_Access()
		Return ReadInt(This.Address)
	Endproc

	Procedure hwndOwner_Assign(lnNewVal)
		WriteInt(This.Address, m.lnNewVal)
	Endproc

	Procedure pidlRoot_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure pidlRoot_Assign(lnNewVal)
		WriteUInt(This.Address + 4, m.lnNewVal)
	Endproc

	Procedure pszDisplayName_Access()
		Return ReadPCString(This.Address + 8)
	Endproc

	Procedure pszDisplayName_Assign(lnNewVal)
		WritePCString(This.Address + 8, m.lnNewVal)
	Endproc

	Procedure lpszTitle_Access()
		Return ReadPCString(This.Address + 12)
	Endproc

	Procedure lpszTitle_Assign(lnNewVal)
		WritePCString(This.Address + 12, m.lnNewVal)
	Endproc

	Procedure ulFlags_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Procedure ulFlags_Assign(lnNewVal)
		WriteUInt(This.Address + 16, m.lnNewVal)
	Endproc

	Procedure lpfn_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure lpfn_Assign(lnNewVal)
		WriteUInt(This.Address + 20, m.lnNewVal)
	Endproc

	Procedure lParam_Access()
		Return ReadInt(This.Address + 24)
	Endproc

	Procedure lParam_Assign(lnNewVal)
		WriteInt(This.Address + 24, m.lnNewVal)
	Endproc

	Procedure iImage_Access()
		Return ReadInt(This.Address + 28)
	Endproc

	Procedure iImage_Assign(lnNewVal)
		WriteInt(This.Address + 28, m.lnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _DOC_INFO_1 {
*!*	  LPTSTR pDocName;
*!*	  LPTSTR pOutputFile;
*!*	  LPTSTR pDatatype;
*!*	} DOC_INFO_1;
********************************************************************************
Define Class _DOC_INFO_1 As _STRUCTBASE

	Address = 0
	SizeOf = 12
	Name = "DOC_INFO_1"
	&& structure fields
	pDocName = FALSE
	pOutputFile = FALSE
	pDatatype = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="pdocname" type="property" display="pDocName"/>' + ;
		'<memberdata name="poutputfile" type="property" display="pOutputFile"/>' + ;
		'<memberdata name="pdatatype" type="property" display="pDatatype"/>' + ;
		'</VFPData>'

	Procedure FreeMembers()
		FreePMem(This.Address)
		FreePMem(This.Address + 4)
		FreePMem(This.Address + 8)
	Endproc

	Procedure pDocName_Access()
		Return ReadPCString(This.Address)
	Endproc

	Procedure pDocName_Assign(pnNewVal)
		WritePCString(This.Address, m.pnNewVal)
	Endproc

	Procedure pOutputFile_Access()
		Return ReadPCString(This.Address + 4)
	Endproc

	Procedure pOutputFile_Assign(pnNewVal)
		WritePCString(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure pDatatype_Access()
		Return ReadPCString(This.Address + 8)
	Endproc

	Procedure pDatatype_Assign(pnNewVal)
		WritePCString(This.Address + 8, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagDRAWITEMSTRUCT {
*!*	  UINT CtlType;
*!*	  UINT CtlID;
*!*	  UINT itemID;
*!*	  UINT itemAction;
*!*	  UINT itemState;
*!*	  HWND hwndItem;
*!*	  HDC hDC;
*!*	  RECT rcItem;
*!*	  ULONG_PTR itemData;
*!*	} DRAWITEMSTRUCT;
********************************************************************************
Define Class _DRAWITEMSTRUCT As _STRUCTBASE

	SizeOf = 48
	Name = "DRAWITEMSTRUCT"
	&& structure fields
	CtlType = FALSE
	CtlID = FALSE
	ItemID = FALSE
	itemAction = FALSE
	itemState = FALSE
	hwndItem = FALSE
	hDC = FALSE
	rcItem = .Null.
	ItemData = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="ctltype" type="property" display="CtlType"/>' + ;
		'<memberdata name="ctlid" type="property" display="CtlID"/>' + ;
		'<memberdata name="itemid" type="property" display="itemID"/>' + ;
		'<memberdata name="itemaction" type="property" display="itemAction"/>' + ;
		'<memberdata name="itemstate" type="property" display="itemState"/>' + ;
		'<memberdata name="hwnditem" type="property" display="hwndItem"/>' + ;
		'<memberdata name="hdc" type="property" display="hDC"/>' + ;
		'<memberdata name="rcitem" type="property" display="rcItem"/>' + ;
		'<memberdata name="itemdata" type="property" display="itemData"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.rcItem = Createobject("_RECT",This.Address + 28)
	Endproc

	Procedure FreeMembers()
		This.rcItem = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.rcItem.Address = m.lnAddress + 28
		Endif
	Endproc

	Procedure CtlType_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure CtlType_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure CtlID_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure CtlID_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure itemID_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Procedure itemID_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure itemAction_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure itemAction_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure itemState_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Procedure itemState_Assign(pnNewVal)
		WriteUInt(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure hwndItem_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure hwndItem_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure hDC_Access()
		Return ReadPointer(This.Address + 24)
	Endproc

	Procedure hDC_Assign(pnNewVal)
		WritePointer(This.Address + 24, m.pnNewVal)
	Endproc

	Procedure itemData_Access()
		Return ReadUInt(This.Address + 44)
	Endproc

	Procedure itemData_Assign(pnNewVal)
		WriteUInt(This.Address + 44, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _FILETIME {
*!*	 DWORD dwLowDateTime;
*!*	 DWORD dwHighDateTime;
*!*	} FILETIME,
*!*	 *PFILETIME;
********************************************************************************
Define Class _FILETIME As _STRUCTBASE

	SizeOf = 8
	Name = "FILETIME"
	&& structure fields
	dwLowDateTime = FALSE
	dwHighDateTime = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="dwlowdatetime" type="property" display="dwLowDateTime"/>' + ;
		'<memberdata name="dwhighdatetime" type="property" display="dwHighDateTime"/>' + ;
		'</VFPData>'

	Procedure dwLowDateTime_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure dwLowDateTime_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure dwHighDateTime_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure dwHighDateTime_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct
*!*	{
*!*	    BYTE        bWidth;          // Width, in pixels, of the image
*!*	    BYTE        bHeight;         // Height, in pixels, of the image
*!*	    BYTE        bColorCount;     // Number of colors in image (0 if >=8bpp)
*!*	    BYTE        bReserved;       // Reserved ( must be 0)
*!*	    WORD        wPlanes;         // Color Planes
*!*	    WORD        wBitCount;       // Bits per pixel
*!*	    DWORD       dwBytesInRes;    // How many bytes in this resource?
*!*	    DWORD       dwImageOffset;   // Where in the file is this image?
*!*	} ICONDIRENTRY, *LPICONDIRENTRY;
********************************************************************************
Define Class _ICONDIRENTRY As _STRUCTBASE

	SizeOf = 16
	Name = "ICONDIRENTRY"
	&& structure fields
	bWidth = FALSE
	bHeight = FALSE
	bColorCount = FALSE
	bReserved = FALSE
	wPlanes = FALSE
	wBitCount = FALSE
	dwBytesInRes = FALSE
	dwImageOffset = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="bwidth" type="property" display="bWidth"/>' + ;
		'<memberdata name="bheight" type="property" display="bHeight"/>' + ;
		'<memberdata name="bcolorcount" type="property" display="bColorCount"/>' + ;
		'<memberdata name="breserved" type="property" display="bReserved"/>' + ;
		'<memberdata name="wplanes" type="property" display="wPlanes"/>' + ;
		'<memberdata name="wbitcount" type="property" display="wBitCount"/>' + ;
		'<memberdata name="dwbytesinres" type="property" display="dwBytesInRes"/>' + ;
		'<memberdata name="dwimageoffset" type="property" display="dwImageOffset"/>' + ;
		'</VFPData>'

	Procedure bWidth_Access()
		Local m.lnWidth
		m.lnWidth = This.ReadByte(This.Address)
		If m.lnWidth < 0 Then
			m.lnWidth = m.lnWidth + 0x100
		Endif
		If m.lnWidth = 0 Then
			m.lnWidth = 256
		Endif
		Return m.lnWidth
	Endproc

	Procedure bWidth_Assign(pnNewVal)
		If m.pnNewVal = 256 Then
			m.pnNewVal = 0
		Endif
		If m.pnNewVal < 0 Then
			m.pnNewVal = m.pnNewVal + 0x100
		Endif
		This.WriteByte(This.Address, m.pnNewVal)
	Endproc

	Procedure bHeight_Access()
		Local m.lnHeight
		m.lnHeight = This.ReadByte(This.Address + 1)
		If m.lnHeight < 0 Then
			m.lnHeight = m.lnHeight + 0x100
		Endif
		If m.lnHeight = 0 Then
			m.lnHeight = 256
		Endif
		Return m.lnHeight
	Endproc

	Procedure bHeight_Assign(pnNewVal)
		If m.pnNewVal = 256 Then
			m.pnNewVal = 0
		Endif
		If m.pnNewVal < 0 Then
			m.pnNewVal = m.pnNewVal + 0x100
		Endif
		This.WriteByte(This.Address + 1, m.pnNewVal)
	Endproc

	Procedure bColorCount_Access()
		Return This.ReadByte(This.Address + 2)
	Endproc

	Procedure bColorCount_Assign(pnNewVal)
		This.WriteByte(This.Address + 2, m.pnNewVal)
	Endproc

	Procedure bReserved_Access()
		Return This.ReadByte(This.Address + 3)
	Endproc

	Procedure bReserved_Assign(pnNewVal)
		This.WriteByte(This.Address + 3, m.pnNewVal)
	Endproc

	Procedure wPlanes_Access()
		Return ReadUShort(This.Address + 4)
	Endproc

	Procedure wPlanes_Assign(pnNewVal)
		WriteUShort(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure wBitCount_Access()
		Return ReadUShort(This.Address + 6)
	Endproc

	Procedure wBitCount_Assign(pnNewVal)
		WriteUShort(This.Address + 6, m.pnNewVal)
	Endproc

	Procedure dwBytesInRes_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Procedure dwBytesInRes_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure dwImageOffset_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure dwImageOffset_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagLOGFONT {
*!*	  LONG lfHeight;
*!*	  LONG lfWidth;
*!*	  LONG lfEscapement;
*!*	  LONG lfOrientation;
*!*	  LONG lfWeight;
*!*	  BYTE lfItalic;
*!*	  BYTE lfUnderline;
*!*	  BYTE lfStrikeOut;
*!*	  BYTE lfCharSet;
*!*	  BYTE lfOutPrecision;
*!*	  BYTE lfClipPrecision;
*!*	  BYTE lfQuality;
*!*	  BYTE lfPitchAndFamily;
*!*	  TCHAR lfFaceName[LF_FACESIZE];
*!*	} LOGFONT, *PLOGFONT;
********************************************************************************
Define Class _LOGFONT As _STRUCTBASE
	SizeOf = 60
	Name = "LOGFONT"
	&& structure fields
	lfHeight = FALSE
	lfWidth = FALSE
	lfEscapement = FALSE
	lfOrientation = FALSE
	lfWeight = FALSE
	lfItalic = FALSE
	lfUnderline = FALSE
	lfStrikeOut = FALSE
	lfCharSet = FALSE
	lfOutPrecision = FALSE
	lfClipPrecision = FALSE
	lfQuality = FALSE
	lfPitchAndFamily = FALSE
	lfFaceName = FALSE
	&& extra properties
	FontBold = FALSE
	FontCharSet = 1
	FontItalic = FALSE
	FontName = ""
	FontSize = 0
	FontStrikethru = FALSE
	FontUnderline = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="lfheight" type="property" display="lfHeight"/>' + ;
		'<memberdata name="lfwidth" type="property" display="lfWidth"/>' + ;
		'<memberdata name="lfescapement" type="property" display="lfEscapement"/>' + ;
		'<memberdata name="lforientation" type="property" display="lfOrientation"/>' + ;
		'<memberdata name="lfweight" type="property" display="lfWeight"/>' + ;
		'<memberdata name="lfitalic" type="property" display="lfItalic"/>' + ;
		'<memberdata name="lfunderline" type="property" display="lfUnderline"/>' + ;
		'<memberdata name="lfstrikeout" type="property" display="lfStrikeOut"/>' + ;
		'<memberdata name="lfcharset" type="property" display="lfCharSet"/>' + ;
		'<memberdata name="lfoutprecision" type="property" display="lfOutPrecision"/>' + ;
		'<memberdata name="lfclipprecision" type="property" display="lfClipPrecision"/>' + ;
		'<memberdata name="lfquality" type="property" display="lfQuality"/>' + ;
		'<memberdata name="lfpitchandfamily" type="property" display="lfPitchAndFamily"/>' + ;
		'<memberdata name="lffacename" type="property" display="lfFaceName"/>' + ;
		'<memberdata name="fontbold" type="property" display="FontBold"/>' + ;
		'<memberdata name="fontcharset" type="property" display="FontCharSet"/>' + ;
		'<memberdata name="fontitalic" type="property" display="FontItalic"/>' + ;
		'<memberdata name="fontname" type="property" display="FontName"/>' + ;
		'<memberdata name="fontsize" type="property" display="FontSize"/>' + ;
		'<memberdata name="fontstrikethru" type="property" display="FontStrikethru"/>' + ;
		'<memberdata name="fontunderline" type="property" display="FontUnderline"/>' + ;
		'</VFPData>'

	Procedure FontBold_Access()
		Return Iif(This.lfWeight >= FW_BOLD, TRUE, FALSE)
	Endproc

	Procedure FontBold_Assign(vNewVal)
		If Vartype(m.vNewVal) = T_NUMERIC Then
			If m.vNewVal < FW_BOLD Then
				m.vNewVal = FALSE
			Else
				m.vNewVal = TRUE
			Endif
		Endif
		If m.vNewVal = TRUE Then
			This.lfWeight = FW_BOLD
		Else
			This.lfWeight = FW_NORMAL
		Endif
	Endproc

	Procedure FontCharset_Access()
		Return This.lfCharSet
	Endproc

	Procedure FontCharset_Assign(vNewVal)
		This.lfCharSet = m.vNewVal
	Endproc

	Procedure FontItalic_Access()
		Return Iif(This.lfItalic <> 0, TRUE, FALSE)
	Endproc

	Procedure FontItalic_Assign(vNewVal)
		If Vartype(m.vNewVal) = T_NUMERIC Then
			If m.vNewVal = 0 Then
				m.vNewVal = FALSE
			Else
				m.vNewVal = TRUE
			Endif
		Endif
		If m.vNewVal = TRUE Then
			This.lfItalic = 1
		Else
			This.lfItalic = 0
		Endif
	Endproc

	Procedure FontName_Access()
		Return This.lfFaceName
	Endproc

	Procedure FontName_Assign(vNewVal)
		If Right(m.vNewVal, 1) <> NULCHAR Then
			m.vNewVal = m.vNewVal + NULCHAR
		Endif
		This.lfFaceName = m.vNewVal
	Endproc

	Procedure FontSize_Access()
		Return ctlFontHeightToPoints(This.lfHeight)
	Endproc

	Procedure FontSize_Assign(vNewVal)
		This.lfHeight = ctlFontPointsToHeight(m.vNewVal)
	Endproc

	Procedure FontStrikethru_Access()
		Return Iif(This.lfStrikeOut <> 0, TRUE, FALSE)
	Endproc

	Procedure FontStrikethru_Assign(vNewVal)
		If Vartype(m.vNewVal) = T_NUMERIC Then
			If m.vNewVal = 0 Then
				m.vNewVal = FALSE
			Else
				m.vNewVal = TRUE
			Endif
		Endif
		If m.vNewVal = TRUE Then
			This.lfStrikeOut = 1
		Else
			This.lfStrikeOut = 0
		Endif
	Endproc

	Procedure FontUnderline_Access()
		Return Iif(This.lfUnderline <> 0, TRUE, FALSE)
	Endproc

	Procedure FontUnderline_Assign(vNewVal)
		If Vartype(m.vNewVal) = T_NUMERIC Then
			If m.vNewVal = 0 Then
				m.vNewVal = FALSE
			Else
				m.vNewVal = TRUE
			Endif
		Endif
		If m.vNewVal = TRUE Then
			This.lfUnderline = 1
		Else
			This.lfUnderline = 0
		Endif
	Endproc

	Procedure lfHeight_Access()
		Return ReadInt(This.Address)
	Endproc

	Procedure lfHeight_Assign(pnNewVal)
		WriteInt(This.Address, m.pnNewVal)
	Endproc

	Procedure lfWidth_Access()
		Return ReadInt(This.Address + 4)
	Endproc

	Procedure lfWidth_Assign(pnNewVal)
		WriteInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure lfEscapement_Access()
		Return ReadInt(This.Address + 8)
	Endproc

	Procedure lfEscapement_Assign(pnNewVal)
		WriteInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure lfOrientation_Access()
		Return ReadInt(This.Address + 12)
	Endproc

	Procedure lfOrientation_Assign(pnNewVal)
		WriteInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure lfWeight_Access()
		Return ReadInt(This.Address + 16)
	Endproc

	Procedure lfWeight_Assign(pnNewVal)
		WriteInt(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure lfItalic_Access()
		Return This.ReadByte(This.Address + 20)
	Endproc

	Procedure lfItalic_Assign(pnNewVal)
		This.WriteByte(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure lfUnderline_Access()
		Return This.ReadByte(This.Address + 21)
	Endproc

	Procedure lfUnderline_Assign(pnNewVal)
		This.WriteByte(This.Address + 21, m.pnNewVal)
	Endproc

	Procedure lfStrikeOut_Access()
		Return This.ReadByte(This.Address + 22)
	Endproc

	Procedure lfStrikeOut_Assign(pnNewVal)
		This.WriteByte(This.Address + 22, m.pnNewVal)
	Endproc

	Procedure lfCharSet_Access()
		Return This.ReadByte(This.Address + 23)
	Endproc

	Procedure lfCharSet_Assign(pnNewVal)
		This.WriteByte(This.Address + 23, m.pnNewVal)
	Endproc

	Procedure lfOutPrecision_Access()
		Return This.ReadByte(This.Address + 24)
	Endproc

	Procedure lfOutPrecision_Assign(pnNewVal)
		This.WriteByte(This.Address + 24, m.pnNewVal)
	Endproc

	Procedure lfClipPrecision_Access()
		Return This.ReadByte(This.Address + 25)
	Endproc

	Procedure lfClipPrecision_Assign(pnNewVal)
		This.WriteByte(This.Address + 25, m.pnNewVal)
	Endproc

	Procedure lfQuality_Access()
		Return This.ReadByte(This.Address + 26)
	Endproc

	Procedure lfQuality_Assign(pnNewVal)
		This.WriteByte(This.Address + 26, m.pnNewVal)
	Endproc

	Procedure lfPitchAndFamily_Access()
		Return This.ReadByte(This.Address + 27)
	Endproc

	Procedure lfPitchAndFamily_Assign(pnNewVal)
		This.WriteByte(This.Address + 27, m.pnNewVal)
	Endproc

	Procedure lfFaceName_Access()
		Return ReadCharArray(This.Address + 28, 32)
	Endproc

	Procedure lfFaceName_Assign(pnNewVal)
		WriteCharArray(This.Address + 28, m.pnNewVal, 32)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct {
*!*	        UINT cbSize;
*!*	        POINT pt;

*!*	        UINT uHit;   // out param
*!*	        SYSTEMTIME st;
*!*	#if (NTDDI_VERSION >= NTDDI_LONGHORN)
*!*	        RECT rc;
*!*	        int iOffset;
*!*	        int iRow;
*!*	        int iCol;
*!*	#endif
*!*	} MCHITTESTINFO, *PMCHITTESTINFO;
********************************************************************************
Define Class _MCHITTESTINFO As _STRUCTBASE

	SizeOf = 32
	Name = "MCHITTESTINFO"
	&& structure fields
	cbSize = FALSE
	pt = .Null.
	uHit = FALSE
	st = .Null.

	_MemberData = '<VFPData>' + ;
		'<memberdata name="cbsize" type="property" display="cbSize"/>' + ;
		'<memberdata name="pt" type="property" display="pt"/>' + ;
		'<memberdata name="uhit" type="property" display="uHit"/>' + ;
		'<memberdata name="st" type="property" display="st"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.cbSize = This.SizeOf
		This.pt = Createobject("_POINT", This.Address + 4)
		This.st = Createobject("_SYSTEMTIME", This.Address + 16)
	Endproc

	Procedure FreeMembers()
		This.pt = .Null.
		This.st = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.pt.Address = m.lnAddress + 4
			This.st.Address = m.lnAddress + 16
		Endif
	Endproc

	Procedure cbSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure cbSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure uHit_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure uHit_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagMEASUREITEMSTRUCT {
*!*	  UINT CtlType;
*!*	  UINT CtlID;
*!*	  UINT itemID;
*!*	  UINT itemWidth;
*!*   UINT itemHeight;
*!*   DWORD itemData
*!*	} MEASUREITEMSTRUCT;
********************************************************************************
Define Class _MEASUREITEMSTRUCT As _STRUCTBASE

	SizeOf = 24
	Name = "MEASUREITEMSTRUCT"
	&& structure fields
	CtlType = FALSE
	CtlID = FALSE
	ItemID = FALSE
	itemWidth = FALSE
	itemHeight = FALSE
	ItemData = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="ctltype" type="property" display="CtlType"/>' + ;
		'<memberdata name="ctlid" type="property" display="CtlID"/>' + ;
		'<memberdata name="itemid" type="property" display="itemID"/>' + ;
		'<memberdata name="itemwidth" type="property" display="itemWidth"/>' + ;
		'<memberdata name="itemheight" type="property" display="itemHeight"/>' + ;
		'<memberdata name="itemdata" type="property" display="itemData"/>' + ;
		'</VFPData>'

	Procedure CtlType_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure CtlType_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure CtlID_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure CtlID_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure itemID_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Procedure itemID_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure itemWidth_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure itemWidth_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure itemHeight_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Procedure itemHeight_Assign(pnNewVal)
		WriteUInt(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure itemData_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure itemData_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagMENUINFO {
*!*	  DWORD   cbSize;
*!*	  DWORD   fMask;
*!*	  DWORD   dwStyle;
*!*	  UINT    cyMax;
*!*	  HBRUSH  hbrBack;
*!*	  DWORD   dwContextHelpID;
*!*	  ULONG_PTR  dwMenuData;
*!*	} MENUINFO, FAR *LPMENUINFO;
*!*	typedef MENUINFO CONST FAR *LPCMENUINFO;
********************************************************************************
Define Class _MENUINFO As _STRUCTBASE

	SizeOf = 28
	Name = "MENUINFO"
	*!* structure fields
	cbSize = FALSE
	fMask = FALSE
	dwStyle = FALSE
	cyMax = FALSE
	hbrBack = FALSE
	dwContextHelpID = FALSE
	dwMenuData = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="cbsize" type="property" display="cbSize"/>' + ;
		'<memberdata name="fmask" type="property" display="fMask"/>' + ;
		'<memberdata name="dwstyle" type="property" display="dwStyle"/>' + ;
		'<memberdata name="cymax" type="property" display="cyMax"/>' + ;
		'<memberdata name="hbrback" type="property" display="hbrBack"/>' + ;
		'<memberdata name="dwcontexthelpid" type="property" display="dwContextHelpID"/>' + ;
		'<memberdata name="dwmenudata" type="property" display="dwMenuData"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		*!* Important! init cbSize to size of structure
		This.cbSize = This.SizeOf
	Endproc

	Procedure cbSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure cbSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure fMask_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure fMask_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure dwStyle_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Procedure dwStyle_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure cyMax_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure cyMax_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure hbrBack_Access()
		Return ReadPointer(This.Address + 16)
	Endproc

	Procedure hbrBack_Assign(pnNewVal)
		WritePointer(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure dwContextHelpID_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure dwContextHelpID_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure dwMenuData_Access()
		Return ReadUInt(This.Address + 24)
	Endproc

	Procedure dwMenuData_Assign(pnNewVal)
		WriteUInt(This.Address + 24, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagMENUITEMINFO {
*!*	  UINT    cbSize;
*!*	  UINT    fMask;
*!*	  UINT    fType;
*!*	  UINT    fState;
*!*	  UINT    wID;
*!*	  HMENU   hSubMenu;
*!*	  HBITMAP hbmpChecked;
*!*	  HBITMAP hbmpUnchecked;
*!*	  ULONG_PTR dwItemData;
*!*	  LPTSTR  dwTypeData;
*!*	  UINT    cch;
*!*	  HBITMAP hbmpItem;
*!*	} MENUITEMINFO, *LPMENUITEMINFO;
********************************************************************************
Define Class _MENUITEMINFO As _STRUCTBASE

	SizeOf = 48
	Name = "MENUITEMINFO"
	*!* structure fields
	cbSize = FALSE
	fMask = FALSE
	fType = FALSE
	fState = FALSE
	wID = FALSE
	hSubMenu = FALSE
	hbmpChecked = FALSE
	hbmpUnchecked = FALSE
	dwItemData = FALSE
	dwTypeData = FALSE
	cch = FALSE
	hbmpItem = FALSE

	Protected _MemberData
	_MemberData = '<VFPData>' + ;
		'<memberdata name="cbsize" type="property" display="cbSize"/>' + ;
		'<memberdata name="fmask" type="property" display="fMask"/>' + ;
		'<memberdata name="ftype" type="property" display="fType"/>' + ;
		'<memberdata name="fstate" type="property" display="fState"/>' + ;
		'<memberdata name="wid" type="property" display="wID"/>' + ;
		'<memberdata name="hsubmenu" type="property" display="hSubMenu"/>' + ;
		'<memberdata name="hbmpchecked" type="property" display="hbmpChecked"/>' + ;
		'<memberdata name="hbmpunchecked" type="property" display="hbmpUnchecked"/>' + ;
		'<memberdata name="dwitemdata" type="property" display="dwItemData"/>' + ;
		'<memberdata name="dwtypedata" type="property" display="dwTypeData"/>' + ;
		'<memberdata name="cch" type="property" display="cch"/>' + ;
		'<memberdata name="hbmpitem" type="property" display="hbmpItem"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		*!* Important! init cbSize to size of structure
		This.cbSize = This.SizeOf
	Endproc

	Procedure FreeMembers()
		FreePMem(This.Address + 36)
	Endproc

	Hidden Procedure cbSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Hidden Procedure cbSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Hidden Procedure fMask_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Hidden Procedure fMask_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Hidden Procedure fType_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Hidden Procedure fType_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

	Hidden Procedure fState_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Hidden Procedure fState_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Hidden Procedure wID_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Hidden Procedure wID_Assign(pnNewVal)
		WriteUInt(This.Address + 16, m.pnNewVal)
	Endproc

	Hidden Procedure hSubMenu_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Hidden Procedure hSubMenu_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

	Hidden Procedure hbmpChecked_Access()
		Return ReadUInt(This.Address + 24)
	Endproc

	Hidden Procedure hbmpChecked_Assign(pnNewVal)
		WriteUInt(This.Address + 24, m.pnNewVal)
	Endproc

	Hidden Procedure hbmpUnchecked_Access()
		Return ReadUInt(This.Address + 28)
	Endproc

	Hidden Procedure hbmpUnchecked_Assign(pnNewVal)
		WriteUInt(This.Address + 28, m.pnNewVal)
	Endproc

	Hidden Procedure dwItemData_Access()
		Return ReadUInt(This.Address + 32)
	Endproc

	Hidden Procedure dwItemData_Assign(pnNewVal)
		WriteUInt(This.Address + 32, m.pnNewVal)
	Endproc

	Hidden Procedure dwTypeData_Access()
		Return ReadPCString(This.Address + 36)
	Endproc

	Hidden Procedure dwTypeData_Assign(pnNewVal)
		WritePCString(This.Address + 36, m.pnNewVal)
	Endproc

	Hidden Procedure cch_Access()
		Return ReadUInt(This.Address + 40)
	Endproc

	Hidden Procedure cch_Assign(pnNewVal)
		WriteUInt(This.Address + 40, m.pnNewVal)
	Endproc

	Hidden Procedure hbmpItem_Access()
		Return ReadUInt(This.Address + 44)
	Endproc

	Hidden Procedure hbmpItem_Assign(pnNewVal)
		WriteUInt(This.Address + 44, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagMONITORINFOEX {
*!*	  DWORD  cbSize;
*!*	  RECT   rcMonitor;
*!*	  RECT   rcWork;
*!*	  DWORD  dwFlags;
*!*	  TCHAR  szDevice[CCHDEVICENAME];
*!*	} MONITORINFOEX, *LPMONITORINFOEX;
********************************************************************************
Define Class _MONITORINFOEX As _STRUCTBASE

	SizeOf = 72
	Name = "MONITORINFOEX"
	&& structure fields
	cbSize = FALSE
	rcMonitor = .Null.
	rcWork = .Null.
	dwFlags = FALSE
	szDevice = FALSE

	Protected _MemberData
	_MemberData = '<VFPData>' + ;
		'<memberdata name="cbsize" type="property" display="cbSize"/>' + ;
		'<memberdata name="rcmonitor" type="property" display="rcMonitor"/>' + ;
		'<memberdata name="rcwork" type="property" display="rcWork"/>' + ;
		'<memberdata name="dwflags" type="property" display="dwFlags"/>' + ;
		'<memberdata name="szdevice" type="property" display="szDevice"/>' + ;
		'</VFPData>'

	Procedure InitMembers
		This.cbSize = This.SizeOf
		This.rcMonitor = Createobject("_RECT", This.Address + 4)
		This.rcWork = Createobject("_RECT", This.Address + 20)
	Endproc

	Procedure FreeMembers()
		This.rcMonitor = .Null.
		This.rcWork = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.rcMonitor.Address = m.lnAddress + 4
			This.rcWork.Address = m.lnAddress + 20
		Endif
	Endproc

	Procedure cbSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure cbSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure dwFlags_Access()
		Return ReadUInt(This.Address + 36)
	Endproc

	Procedure dwFlags_Assign(pnNewVal)
		WriteUInt(This.Address + 36, m.pnNewVal)
	Endproc

	Procedure szDevice_Access()
		Return ReadCharArray(This.Address + 40, 32)
	Endproc

	Procedure szDevice_Assign(pnNewVal)
		WriteCharArray(This.Address + 40, m.pnNewVal, 32)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagNMCUSTOMDRAWINFO {
*!*	    NMHDR hdr;
*!*	    DWORD dwDrawStage;
*!*	    HDC hdc;
*!*	    RECT rc;
*!*	    DWORD_PTR dwItemSpec;
*!*	    UINT uItemState;
*!*	    LPARAM lItemlParam;
*!*	} NMCUSTOMDRAW, *LPNMCUSTOMDRAW;
********************************************************************************
Define Class _NMCUSTOMDRAW As _STRUCTBASE

	SizeOf = 48
	Name = "NMCUSTOMDRAW"
	&& structure fields
	hdr = .Null.
	dwDrawStage = FALSE
	hDC = FALSE
	rc = .Null.
	dwItemSpec = FALSE
	uItemState = FALSE
	lItemlParam = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="hdr" type="property" display="hdr"/>' + ;
		'<memberdata name="dwdrawstage" type="property" display="dwDrawStage"/>' + ;
		'<memberdata name="hdc" type="property" display="hdc"/>' + ;
		'<memberdata name="rc" type="property" display="rc"/>' + ;
		'<memberdata name="dwitemspec" type="property" display="dwItemSpec"/>' + ;
		'<memberdata name="uitemstate" type="property" display="uItemState"/>' + ;
		'<memberdata name="litemlparam" type="property" display="lItemlParam"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.hdr = Createobject("_NMHDR", This.Address)
		This.rc = Createobject("_RECT", This.Address + 20)
	Endproc

	Procedure FreeMembers()
		This.hdr = .Null.
		This.rc = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.hdr.Address = m.lnAddress
			This.rc.Address = m.lnAddress + 20
		Endif
	Endproc

	Procedure dwDrawStage_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure dwDrawStage_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure hDC_Access()
		Return ReadPointer(This.Address + 16)
	Endproc

	Procedure hDC_Assign(pnNewVal)
		WritePointer(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure dwItemSpec_Access()
		Return ReadUInt(This.Address + 36)
	Endproc

	Procedure dwItemSpec_Assign(pnNewVal)
		WriteUInt(This.Address + 36, m.pnNewVal)
	Endproc

	Procedure uItemState_Access()
		Return ReadUInt(This.Address + 40)
	Endproc

	Procedure uItemState_Assign(pnNewVal)
		WriteUInt(This.Address + 40, m.pnNewVal)
	Endproc

	Procedure lItemlParam_Access()
		Return ReadInt(This.Address + 44)
	Endproc

	Procedure lItemlParam_Assign(pnNewVal)
		WriteInt(This.Address + 44, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _RECT {
*!*	  LONG Left;
*!*	  LONG Top;
*!*	  LONG Right;
*!*	  LONG Bottom;
*!*	} RECT, *PRECT;
********************************************************************************
Define Class _RECT As _STRUCTBASE

	SizeOf = 16
	Name = "RECT"
	*!*  structure fields
	Left = FALSE
	Top = FALSE
	Right = FALSE
	Bottom = FALSE
	&& Extra properties
	Height = FALSE
	Width = FALSE

	Protected _MemberData
	_MemberData = '<VFPData>' + ;
		'<memberdata name="left" type="property" display="Left"/>' + ;
		'<memberdata name="top" type="property" display="Top"/>' + ;
		'<memberdata name="right" type="property" display="Right"/>' + ;
		'<memberdata name="bottom" type="property" display="Bottom"/>' + ;
		'<memberdata name="height" type="property" display="Height"/>' + ;
		'<memberdata name="width" type="property" display="Width"/>' + ;
		'</VFPData>'

	Hidden Procedure Left_Access()
		Return ReadInt(This.Address)
	Endproc

	Hidden Procedure Left_Assign(pnNewVal)
		WriteInt(This.Address, m.pnNewVal)
	Endproc

	Hidden Procedure Top_Access()
		Return ReadInt(This.Address + 4)
	Endproc

	Hidden Procedure Top_Assign(pnNewVal)
		WriteInt(This.Address + 4, m.pnNewVal)
	Endproc

	Hidden Procedure Right_Access()
		Return ReadInt(This.Address + 8)
	Endproc

	Hidden Procedure Right_Assign(pnNewVal)
		WriteInt(This.Address + 8, m.pnNewVal)
	Endproc

	Hidden Procedure Bottom_Access()
		Return ReadInt(This.Address + 12)
	Endproc

	Hidden Procedure Bottom_Assign(pnNewVal)
		WriteInt(This.Address + 12, m.pnNewVal)
	Endproc

	Hidden Procedure Height_Access()
		Return This.Bottom - This.Top
	Endproc

	Hidden Procedure Height_Assign(pnNewVal)
		This.Height = m.pnNewVal
		This.Bottom = This.Top + m.pnNewVal
	Endproc

	Hidden Procedure Width_Access()
		Return This.Right - This.Left
	Endproc

	Hidden Procedure Width_Assign(pnNewVal)
		This.Width = m.pnNewVal
		This.Right = This.Left + m.pnNewVal
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagPOINT {
*!*	  LONG x;
*!*	  LONG y;
*!*	} POINT, *PPOINT;
********************************************************************************
Define Class _POINT As _STRUCTBASE

	SizeOf = 8
	Name = "POINT"
	&& structure fields
	x = FALSE
	Y = FALSE

	Protected _MemberData
	_MemberData = '<VFPData>' + ;
		'<memberdata name="x" type="property" display="X"/>' + ;
		'<memberdata name="y" type="property" display="Y"/>' + ;
		'</VFPData>'

	Procedure x_Access()
		Return ReadInt(This.Address)
	Endproc

	Procedure x_Assign(pnNewVal)
		WriteInt(This.Address, m.pnNewVal)
	Endproc

	Procedure y_Access()
		Return ReadInt(This.Address + 4)
	Endproc

	Procedure y_Assign(pnNewVal)
		WriteInt(This.Address + 4, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _WINDOWPLACEMENT {
*!*	  UINT length;
*!*	  UINT flags;
*!*	  UINT showCmd;
*!*	  POINT ptMinPosition;
*!*	  POINT ptMaxPosition;
*!*	  RECT rcNormalPosition;
*!*	} WINDOWPLACEMENT;
********************************************************************************
Define Class _WINDOWPLACEMENT As _STRUCTBASE

	SizeOf = 44
	Name = "WINDOWPLACEMENT"
	&& structure fields
	Length = FALSE
	Flags = FALSE
	ShowCmd = FALSE
	ptMinPosition = .Null.
	ptMaxPosition = .Null.
	rcNormalPosition = .Null.

	Protected _MemberData
	_MemberData = '<VFPData>' + ;
		'<memberdata name="length" type="property" display="length"/>' + ;
		'<memberdata name="flags" type="property" display="flags"/>' + ;
		'<memberdata name="showcmd" type="property" display="showCmd"/>' + ;
		'<memberdata name="ptminposition" type="property" display="ptMinPosition"/>' + ;
		'<memberdata name="ptmaxposition" type="property" display="ptMaxPosition"/>' + ;
		'<memberdata name="rcnormalposition" type="property" display="rcNormalPosition"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.Length = This.SizeOf
		This.ptMinPosition = Createobject("_POINT", This.Address + 12)
		This.ptMaxPosition = Createobject("_POINT", This.Address + 20)
		This.rcNormalPosition = Createobject("_RECT", This.Address + 28)
	Endproc

	Procedure FreeMembers()
		This.ptMinPosition = .Null.
		This.ptMaxPosition = .Null.
		This.rcNormalPosition = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.ptMinPosition.Address = m.lnAddress + 12
			This.ptMaxPosition.Address = m.lnAddress + 20
			This.rcNormalPosition.Address = m.lnAddress + 28
		Endif
	Endproc

	Procedure length_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure length_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure flags_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure flags_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure showCmd_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Procedure showCmd_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagSCROLLINFO {
*!*	    UINT cbSize;
*!*	    UINT fMask;
*!*	    int  nMin;
*!*	    int  nMax;
*!*	    UINT nPage;
*!*	    int  nPos;
*!*	    int  nTrackPos;
*!*	}   SCROLLINFO, *LPSCROLLINFO;
*!*	typedef SCROLLINFO CONST *LPCSCROLLINFO;
********************************************************************************
Define Class _SCROLLINFO As _STRUCTBASE

	SizeOf = 28
	Name = "SCROLLINFO"
	&& structure fields
	cbSize = FALSE
	fMask = FALSE
	nMin = FALSE
	nMax = FALSE
	nPage = FALSE
	nPos = FALSE
	nTrackPos = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="cbsize" type="property" display="cbSize"/>' + ;
		'<memberdata name="fmask" type="property" display="fMask"/>' + ;
		'<memberdata name="nmin" type="property" display="nMin"/>' + ;
		'<memberdata name="nmax" type="property" display="nMax"/>' + ;
		'<memberdata name="npage" type="property" display="nPage"/>' + ;
		'<memberdata name="npos" type="property" display="nPos"/>' + ;
		'<memberdata name="ntrackpos" type="property" display="nTrackPos"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		*!* Important! init cbSize to size of structure
		This.cbSize = This.SizeOf
	Endproc

	Procedure cbSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure cbSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure fMask_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure fMask_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure nMin_Access()
		Return ReadInt(This.Address + 8)
	Endproc

	Procedure nMin_Assign(pnNewVal)
		WriteInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure nMax_Access()
		Return ReadInt(This.Address + 12)
	Endproc

	Procedure nMax_Assign(pnNewVal)
		WriteInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure nPage_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Procedure nPage_Assign(pnNewVal)
		WriteUInt(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure nPos_Access()
		Return ReadInt(This.Address + 20)
	Endproc

	Procedure nPos_Assign(pnNewVal)
		WriteInt(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure nTrackPos_Access()
		Return ReadInt(This.Address + 24)
	Endproc

	Procedure nTrackPos_Assign(pnNewVal)
		WriteInt(This.Address + 24, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagNMHDR {
*!*	  HWND hwndFrom;
*!*	  UINT_PTR idFrom;
*!*	  UINT code;
*!*	} NMHDR;
********************************************************************************
Define Class _NMHDR As _STRUCTBASE

	SizeOf = 12
	Name = "NMHDR"
	&& structure fields
	hwndFrom = FALSE
	idFrom = FALSE
	Code = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="hwndfrom" type="property" display="hwndFrom"/>' + ;
		'<memberdata name="idfrom" type="property" display="idFrom"/>' + ;
		'<memberdata name="code" type="property" display="Code"/>' + ;
		'</VFPData>'

	Procedure hwndFrom_Access()
		Return ReadInt(This.Address)
	Endproc

	Procedure hwndFrom_Assign(pnNewVal)
		WriteInt(This.Address, m.pnNewVal)
	Endproc

	Procedure idFrom_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure idFrom_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure Code_Access()
		*!* Code is a UINT but it should be an INT
		Return ReadInt(This.Address + 8)
	Endproc

	Procedure Code_Assign(pnNewVal)
		WriteInt(This.Address + 8, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagNMMOUSE {
*!*	    NMHDR hdr;
*!*	    DWORD_PTR dwItemSpec;
*!*	    DWORD_PTR dwItemData;
*!*	    POINT pt;
*!*	    LPARAM dwHitInfo;
*!*	} NMMOUSE, *LPNMMOUSE;
********************************************************************************
Define Class _NMMOUSE As _STRUCTBASE

	SizeOf = 32
	Name = "NMMOUSE"
	&& structure fields
	hdr = .Null.
	dwItemSpec = FALSE
	dwItemData = FALSE
	pt = .Null.
	dwHitInfo = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="hdr" type="property" display="hdr"/>' + ;
		'<memberdata name="dwitemspec" type="property" display="dwItemSpec"/>' + ;
		'<memberdata name="dwitemdata" type="property" display="dwItemData"/>' + ;
		'<memberdata name="pt" type="property" display="pt"/>' + ;
		'<memberdata name="dwhitinfo" type="property" display="dwHitInfo"/>' + ;
		'</VFPData>'

	Procedure InitMembers
		This.hdr = Createobject("_NMHDR",This.Address + 0)
		This.pt = Createobject("_POINT",This.Address + 20)
	Endproc

	Procedure FreeMembers()
		This.hdr = .Null.
		This.pt = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.hdr.Address = m.lnAddress + 0
			This.pt.Address = m.lnAddress + 20
		Endif
	Endproc

	Procedure dwItemSpec_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure dwItemSpec_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure dwItemData_Access()
		Return ReadUInt(This.Address + 16)
	Endproc

	Procedure dwItemData_Assign(pnNewVal)
		WriteUInt(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure dwHitInfo_Access()
		Return ReadInt(This.Address + 28)
	Endproc

	Procedure dwHitInfo_Assign(pnNewVal)
		WriteInt(This.Address + 28, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct {
*!*	  DWORD dwStructSize;
*!*	  LPTSTR lpszScheme;
*!*	  DWORD dwSchemeLength;
*!*	  INTERNET_SCHEME nScheme;
*!*	  LPTSTR lpszHostName;
*!*	  DWORD dwHostNameLength;
*!*	  INTERNET_PORT nPort;
*!*	  LPTSTR lpszUserName;
*!*	  DWORD dwUserNameLength;
*!*	  LPTSTR lpszPassword;
*!*	  DWORD dwPasswordLength;
*!*	  LPTSTR lpszUrlPath;
*!*	  DWORD dwUrlPathLength;
*!*	  LPTSTR lpszExtraInfo;
*!*	  DWORD dwExtraInfoLength;
*!*	} URL_COMPONENTS,
*!*	*LPURL_COMPONENTS;
********************************************************************************
Define Class _URL_COMPONENTS As _STRUCTBASE

	SizeOf = 60
	Name = "URL_COMPONENTS"
	&& structure fields
	dwStructSize = FALSE
	lpszScheme = FALSE
	dwSchemeLength = FALSE
	nScheme = FALSE
	lpszHostName = FALSE
	dwHostNameLength = FALSE
	nPort = FALSE
	lpszUserName = FALSE
	dwUserNameLength = FALSE
	lpszPassword = FALSE
	dwPasswordLength = FALSE
	lpszUrlPath = FALSE
	dwUrlPathLength = FALSE
	lpszExtraInfo = FALSE
	dwExtraInfoLength = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="dwstructsize" type="property" display="dwStructSize"/>' + ;
		'<memberdata name="lpszscheme" type="property" display="lpszScheme"/>' + ;
		'<memberdata name="dwschemelength" type="property" display="dwSchemeLength"/>' + ;
		'<memberdata name="nscheme" type="property" display="nScheme"/>' + ;
		'<memberdata name="lpszhostname" type="property" display="lpszHostName"/>' + ;
		'<memberdata name="dwhostnamelength" type="property" display="dwHostNameLength"/>' + ;
		'<memberdata name="nport" type="property" display="nPort"/>' + ;
		'<memberdata name="lpszusername" type="property" display="lpszUserName"/>' + ;
		'<memberdata name="dwusernamelength" type="property" display="dwUserNameLength"/>' + ;
		'<memberdata name="lpszpassword" type="property" display="lpszPassword"/>' + ;
		'<memberdata name="dwpasswordlength" type="property" display="dwPasswordLength"/>' + ;
		'<memberdata name="lpszurlpath" type="property" display="lpszUrlPath"/>' + ;
		'<memberdata name="dwurlpathlength" type="property" display="dwUrlPathLength"/>' + ;
		'<memberdata name="lpszextrainfo" type="property" display="lpszExtraInfo"/>' + ;
		'<memberdata name="dwextrainfolength" type="property" display="dwExtraInfoLength"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.dwStructSize = 60
	Endproc

	Procedure FreeMembers()
		FreePMem(This.Address + 4)
		FreePMem(This.Address + 16)
		FreePMem(This.Address + 28)
		FreePMem(This.Address + 36)
		FreePMem(This.Address + 44)
		FreePMem(This.Address + 52)
	Endproc

	Procedure dwStructSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure dwStructSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure lpszScheme_Access()
		Return ReadPCString(This.Address + 4)
	Endproc

	Procedure lpszScheme_Assign(pnNewVal)
		WritePCString(This.Address + 4, m.pnNewVal)
		This.dwSchemeLength = Len(pnNewVal)
	Endproc

	Procedure dwSchemeLength_Access()
		Return ReadUInt(This.Address + 8)
	Endproc

	Procedure dwSchemeLength_Assign(pnNewVal)
		WriteUInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure nScheme_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure nScheme_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure lpszHostName_Access()
		Return ReadPCString(This.Address + 16)
	Endproc

	Procedure lpszHostName_Assign(pnNewVal)
		WritePCString(This.Address + 16, m.pnNewVal)
		This.dwHostNameLength = Len(pnNewVal)
	Endproc

	Procedure dwHostNameLength_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure dwHostNameLength_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure nPort_Access()
		Return ReadUInt(This.Address + 24)
	Endproc

	Procedure nPort_Assign(pnNewVal)
		WriteUInt(This.Address + 24, m.pnNewVal)
	Endproc

	Procedure lpszUserName_Access()
		Return ReadPCString(This.Address + 28)
	Endproc

	Procedure lpszUserName_Assign(pnNewVal)
		WritePCString(This.Address + 28, m.pnNewVal)
		This.dwUserNameLength = Len(pnNewVal)
	Endproc

	Procedure dwUserNameLength_Access()
		Return ReadUInt(This.Address + 32)
	Endproc

	Procedure dwUserNameLength_Assign(pnNewVal)
		WriteUInt(This.Address + 32, m.pnNewVal)
	Endproc

	Procedure lpszPassword_Access()
		Return ReadPCString(This.Address + 36)
	Endproc

	Procedure lpszPassword_Assign(pnNewVal)
		WritePCString(This.Address + 36, m.pnNewVal)
		This.dwPasswordLength = Len(pnNewVal)
	Endproc

	Procedure dwPasswordLength_Access()
		Return ReadUInt(This.Address + 40)
	Endproc

	Procedure dwPasswordLength_Assign(pnNewVal)
		WriteUInt(This.Address + 40, m.pnNewVal)
	Endproc

	Procedure lpszUrlPath_Access()
		Return ReadPCString(This.Address + 44)
	Endproc

	Procedure lpszUrlPath_Assign(pnNewVal)
		WritePCString(This.Address + 44, m.pnNewVal)
		This.dwUrlPathLength = Len(pnNewVal)
	Endproc

	Procedure dwUrlPathLength_Access()
		Return ReadUInt(This.Address + 48)
	Endproc

	Procedure dwUrlPathLength_Assign(pnNewVal)
		WriteUInt(This.Address + 48, m.pnNewVal)
	Endproc

	Procedure lpszExtraInfo_Access()
		Return ReadPCString(This.Address + 52)
	Endproc

	Procedure lpszExtraInfo_Assign(pnNewVal)
		WritePCString(This.Address + 52, m.pnNewVal)
		This.dwExtraInfoLength = Len(pnNewVal)
	Endproc

	Procedure dwExtraInfoLength_Access()
		Return ReadUInt(This.Address + 56)
	Endproc

	Procedure dwExtraInfoLength_Assign(pnNewVal)
		WriteUInt(This.Address + 56, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _WIN32_FIND_DATA {
*!*	  DWORD dwFileAttributes;
*!*	  FILETIME ftCreationTime;
*!*	  FILETIME ftLastAccessTime;
*!*	  FILETIME ftLastWriteTime;
*!*	  DWORD nFileSizeHigh;
*!*	  DWORD nFileSizeLow;
*!*	  DWORD dwReserved0;
*!*	  DWORD dwReserved1;
*!*	  TCHAR cFileName[MAX_PATH];
*!*	  TCHAR cAlternateFileName[14];
*!*	} WIN32_FIND_DATA,
*!*	  *PWIN32_FIND_DATA,
*!*	  *LPWIN32_FIND_DATA;
********************************************************************************
Define Class _WIN32_FIND_DATA As _STRUCTBASE

	SizeOf = 320
	Name = "WIN32_FIND_DATA"
	&& structure fields
	dwFileAttributes = FALSE
	ftCreationTime = .Null.
	ftLastAccessTime = .Null.
	ftLastWriteTime = .Null.
	nFileSizeHigh = FALSE
	nFileSizeLow = FALSE
	dwReserved0 = FALSE
	dwReserved1 = FALSE
	cFileName = FALSE
	cAlternateFileName = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="dwfileattributes" type="property" display="dwFileAttributes"/>' + ;
		'<memberdata name="ftcreationtime" type="property" display="ftCreationTime"/>' + ;
		'<memberdata name="ftlastaccesstime" type="property" display="ftLastAccessTime"/>' + ;
		'<memberdata name="ftlastwritetime" type="property" display="ftLastWriteTime"/>' + ;
		'<memberdata name="nfilesizehigh" type="property" display="nFileSizeHigh"/>' + ;
		'<memberdata name="nfilesizelow" type="property" display="nFileSizeLow"/>' + ;
		'<memberdata name="dwreserved0" type="property" display="dwReserved0"/>' + ;
		'<memberdata name="dwreserved1" type="property" display="dwReserved1"/>' + ;
		'<memberdata name="cfilename" type="property" display="cFileName"/>' + ;
		'<memberdata name="calternatefilename" type="property" display="cAlternateFileName"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.ftCreationTime   = Createobject("_FILETIME", This.Address +  4)
		This.ftLastAccessTime = Createobject("_FILETIME", This.Address + 12)
		This.ftLastWriteTime  = Createobject("_FILETIME", This.Address + 20)
	Endproc

	Procedure FreeMembers()
		This.ftCreationTime   = .Null.
		This.ftLastAccessTime = .Null.
		This.ftLastWriteTime  = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.ftCreationTime.Address   = m.lnAddress + 4
			This.ftLastAccessTime.Address = m.lnAddress + 12
			This.ftLastWriteTime.Address  = m.lnAddress + 20
		Endif
	Endproc

	Procedure dwFileAttributes_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure dwFileAttributes_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure nFileSizeHigh_Access()
		Return ReadUInt(This.Address + 28)
	Endproc

	Procedure nFileSizeHigh_Assign(pnNewVal)
		WriteUInt(This.Address + 28, m.pnNewVal)
	Endproc

	Procedure nFileSizeLow_Access()
		Return ReadUInt(This.Address + 32)
	Endproc

	Procedure nFileSizeLow_Assign(pnNewVal)
		WriteUInt(This.Address + 32, m.pnNewVal)
	Endproc

	Procedure dwReserved0_Access()
		Return ReadUInt(This.Address + 36)
	Endproc

	Procedure dwReserved0_Assign(pnNewVal)
		WriteUInt(This.Address + 36, m.pnNewVal)
	Endproc

	Procedure dwReserved1_Access()
		Return ReadUInt(This.Address + 40)
	Endproc

	Procedure dwReserved1_Assign(pnNewVal)
		WriteUInt(This.Address + 40, m.pnNewVal)
	Endproc

	Procedure cFileName_Access()
		Return ReadCharArray(This.Address + 44, MAX_PATH)
	Endproc

	Procedure cFileName_Assign(pnNewVal)
		WriteCharArray(This.Address + 44, Padr(m.pnNewVal, MAX_PATH, NULCHAR), MAX_PATH)
	Endproc

	Procedure cAlternateFileName_Access()
		Return ReadCharArray(This.Address + 44 + MAX_PATH, 14)
	Endproc

	Procedure cAlternateFileName_Assign(pnNewVal)
		WriteCharArray(This.Address + 44 + MAX_PATH, Padr(m.pnNewVal, 14, NULCHAR), 14)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct _SYSTEMTIME {
*!*	  WORD wYear;
*!*	  WORD wMonth;
*!*	  WORD wDayOfWeek;
*!*	  WORD wDay;
*!*	  WORD wHour;
*!*	  WORD wMinute;
*!*	  WORD wSecond;
*!*	  WORD wMilliseconds;
*!*	} SYSTEMTIME,  *PSYSTEMTIME;
********************************************************************************
Define Class _SYSTEMTIME As _STRUCTBASE

	SizeOf = 16
	Name = "SYSTEMTIME"
	&& structure fields
	wYear = FALSE
	wMonth = FALSE
	wDayOfWeek = FALSE
	wDay = FALSE
	wHour = FALSE
	wMinute = FALSE
	wSecond = FALSE
	wMilliseconds = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="wyear" type="property" display="wYear"/>' + ;
		'<memberdata name="wmonth" type="property" display="wMonth"/>' + ;
		'<memberdata name="wdayofweek" type="property" display="wDayOfWeek"/>' + ;
		'<memberdata name="wday" type="property" display="wDay"/>' + ;
		'<memberdata name="whour" type="property" display="wHour"/>' + ;
		'<memberdata name="wminute" type="property" display="wMinute"/>' + ;
		'<memberdata name="wsecond" type="property" display="wSecond"/>' + ;
		'<memberdata name="wmilliseconds" type="property" display="wMilliseconds"/>' + ;
		'</VFPData>'

	Procedure wYear_Access()
		Return ReadUShort(This.Address)
	Endproc

	Procedure wYear_Assign(pnNewVal)
		WriteUShort(This.Address, m.pnNewVal)
	Endproc

	Procedure wMonth_Access()
		Return ReadUShort(This.Address + 2)
	Endproc

	Procedure wMonth_Assign(pnNewVal)
		WriteUShort(This.Address + 2, m.pnNewVal)
	Endproc

	Procedure wDayOfWeek_Access()
		Return ReadUShort(This.Address + 4)
	Endproc

	Procedure wDayOfWeek_Assign(pnNewVal)
		WriteUShort(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure wDay_Access()
		Return ReadUShort(This.Address + 6)
	Endproc

	Procedure wDay_Assign(pnNewVal)
		WriteUShort(This.Address + 6, m.pnNewVal)
	Endproc

	Procedure wHour_Access()
		Return ReadUShort(This.Address + 8)
	Endproc

	Procedure wHour_Assign(pnNewVal)
		WriteUShort(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure wMinute_Access()
		Return ReadUShort(This.Address + 10)
	Endproc

	Procedure wMinute_Assign(pnNewVal)
		WriteUShort(This.Address + 10, m.pnNewVal)
	Endproc

	Procedure wSecond_Access()
		Return ReadUShort(This.Address + 12)
	Endproc

	Procedure wSecond_Assign(pnNewVal)
		WriteUShort(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure wMilliseconds_Access()
		Return ReadUShort(This.Address + 14)
	Endproc

	Procedure wMilliseconds_Assign(pnNewVal)
		WriteUShort(This.Address + 14, m.pnNewVal)
	Endproc

Enddefine


********************************************************************************
Define Class _SYSTEMTIMEARRAY As _STRUCTBASE

	SizeOf = 32
	Name = "SYSTEMTIMEARRAY"
	&& structure fields
	Min = .Null.
	Max = .Null.

	_MemberData = '<VFPData>' + ;
		'<memberdata name="min" type="property" display="Min"/>' + ;
		'<memberdata name="max" type="property" display="Max"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.Min = Createobject('_SYSTEMTIME',This.Address)
		This.Max = Createobject('_SYSTEMTIME',This.Address + 16)
	Endproc

	Procedure FreeMembers()
		This.Min = .Null.
		This.Max = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.Min.Address = m.lnAddress
			This.Max.Address = m.lnAddress + 16
		Endif
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagSIZE {
*!*	  LONG cx;
*!*	  LONG cy;
*!*	} SIZE, *PSIZE;
********************************************************************************
Define Class _SIZE As _STRUCTBASE
	SizeOf = 8
	Name = "SIZE"
	&& structure fields
	cx = FALSE
	cy = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="cx" type="property" display="cx"/>' + ;
		'<memberdata name="cy" type="property" display="cy"/>' + ;
		'</VFPData>'

	Procedure cx_Access()
		Return ReadInt(This.Address)
	Endproc

	Procedure cx_Assign(pnNewVal)
		WriteInt(This.Address, m.pnNewVal)
	Endproc

	Procedure cy_Access()
		Return ReadInt(This.Address + 4)
	Endproc

	Procedure cy_Assign(pnNewVal)
		WriteInt(This.Address + 4, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagTOOLINFO{
*!*	    UINT      cbSize;
*!*	    UINT      uFlags;
*!*	    HWND      hwnd;
*!*	    UINT_PTR  uId;
*!*	    RECT      rect;
*!*	    HINSTANCE hinst;
*!*	    LPTSTR    lpszText;
*!*	#if (_WIN32_IE >= 0x0300)
*!*	    LPARAM lParam;
*!*	#endif
*!*	#if (_WIN32_WINNT >= 0x0501)
*!*	    void *lpReserved;
*!*	#endif
*!*	} TOOLINFO, NEAR *PTOOLINFO, *LPTOOLINFO;
********************************************************************************
Define Class _TOOLINFO As _STRUCTBASE
	SizeOf = 48
	Name = "TOOLINFO"
	&& structure fields
	cbSize = FALSE
	uFlags = FALSE
	HWnd = FALSE
	uId = FALSE
	Rect = .Null.
	hinst = FALSE
	lpszText = FALSE
	Lparam = FALSE
	*!* if ctlGetOsVersion >= 5010000
	lpReserved = FALSE
	*!* Endif

	_MemberData = '<VFPData>' + ;
		'<memberdata name="cbsize" type="property" display="cbSize"/>' + ;
		'<memberdata name="uflags" type="property" display="uFlags"/>' + ;
		'<memberdata name="hwnd" type="property" display="hwnd"/>' + ;
		'<memberdata name="uid" type="property" display="uId"/>' + ;
		'<memberdata name="rect" type="property" display="rect"/>' + ;
		'<memberdata name="hinst" type="property" display="hinst"/>' + ;
		'<memberdata name="lpsztext" type="property" display="lpszText"/>' + ;
		'<memberdata name="lparam" type="property" display="lParam"/>' + ;
		'<memberdata name="*lpreserved" type="property" display="*lpReserved"/>' + ;
		'</VFPData>'

	Procedure InitMembers()

		*!* 20080818
		*!*			If ctlGetOsVersion() < NTDDI_WINXP Then
		*!*				This.SizeOf = 44
		*!*			Else
		*!*				This.SizeOf = 48
		*!*			Endif
		*!*			This.cbSize = This.SizeOf

		If ctlGetOsVersion() < NTDDI_WINXP Then
			This.cbSize = 44
		Else
			This.cbSize = 48
		Endif

		This.Rect = Createobject("_RECT", This.Address + 16)
	Endproc

	Procedure FreeMembers()
		This.Rect = .Null.
		FreePMem(This.Address + 36)
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.Rect.Address = m.lnAddress + 16
		Endif
	Endproc

	Procedure cbSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure cbSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure uFlags_Access()
		Return ReadUInt(This.Address + 4)
	Endproc

	Procedure uFlags_Assign(pnNewVal)
		WriteUInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure hwnd_Access()
		Return ReadInt(This.Address + 8)
	Endproc

	Procedure hwnd_Assign(pnNewVal)
		WriteInt(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure uId_Access()
		Return ReadUInt(This.Address + 12)
	Endproc

	Procedure uId_Assign(pnNewVal)
		WriteUInt(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure hinst_Access()
		Return ReadPointer(This.Address + 32)
	Endproc

	Procedure hinst_Assign(pnNewVal)
		WritePointer(This.Address + 32, m.pnNewVal)
	Endproc

	Procedure lpszText_Access()
		Return ReadPCString(This.Address + 36)
	Endproc

	Procedure lpszText_Assign(pnNewVal)
		WritePCString(This.Address + 36, m.pnNewVal)
	Endproc

	Procedure lParam_Access()
		Return ReadInt(This.Address + 40)
	Endproc

	Procedure lParam_Assign(pnNewVal)
		WriteInt(This.Address + 40, m.pnNewVal)
	Endproc

	Procedure lpReserved_Access()
		Return ReadPointer(This.Address  +  44)
	Endproc

	Procedure lpReserved_Assign(pnNewVal)
		WritePointer(This.Address + 44, m.pnNewVal)
Enddefine


********************************************************************************
*!*	typedef struct tagNMSELCHANGE {
*!*	    NMHDR nmhdr;
*!*	    SYSTEMTIME stSelStart;
*!*	    SYSTEMTIME stSelEnd;
*!*	} NMSELCHANGE, *LPNMSELCHANGE;
********************************************************************************
Define Class _NMSELCHANGE As _STRUCTBASE

	SizeOf = 44
	Name = "NMSELCHANGE"
	&& structure fields
	nmhdr = .Null.
	stSelStart = .Null.
	stSelEnd = .Null.

	_MemberData = '<VFPData>' + ;
		'<memberdata name="nmhdr" type="property" display="nmhdr"/>' + ;
		'<memberdata name="stselstart" type="property" display="stSelStart"/>' + ;
		'<memberdata name="stselend" type="property" display="stSelEnd"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.nmhdr = Createobject("_NMHDR", This.Address)
		This.stSelStart = Createobject("_SYSTEMTIME", This.Address + 12)
		This.stSelEnd = Createobject("_SYSTEMTIME", This.Address + 28)
	Endproc

	Procedure FreeMembers()
		This.nmhdr = .Null.
		This.stSelStart = .Null.
		This.stSelEnd = .Null.
	Endproc

	Procedure Address_Assign(lnAddress)
		This.Address = m.lnAddress
		If This.InitMembersDone = TRUE Then
			This.Address = m.lnAddress
			This.nmhdr.Address = m.lnAddress
			This.stSelStart.Address = m.lnAddress + 12
			This.stSelEnd.Address = m.lnAddress + 28
		Endif
	Endproc

Enddefine


********************************************************************************
*!*	typedef struct tagNMTTDISPINFO {
*!*	    NMHDR      hdr;
*!*	    LPTSTR     lpszText;
*!*	    TCHAR       szText[80];
*!*	    HINSTANCE  hinst;
*!*	    UINT       uFlags;
*!*	#if (_WIN32_IE >= 0x0300)
*!*	    LPARAM     lParam;
*!*	#endif
*!*	#if (_WIN32_WINNT >= 0x0600)
*!*	    HBITMAP hbmp;
*!*	#endif
*!*	} NMTTDISPINFO, *LPNMTTDISPINFO;
********************************************************************************

Define Class _NMTTDISPINFO As _STRUCTBASE

	SizeOf = 108
	Name = "NMTTDISPINFO"
	&& structure fields
	hdr = .Null.
	lpszText = .F.
	szText = .F.
	hinst = .F.
	uFlags = .F.
	Lparam = .F.

	Procedure InitMembers(lnAddress)
		This.hdr = Createobject('_NMHDR', This.Address)
	Endproc

	Procedure FreeMembers()
		This.hdr = .Null.
	Endproc

	Procedure lpszText_Access()
		Return ReadPCString(This.Address + 12)
	Endproc

	Procedure lpszText_Assign(lnNewVal)
		WritePCString(This.Address + 12, m.lnNewVal)
	Endproc

	Procedure szText_Access()
		Return ReadCharArray(This.Address + 16,80)
	Endproc

	Procedure szText_Assign(lnNewVal)
		WriteCharArray(This.Address + 16, m.lnNewVal,80)
	Endproc

	Procedure hinst_Access()
		Return ReadPointer(This.Address + 96)
	Endproc

	Procedure hinst_Assign(lnNewVal)
		WritePointer(This.Address + 96, m.lnNewVal)
	Endproc

	Procedure uFlags_Access()
		Return ReadUInt(This.Address + 100)
	Endproc

	Procedure uFlags_Assign(lnNewVal)
		WriteUInt(This.Address + 100, m.lnNewVal)
	Endproc

	Procedure lParam_Access()
		Return ReadInt(This.Address + 104)
	Endproc

	Procedure lParam_Assign(lnNewVal)
		WriteInt(This.Address + 104, m.lnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagNMDAYSTATE {
*!*	    NMHDR nmhdr;
*!*	    SYSTEMTIME stStart;
*!*	    int cDayState;
*!*	    LPMONTHDAYSTATE prgDayState;
*!*	} NMDAYSTATE, *LPNMDAYSTATE;
********************************************************************************
Define Class _NMDAYSTATE As _STRUCTBASE

	SizeOf = 36
	Name = "NMDAYSTATE"
	&& structure fields
	nmhdr = .Null.
	stStart = .Null.
	cDayState = FALSE
	prgDayState = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="nmhdr" type="property" display="nmhdr"/>' + ;
		'<memberdata name="ststart" type="property" display="stStart"/>' + ;
		'<memberdata name="cdaystate" type="property" display="cDayState"/>' + ;
		'<memberdata name="prgdaystate" type="property" display="prgDayState"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		This.nmhdr = Createobject("_NMHDR", This.Address)
		This.stStart = Createobject("_SYSTEMTIME", This.Address + 12)
	Endproc

	Procedure FreeMembers()
		This.nmhdr = .Null.
		This.stStart = .Null.
	Endproc

	Procedure cDayState_Access()
		Return ReadInt(This.Address + 28)
	Endproc

	Procedure cDayState_Assign(pnNewVal)
		WriteInt(This.Address + 28, m.pnNewVal)
	Endproc

	Procedure prgDayState_Access()
		Return ReadInt(This.Address + 32)
	Endproc

	Procedure prgDayState_Assign(pnNewVal)
		WriteInt(This.Address + 32, m.pnNewVal)
	Endproc

Enddefine

********************************************************************************
*!*	typedef struct tagOFN {
*!*	  DWORD         lStructSize;
*!*	  HWND          hwndOwner;
*!*	  HINSTANCE     hInstance;
*!*	  LPCTSTR       lpstrFilter;
*!*	  LPTSTR        lpstrCustomFilter;
*!*	  DWORD         nMaxCustFilter;
*!*	  DWORD         nFilterIndex;
*!*	  LPTSTR        lpstrFile;
*!*	  DWORD         nMaxFile;
*!*	  LPTSTR        lpstrFileTitle;
*!*	  DWORD         nMaxFileTitle;
*!*	  LPCTSTR       lpstrInitialDir;
*!*	  LPCTSTR       lpstrTitle;
*!*	  DWORD         Flags;
*!*	  WORD          nFileOffset;
*!*	  WORD          nFileExtension;
*!*	  LPCTSTR       lpstrDefExt;
*!*	  LPARAM        lCustData;
*!*	  LPOFNHOOKPROC lpfnHook;
*!*	  LPCTSTR       lpTemplateName;
*!*	#if (_WIN32_WINNT >= 0x0500)
*!*	  void *        pvReserved;
*!*	  DWORD         dwReserved;
*!*	  DWORD         FlagsEx;
*!*	#endif // (_WIN32_WINNT >= 0x0500)
*!*	} OPENFILENAME, *LPOPENFILENAME;
********************************************************************************
Define Class _OPENFILENAME As  _STRUCTBASE

	SizeOf = 88
	Name = "OPENFILENAME"
	&& structure fields
	lStructSize = FALSE
	hwndOwner = FALSE
	hInstance = FALSE
	lpstrFilter = FALSE
	lpstrCustomFilter = FALSE
	nMaxCustFilter = FALSE
	nFilterIndex = FALSE
	lpstrFile = FALSE
	nMaxFile = FALSE
	lpstrFileTitle = FALSE
	nMaxFileTitle = FALSE
	lpstrInitialDir = FALSE
	lpstrTitle = FALSE
	Flags = FALSE
	nFileOffset = FALSE
	nFileExtension = FALSE
	lpstrDefExt = FALSE
	lCustData = FALSE
	lpfnHook = FALSE
	lpTemplateName = FALSE
	pvReserved = FALSE
	dwReserved = FALSE
	FlagsEx = FALSE

	_MemberData = '<VFPData>' + ;
		'<memberdata name="lstructsize" type="property" display="lStructSize"/>' + ;
		'<memberdata name="hwndowner" type="property" display="hwndOwner"/>' + ;
		'<memberdata name="hinstance" type="property" display="hInstance"/>' + ;
		'<memberdata name="lpstrfilter" type="property" display="lpstrFilter"/>' + ;
		'<memberdata name="lpstrcustomfilter" type="property" display="lpstrCustomFilter"/>' + ;
		'<memberdata name="nmaxcustfilter" type="property" display="nMaxCustFilter"/>' + ;
		'<memberdata name="nfilterindex" type="property" display="nFilterIndex"/>' + ;
		'<memberdata name="lpstrfile" type="property" display="lpstrFile"/>' + ;
		'<memberdata name="nmaxfile" type="property" display="nMaxFile"/>' + ;
		'<memberdata name="lpstrfiletitle" type="property" display="lpstrFileTitle"/>' + ;
		'<memberdata name="nmaxfiletitle" type="property" display="nMaxFileTitle"/>' + ;
		'<memberdata name="lpstrinitialdir" type="property" display="lpstrInitialDir"/>' + ;
		'<memberdata name="lpstrtitle" type="property" display="lpstrTitle"/>' + ;
		'<memberdata name="flags" type="property" display="Flags"/>' + ;
		'<memberdata name="nfileoffset" type="property" display="nFileOffset"/>' + ;
		'<memberdata name="nfileextension" type="property" display="nFileExtension"/>' + ;
		'<memberdata name="lpstrdefext" type="property" display="lpstrDefExt"/>' + ;
		'<memberdata name="lcustdata" type="property" display="lCustData"/>' + ;
		'<memberdata name="lpfnhook" type="property" display="lpfnHook"/>' + ;
		'<memberdata name="lptemplatename" type="property" display="lpTemplateName"/>' + ;
		'<memberdata name="pvreserved" type="property" display="pvReserved"/>' + ;
		'<memberdata name="dwreserved" type="property" display="dwReserved"/>' + ;
		'<memberdata name="flagsex" type="property" display="FlagsEx"/>' + ;
		'</VFPData>'

	Procedure InitMembers()
		If ctlGetOsVersion() < NTDDI_WIN2K Then
			This.lStructSize = 76
		Else
			This.lStructSize = 88
		Endif

	Endproc

	Procedure FreeMembers()
		FreePMem(This.Address + 12)
		FreePMem(This.Address + 16)
		FreePMem(This.Address + 28)
		FreePMem(This.Address + 36)
		FreePMem(This.Address + 44)
		FreePMem(This.Address + 48)
		FreePMem(This.Address + 60)
		FreePMem(This.Address + 72)
	Endproc

	Procedure lStructSize_Access()
		Return ReadUInt(This.Address)
	Endproc

	Procedure lStructSize_Assign(pnNewVal)
		WriteUInt(This.Address, m.pnNewVal)
	Endproc

	Procedure hwndOwner_Access()
		Return ReadInt(This.Address + 4)
	Endproc

	Procedure hwndOwner_Assign(pnNewVal)
		WriteInt(This.Address + 4, m.pnNewVal)
	Endproc

	Procedure hInstance_Access()
		Return ReadPointer(This.Address + 8)
	Endproc

	Procedure hInstance_Assign(pnNewVal)
		WritePointer(This.Address + 8, m.pnNewVal)
	Endproc

	Procedure lpstrFilter_Access()
		Return ReadPCString(This.Address + 12)
	Endproc

	Procedure lpstrFilter_Assign(pnNewVal)
		WritePCString(This.Address + 12, m.pnNewVal)
	Endproc

	Procedure lpstrCustomFilter_Access()
		Return ReadPCString(This.Address + 16)
	Endproc

	Procedure lpstrCustomFilter_Assign(pnNewVal)
		WritePCString(This.Address + 16, m.pnNewVal)
	Endproc

	Procedure nMaxCustFilter_Access()
		Return ReadUInt(This.Address + 20)
	Endproc

	Procedure nMaxCustFilter_Assign(pnNewVal)
		WriteUInt(This.Address + 20, m.pnNewVal)
	Endproc

	Procedure nFilterIndex_Access()
		Return ReadUInt(This.Address + 24)
	Endproc

	Procedure nFilterIndex_Assign(pnNewVal)
		WriteUInt(This.Address + 24, m.pnNewVal)
	Endproc

	Procedure GetlpstrFile()
		Return This.ReadPCString(This.Address + 28, This.nMaxFile)
	Endproc

	Procedure lpstrFile_Access()
		*!* may have embedded nulls
		Return ReadPCString(This.Address + 28)
	Endproc

	Procedure lpstrFile_Assign(pnNewVal)
		WritePCString(This.Address + 28, m.pnNewVal)
		This.nMaxFile = Len(m.pnNewVal)
	Endproc

	Procedure nMaxFile_Access()
		Return ReadUInt(This.Address + 32)
	Endproc

	Procedure nMaxFile_Assign(pnNewVal)
		WriteUInt(This.Address + 32, m.pnNewVal)
	Endproc

	Procedure lpstrFileTitle_Access()
		Return ReadPCString(This.Address + 36)
	Endproc

	Procedure lpstrFileTitle_Assign(pnNewVal)
		WritePCString(This.Address + 36, m.pnNewVal)
		This.nMaxFileTitle = Len(m.pnNewVal)
	Endproc

	Procedure nMaxFileTitle_Access()
		Return ReadUInt(This.Address + 40)
	Endproc

	Procedure nMaxFileTitle_Assign(pnNewVal)
		WriteUInt(This.Address + 40, m.pnNewVal)
	Endproc

	Procedure lpstrInitialDir_Access()
		Return ReadPCString(This.Address + 44)
	Endproc

	Procedure lpstrInitialDir_Assign(pnNewVal)
		WritePCString(This.Address + 44, m.pnNewVal)
	Endproc

	Procedure lpstrTitle_Access()
		Return ReadPCString(This.Address + 48)
	Endproc

	Procedure lpstrTitle_Assign(pnNewVal)
		WritePCString(This.Address + 48, m.pnNewVal)
	Endproc

	Procedure flags_Access()
		Return ReadUInt(This.Address + 52)
	Endproc

	Procedure flags_Assign(pnNewVal)
		WriteUInt(This.Address + 52, m.pnNewVal)
	Endproc

	Procedure nFileOffset_Access()
		Return ReadUShort(This.Address + 56)
	Endproc

	Procedure nFileOffset_Assign(pnNewVal)
		WriteUShort(This.Address + 56, m.pnNewVal)
	Endproc

	Procedure nFileExtension_Access()
		Return ReadUShort(This.Address + 58)
	Endproc

	Procedure nFileExtension_Assign(pnNewVal)
		WriteUShort(This.Address + 58, m.pnNewVal)
	Endproc

	Procedure lpstrDefExt_Access()
		Return ReadPCString(This.Address + 60)
	Endproc

	Procedure lpstrDefExt_Assign(pnNewVal)
		WritePCString(This.Address + 60, m.pnNewVal)
	Endproc

	Procedure lCustData_Access()
		Return ReadInt(This.Address + 64)
	Endproc

	Procedure lCustData_Assign(pnNewVal)
		WriteInt(This.Address + 64, m.pnNewVal)
	Endproc

	Procedure lpfnHook_Access()
		Return ReadUInt(This.Address + 68)
	Endproc

	Procedure lpfnHook_Assign(pnNewVal)
		WriteUInt(This.Address + 68, m.pnNewVal)
	Endproc

	Procedure lpTemplateName_Access()
		Return ReadPCString(This.Address + 72)
	Endproc

	Procedure lpTemplateName_Assign(pnNewVal)
		WritePCString(This.Address + 72, m.pnNewVal)
	Endproc

	Procedure pvReserved_Access()
		Return ReadPointer(This.Address + 76)
	Endproc

	Procedure pvReserved_Assign(pnNewVal)
		WritePointer(This.Address + 76, m.pnNewVal)
	Endproc

	Procedure dwReserved_Access()
		Return ReadUInt(This.Address + 80)
	Endproc

	Procedure dwReserved_Assign(pnNewVal)
		WriteUInt(This.Address + 80, m.pnNewVal)
	Endproc

	Procedure FlagsEx_Access()
		Return ReadUInt(This.Address + 84)
	Endproc

	Procedure FlagsEx_Assign(pnNewVal)
		WriteUInt(This.Address + 84, m.pnNewVal)
	Endproc

Enddefine

