type
 PString = ^String;
 Uint32 = LongInt;
 int32 = LongInt;
 Uint16 = word;
 UINT8 = byte;

 Int16 = integer;
 Int8  = shortint;

 HWND  = Uint16;

 TWndProc = function (ahWnd:HWND;aMsg,wParam,lParam:UINT32):UInt32;

 PClass = ^TClass;
 TClass = record
   Name    : PString;
   WndProc : TWndProc;
 end;
 
 TClassArray = array [0..100] of TClass;
 PClassArray = ^TClassArray;

 TUint8Array = array [0..100] of Uint8;
 PUint8Array = ^TUint8Array;

 TUint16Array = array [0..100] of Uint16;
 PUint16Array = ^TUint16Array;

 TUint32Array = array [0..100] of Uint32;
 PUint32Array = ^TUint32Array;

 POINT = record
  X,Y : int16;
 end;

 TRPoint = record
  X,Y : real;
 end;

 PRPoint = ^TRPoint;

 LPPOINT = ^POINT;

 RECT = record
  A,B : Point;
 end;

 LPRECT = ^RECT;

 TMessage = record
  Message,wParam,lParam : Uint32;
 end;
 PMessage = ^TMessage;

 PMessageList = ^TMessageList;
 TMessageList = record
  msg : TMessage;
  Next : PMessageList;
 end;

 TFontDef = record
   wFont  : INT16;
   aName  : PString;
 end; 
 TFontDefArray = array [0..100] of TFontDef;
 PFontDefArray = ^TFontDefArray;

 TPalette = record
   MenuSelSize          : INT16;
   MenuSelColor         : INT16;
   MenuSelFont          : INT16;
   MenuSelFontSize      : INT16;
   MenuSelFontColor     : INT16;

   ActBorderSize        : INT16;
   ActBorderColor       : INT16;

   NoActBorderSize      : INT16;
   NoActBorderColor     : INT16;

   ActTitleStyle        : INT16;
   ActTitleSize         : INT16;
   ActTitleColor        : INT16;
   ActTitleFont         : INT16;
   ActTitleFontSize     : INT16;
   ActTitleFontColor    : INT16;

   NoActTitleStyle      : INT16;
   NoActTitleSize       : INT16;
   NoActTitleColor      : INT16;
   NoActTitleFont       : INT16;
   NoActTitleFontSize   : INT16;
   NoActTitleFontColor  : INT16;

   WindowBGColor        : INT16;
   WindowStyle          : INT16;
   WindowFontColor      : INT16;

   ThreeDColor1         : INT16;
   ThreeDColor2         : INT16;
   ThreeDStyle          : INT16;
 end;
 PPalette = ^TPalette;

 HMENU = UINT32;

 PWindow = ^TWindow;
 PMenuItem = ^TMenuItem;
 TMenuItem = record
  Text       : PString;
  ID         : UINT32;
  Parent     : PWindow;
  ifSubMenu  : Boolean;
  ifActive   : Boolean;
  SubMenu    : HMenu;
 end;

 TMenuItemArray = array [0..100] of TMenuItem;
 PMenuItemArray = ^TMenuItemArray;
 
 PMenu = ^TMenu;
 TMenu = record
  ItemCnt : Uint8;
  Items   : PMenuItemArray;
 end; 

 PMenuList = ^TMenuList;
 TMenuList = record
  Mn      : PMenu;
  Handle  : HMenu;
  Next    : PMenuList;
 end;

 TWindow = record
  WClass        : PClass;
  Handle        : HWND;
  Style         : UINT32;
  Parent        : PWindow;
  Title         : PString;
  Menu          : PMenu;
  Palette       : PPalette;
  bActive       : Boolean;
  Pos           : RECT;
  Queue         : PMessageList;

  zOrder        : PWindow;
  Next          : PWindow;
  Brother       : PWindow;
  Child         : PWindow;
 end;

 PWndList = ^TWndList;
 TWndList = record
  wnd : PWindow;
  Next : PWndList;
 end;

 TWindowsArray = array [0..100] of TWindow;
 PWindowsArray = ^TWindowsArray;

 PAINTSTRUCT = record
   gPos    : RECT;
   Font    : INT8;
   FontJus : INT8;
   FontSize: INT8;
   Style   : INT8;
   Color   : INT8;
   BgColor : INT8;
 end;
 LPPAINTSTRUCT = ^PAINTSTRUCT;

 TCursor = record
   HotX,HotY : UINT8;
   AndMask   : array [0..31] of UINT8;
   XorMask   : array [0..31] of UINT8;
 end;
 
 TCursorArr = array [0..100] of TCursor;
 PCursorArr = ^TCursorArr;