home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / spdos2.zip / LIBSRC / PMOBJECT.PAS < prev    next >
Pascal/Delphi Source File  |  1994-06-22  |  55KB  |  1,630 lines

  1. UNIT PMObject;
  2.  
  3. {**************************************************************************
  4. *                                                                         *
  5. *                                                                         *
  6. *                                                                         *
  7. *                Main Object definitions for Object-PM                    *
  8. *                                                                         *
  9. *                                                                         *
  10. *                                                                         *
  11. *                                                                         *
  12. ***************************************************************************}
  13.  
  14.  
  15. INTERFACE
  16.  
  17. CONST {Common command constants}
  18.      CM_TILE       =100;
  19.      CM_CASCADE    =101;
  20.      CM_CLOSE      =102;
  21.      CM_CLOSEALL   =103;
  22.      CM_NEXT       =104;
  23.      CM_OPEN       =105;
  24.      CM_SAVEAS     =106;
  25.      CM_NEW        =107;
  26.      CM_SAVE       =108;
  27.      CM_SAVEALL    =109;
  28.      CM_ABOUT      =110;
  29.  
  30.      CM_HELPONHELP =30000;
  31.      CM_EXTENDEDHELP=30001;
  32.      CM_KEYSHELP   =30002;
  33.      CM_HELPINDEX  =30003;
  34.  
  35. {Self defined messages}
  36.      WM_MOUSEDRAG1              =$1000;
  37.  
  38.  
  39.  
  40. VAR AppWinName:STRING[40];
  41.     AppChildName:STRING[40];
  42.     MainAppVMT:POINTER;
  43.     AppWinFrameHandle:LONGWORD;    {Handle to main Window}
  44.     AppWinHandle:LONGWORD;         {Client Window handle}
  45.  
  46.     TextDrawColor:LONGWORD;     {Current text draw color}
  47.     TextBackColor:LONGWORD;     {Current text back color}
  48.     AppBackColor:LONGWORD;      {ApplicationBackColor}
  49.     ClientBackColor:LONGWORD;   {ClientBackColor}
  50.     MouseButton1Down,Drag_Mode:BOOLEAN;
  51.     DragWindow:HWND;
  52.     LastDragPos:POINTER;
  53.  
  54.     HelpFileName:String;
  55.     HelpTitle:STRING;
  56.  
  57. TYPE
  58.     TApplication=OBJECT
  59.                       MainID:LONGWORD;
  60.                       MenuResource:BOOLEAN;       {TRUE for Menu resource}
  61.                       IconResource:BOOLEAN;       {TRUE for Iconi resource}
  62.                       AccelResource:BOOLEAN;      {TRUE for Accel resource}
  63.                       HelpResource:BOOLEAN;       {TRUE for online help}
  64.                       HelpWindow:HWND;
  65.                       WinX,WinY,WinCX,WinCY:LONGWORD; {Win location}
  66.                       {MDI variables}
  67.                       ChildCount:LONGWORD;
  68.                       MinimizedCount:LONGWORD;
  69.                       ActiveChild:HWND;           {Current child active}
  70.                       {*****************************************************}
  71.                       {Do not change this location because its hard coded}
  72.                       FUNCTION AppHandleEvent(Win:HWND;Msg:LONGWORD;
  73.                                               para1,para2:POINTER;
  74.                                               VAR Handled:BOOLEAN):LONGWORD;
  75.                       {**************************************************}
  76.                       {**************************************************}
  77.                       {Do not change this location because its hard coded}
  78.                       FUNCTION MDIHandleEvent(Win:HWND;Msg:LONGWORD;
  79.                                               para1,para2:POINTER;
  80.                                               VAR Handled:BOOLEAN;
  81.                                               Extra:POINTER):LONGWORD;
  82.                       {**************************************************}
  83.                       CONSTRUCTOR Init(AppMainID:LONGWORD);
  84.                       DESTRUCTOR Done;
  85.                       PROCEDURE Run(title:String;flags,frame:LONGWORD);
  86.                       PROCEDURE AppCreateNotify(AppWin:HWND);
  87.                       PROCEDURE InsertMenuResource;
  88.                       PROCEDURE InsertAccelResource;
  89.                       PROCEDURE InsertIconResource;
  90.                       PROCEDURE InsertHelp(Filename,WindowTitle:String);
  91.                       PROCEDURE SetWindowLoc(x,y,cx,cy:LONGWORD);
  92.                       PROCEDURE Redraw(Win:HWND;_hps:HPS);
  93.                       {Window Sizing and positioning}
  94.                       PROCEDURE PrintString(_hps:HPS;x,y:LONGWORD;s:string);
  95.                       PROCEDURE CascadeWindows(Win:HWND);
  96.                       PROCEDURE TileWindows(Win:HWND);
  97.                       PROCEDURE CloseAllWindows(Win:HWND);
  98.                       PROCEDURE NextWindow;
  99.                       PROCEDURE GetMaxWindow(VAR _swp:SWP);
  100.                       PROCEDURE MDIRedraw(Win:HWND;_hps:HPS;Extra:POINTER);
  101.                       PROCEDURE MDIPaintNotify(Win:HWND;_hps:HPS;Extra:POINTER);
  102.                       PROCEDURE CenterWindow(Win:HWND);
  103.                       PROCEDURE InvalidateWindow(Win:HWND);
  104.                       PROCEDURE HandleCharEvent(Win:HWND;ch:Char);
  105.                       PROCEDURE HandleScanEvent(Win:HWND;scan:Word);
  106.                       PROCEDURE MDIHandleCharEvent(Win:HWND;Extra:POINTER;
  107.                                                    ch:Char);
  108.                       PROCEDURE MDIHandleScanEvent(Win:HWND;Extra:POINTER;
  109.                                                    scan:Word);
  110.                  END;
  111.  
  112.     TMDIApplication=OBJECT(TApplication)
  113.                           CONSTRUCTOR Init(AppMainID:LONGWORD);
  114.                           DESTRUCTOR Done;
  115.                           FUNCTION MDICreateChild(Title:String;
  116.                                                   Extra:POINTER;
  117.                                                   fcfFlags:LONGWORD):HWND;
  118.                           PROCEDURE MDICreateNotify(Win:HWND;Extra:POINTER);
  119.                           FUNCTION MDIGetTopWindow(VAR Extra:POINTER):HWND;
  120.                           FUNCTION MDIGetExtraPointer(Win:HWND):POINTER;
  121.                     END;
  122.  
  123.      POINTS=Record
  124.                    x,y:Integer;
  125.             End;
  126.  
  127. {Common procedures and functions}
  128.  
  129. FUNCTION PointerToWord(p:POINTER):WORD;
  130. FUNCTION PointerFrom2Short(s1,s2:Word):POINTER;
  131. FUNCTION PointerFromShort(s:Word):POINTER;
  132. PROCEDURE MessageBox(msg:String);
  133. PROCEDURE ErrorBox(err:String);
  134. FUNCTION ConfirmBox(msg:String):BOOLEAN;
  135. PROCEDURE MaximizeWindow(Win:HWND);
  136. PROCEDURE MinimizeWindow(Win:HWND);
  137. PROCEDURE HideWindow(Win:HWND);
  138. PROCEDURE ShowWindow(Win:HWND);
  139. PROCEDURE DisableWindow(Win:HWND);
  140. PROCEDURE EnableWindow(Win:HWND);
  141. PROCEDURE RestoreWindow(Win:HWND);
  142. FUNCTION IsWindowMaximized(Win:HWND):BOOLEAN;
  143. FUNCTION IsWindowMinimized(Win:HWND):BOOLEAN;
  144. PROCEDURE DrawStringXY(_hps:HPS;VAR pt:POINTL;VAR s:string;start,Len:LONGWORD;
  145.                        Color,BackColor:LONGWORD);
  146.  
  147.  
  148. CONST {public}
  149.  
  150.      {IPF message base}
  151.      HM_MSG_BASE              =$0220;
  152.      {Messages applications can send to the IPF}
  153.      HM_DISPLAY_HELP          =HM_MSG_BASE+$0002;
  154.      HM_EXT_HELP              =HM_MSG_BASE+$0003;
  155.      HM_GENERAL_HELP          =HM_EXT_HELP;
  156.      HM_SET_HELP_WINDOW_TITLE =HM_MSG_BASE+$0007;
  157.      HM_SET_SHOW_PANEL_ID     =HM_MSG_BASE+$0008;
  158.      HM_REPLACE_HELP_FOR_HELP =HM_MSG_BASE+$0009;
  159.      HM_REPLACE_USING_HELP    =HM_REPLACE_HELP_FOR_HELP;
  160.      HM_HELP_INDEX            =HM_MSG_BASE+$000a;
  161.      HM_HELP_CONTENTS         =HM_MSG_BASE+$000b;
  162.      HM_KEYS_HELP             =HM_MSG_BASE+$000c;
  163.      HM_SET_HELP_LIBRARY_NAME =HM_MSG_BASE+$000d;
  164.      HM_ERROR                 =HM_MSG_BASE+$000e;
  165.      HM_HELPSUBITEM_NOT_FOUND =HM_MSG_BASE+$000f;
  166.      HM_QUERY_KEYS_HELP       =HM_MSG_BASE+$0010;
  167.      HM_TUTORIAL              =HM_MSG_BASE+$0011;
  168.      HM_EXT_HELP_UNDEFINED    =HM_MSG_BASE+$0012;
  169.      HM_GENERAL_HELP_UNDEFINED=HM_EXT_HELP_UNDEFINED;
  170.  
  171.  
  172.      { Frame window styles }
  173.      FCF_TITLEBAR       =$00000001;
  174.      FCF_SYSMENU        =$00000002;
  175.      FCF_MENU           =$00000004;
  176.      FCF_SIZEBORDER     =$00000008;
  177.      FCF_MINBUTTON      =$00000010;
  178.      FCF_MAXBUTTON      =$00000020;
  179.      FCF_MINMAX         =$00000030;
  180.      FCF_VERTSCROLL     =$00000040;
  181.      FCF_HORZSCROLL     =$00000080;
  182.      FCF_DLGBORDER      =$00000100;
  183.      FCF_BORDER         =$00000200;
  184.      FCF_SHELLPOSITION  =$00000400;
  185.      FCF_TASKLIST       =$00000800;
  186.      FCF_NOBYTEALIGN    =$00001000;
  187.      FCF_NOMOVEWITHOWNER=$00002000;
  188.      FCF_ICON           =$00004000;
  189.      FCF_ACCELTABLE     =$00008000;
  190.      FCF_SYSMODAL       =$00010000;
  191.      FCF_SCREENALIGN    =$00020000;
  192.      FCF_MOUSEALIGN     =$00040000;
  193.      FCF_HIDEBUTTON     =$01000000;
  194.      FCF_HIDEMAX        =$01000020;
  195.      FCF_DBE_APPSTAT    =$80000000;
  196.      FCF_AUTOICON       =$40000000;
  197.  
  198.      { FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_SIZEBORDER | FCF_MINMAX |
  199.        FCF_ICON | FCF_ACCELTABLE | FCF_SHELLPOSITION | FCF_TASKLIST }
  200.      FCF_STANDARD       =$0000CC3F;
  201.      {FCF_TITLEBAR | FCF_SYSMENU | FCF_ICON | FCF_SIZEBORDER | FCF_MINMAX
  202.       | FCF_MENU | FCF_SHELLPOSITION | FCF_TASKLIST}
  203.      FCF_SPEED          =$00004C3F;
  204.      {FCF_TITLEBAR | FCF_SYSMENU  | FCF_MINMAX | FCF_SIZEBORDER
  205.       | FCF_TASKLIST | FCF_SHELLPOSITION}
  206.      FCF_SIMPLE         =$00000c3b;
  207.      {FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_SIZEBORDER |
  208.       FCF_NOBYTEALIGN}
  209.      FCF_SPEEDCHILD     =$0000103B;
  210.  
  211.      { WinQueryWindow() codes }
  212.  
  213.       QW_NEXT         =0;
  214.       QW_PREV         =1;
  215.       QW_TOP          =2;
  216.       QW_BOTTOM       =3;
  217.       QW_OWNER        =4;
  218.       QW_PARENT       =5;
  219.       QW_NEXTTOP      =6;
  220.       QW_PREVTOP      =7;
  221.       QW_FRAMEOWNER   =8;
  222.  
  223.       { Frame control IDs    }
  224.  
  225.       FID_SYSMENU                =$8002;
  226.       FID_TITLEBAR               =$8003;
  227.       FID_MINMAX                 =$8004;
  228.       FID_MENU                   =$8005;
  229.       FID_VERTSCROLL             =$8006;
  230.       FID_HORZSCROLL             =$8007;
  231.       FID_CLIENT                 =$8008;
  232.       FID_DBE_APPSTAT            =$8010;
  233.       FID_DBE_KBDSTAT            =$8011;
  234.       FID_DBE_PECIC              =$8012;
  235.       FID_DBE_KKPOPUP            =$8013;
  236.  
  237.       { Scroll Bar Commands }
  238.  
  239.       SB_LINEUP                  =1;
  240.       SB_LINEDOWN                =2;
  241.       SB_LINELEFT                =1;
  242.       SB_LINERIGHT               =2;
  243.       SB_PAGEUP                  =3;
  244.       SB_PAGEDOWN                =4;
  245.       SB_PAGELEFT                =3;
  246.       SB_PAGERIGHT               =4;
  247.       SB_SLIDERTRACK             =5;
  248.       SB_SLIDERPOSITION          =6;
  249.       SB_ENDSCROLL               =7;
  250.  
  251.       { Scroll Bar messages }
  252.  
  253.       SBM_SETSCROLLBAR           =$01a0;
  254.       SBM_SETPOS                 =$01a1;
  255.       SBM_QUERYPOS               =$01a2;
  256.       SBM_QUERYRANGE             =$01a3;
  257.       SBM_SETTHUMBSIZE           =$01a6;
  258.  
  259.  
  260.  
  261.  
  262. IMPLEMENTATION
  263.  
  264. TYPE
  265.     THelpInit=RECORD
  266.                     cb:LONGWORD;
  267.                     ulReturnCode:LONGWORD;
  268.                     pszTutorialName:POINTER;
  269.                     phtHelptable:LONGWORD;
  270.                     hmodHelptableModule:HMODULE;
  271.                     hmodAccelActionBarModule:HMODULE;
  272.                     idAcceltable:LONGWORD;
  273.                     idActionBar:LONGWORD;
  274.                     pszHelpWindowTitle:POINTER;
  275.                     fShowPanelID:LONGWORD;
  276.                     pszHelpLibraryName:POINTER;
  277.              END;
  278.  
  279. IMPORTS {Private} {USE OS/2 API calling convention}
  280.           FUNCTION WinEnableWindow(fEnable:LONGWORD;
  281.                                    _hwnd:HWND):LONGWORD:  PMWIN index 735;
  282.           FUNCTION WinBeginPaint(VAR prclPaint:RECTL;
  283.                                  _hps:HPS;_hwnd:HWND):
  284.                                  LONGWORD:                PMWIN index 703;
  285.           FUNCTION WinEndPaint(_hps:HPS):LONGWORD:        PMWIN index 738;
  286.           FUNCTION WinRegisterClass(cbWindowData:LONGWORD;
  287.                                     flStyle:LONGWORD;
  288.                                     pfnWndProc:POINTER;
  289.                                     pszClassName:PSZ;
  290.                                     _hab:LONGWORD):
  291.                                     LONGWORD:             PMWIN index 926;
  292.           FUNCTION WinCreateStdWindow(VAR phwndClient:HWND;
  293.                                       idResources:LONGWORD;
  294.                                       hmod:HMODULE;
  295.                                       styleClient:LONGWORD;
  296.                                       pszTitle:PSZ;
  297.                                       pszClientClass:PSZ;
  298.                                       VAR pflCreateFlags:LONGWORD;
  299.                                       flStyle:LONGWORD;
  300.                                       hwndParent:HWND):
  301.                                       LONGWORD:            PMWIN index 908;
  302.           FUNCTION WinDestroyWindow(_hwnd:HWND):
  303.                                     LONGWORD:              PMWIN index 728;
  304.           FUNCTION WinSetWindowPos(fl:LONGWORD;
  305.                                    cy,cx,y,x:LONGWORD;
  306.                                    hwndInsertBehind:HWND;
  307.                                    _hwnd:HWND):LONGWORD:   PMWIN index 875;
  308.           FUNCTION WinPostMsg(mp2,mp1:POINTER;
  309.                               msg:LONGWORD;
  310.                               _hwnd:HWND):LONGWORD:        PMWIN index 919;
  311.           FUNCTION WinMessageBox(flStyle:LONGWORD;
  312.                                  idWindow:LONGWORD;
  313.                                  pszCaption:PSZ;
  314.                                  pszText:PSZ;
  315.                                  hwndOwner:HWND;
  316.                                  hwndParent:HWND):LONGWORD:PMWIN index 789;
  317.           FUNCTION WinSetOwner(hwndNewOwner,_hwnd:HWND):
  318.                                LONGWORD:                   PMWIN index 864;
  319.           FUNCTION WinQueryWindowRect(VAR prclDest:RECTL;
  320.                                       _hwnd:HWND ):
  321.                                       LONGWORD:            PMWIN index 840;
  322.           FUNCTION WinFillRect(lColor:LONGWORD;
  323.                                VAR prcl:RECTL;
  324.                                _hps:HPS):LONGWORD:         PMWIN index 743;
  325.           FUNCTION WinQuerySysValue(iSysValue:LONGWORD;
  326.                                     hwndDesktop:HWND):
  327.                                     LONGWORD:              PMWIN index 829;
  328.           FUNCTION WinQueryWindow(cmd:LONGWORD;
  329.                                   _hwnd:HWND):LONGWORD:    PMWIN index 834;
  330.           FUNCTION WinQueryWindowULong(_index:LONGWORD;
  331.                                        _hwnd:HWND):
  332.                                        LONGWORD:           PMWIN index 843;
  333.           FUNCTION WinQueryWindowUShort(_index:LONGWORD;
  334.                                         _hwnd:HWND):WORD:  PMWIN index 844;
  335.           FUNCTION WinSendMsg(MPARAM2,MPARAM1:POINTER;
  336.                               msg:LONGWORD;
  337.                               _hwnd:HWND):POINTER:         PMWIN index 920;
  338.           FUNCTION WinQueryWindowPos(_swp:SWP;
  339.                                      _hwnd:HWND):LONGWORD: PMWIN index 837;
  340.           FUNCTION WinSetMultWindowPos(cswp:LONGWORD;
  341.                                        VAR pswp:SWP;
  342.                                        _hab:LONGWORD):
  343.                                        LONGWORD:           PMWIN index 863;
  344.           FUNCTION WinBeginEnumWindows(_hwnd:HWND):
  345.                                        LONGWORD:           PMWIN index 702;
  346.           FUNCTION WinGetNextWindow(_henum:LONGWORD):HWND: PMWIN index 756;
  347.           FUNCTION WinEndEnumWindows(_henum:LONGWORD):
  348.                                      LONGWORD:             PMWIN index 737;
  349.           FUNCTION WinSetWindowUShort(us:LONGINT;
  350.                                       _index:LONGWORD;
  351.                                       _hwnd:HWND):LONGWORD:PMWIN index 879;
  352.           FUNCTION WinSetWindowULong(ul:LONGWORD;
  353.                                      _index:LONGWORD;
  354.                                      _hwnd:HWND):LONGWORD: PMWIN index 878;
  355.           FUNCTION WinWindowFromID(id:LONGWORD;
  356.                                    hwndParent:HWND):HWND:  PMWIN index 899;
  357.           FUNCTION WinSetWindowText(psztext:PSZ;
  358.                                     _hwnd:HWND):LONGWORD:  PMWIN index 877;
  359.           FUNCTION WinCreateHelpInstance(VAR HInit:THelpInit;
  360.                                          hab:LONGWORD):
  361.                                          LONGWORD:         HELPMGR index 51;
  362.           FUNCTION WinDestroyHelpInstance(hwndHelp:HWND):
  363.                                           LONGWORD:        HELPMGR index 52;
  364.           FUNCTION WinAssociateHelpInstance(Frame,Help:HWND):
  365.                                            LONGWORD:       HELPMGR index 54;
  366. END;
  367.  
  368. IMPORTS {Private}  {USE OS/2 API calling convention}
  369.         FUNCTION GpiSetColor(lColor:LONGWORD;
  370.                              _hps:HPS):LONGINT:            PMGPI index 517;
  371.         FUNCTION GpiSetBackColor(lColor:LONGINT;
  372.                                  _hps:HPS):LONGWORD:       PMGPI index 504;
  373.         FUNCTION GpiSetBackMix(lMixMode:LONGINT;
  374.                                _hps:HPS):LONGWORD:         PMGPI index 505;
  375.         FUNCTION GpiCharStringAt(VAR pchString;
  376.                                  lCount:LONGWORD;
  377.                                  VAR pptlPoint:POINTL;
  378.                                  _hps:HPS):LONGWORD:       PMGPI index 359;
  379.  
  380. END;
  381.  
  382. CONST {Private}
  383.      HWND_DESKTOP       = 1;
  384.      HWND_OBJECT        = 2;
  385.      HWND_TOP           = 3;
  386.      HWND_BOTTOM        = 4;
  387.      HWND_THREADCAPTURE = 5;
  388.  
  389.      { Standard Window Styles }
  390.  
  391.      WS_VISIBLE         =$80000000;
  392.      WS_DISABLED        =$40000000;
  393.      WS_CLIPCHILDREN    =$20000000;
  394.      WS_CLIPSIBLINGS    =$10000000;
  395.      WS_PARENTCLIP      =$08000000;
  396.      WS_SAVEBITS        =$04000000;
  397.      WS_SYNCPAINT       =$02000000;
  398.      WS_MINIMIZED       =$01000000;
  399.      WS_MAXIMIZED       =$00800000;
  400.      WS_ANIMATE         =$00400000;
  401.  
  402.      {***********************************************************************
  403.       * Reserve a range of messages for help manager.  This range includes  *
  404.       * public messages, defined below, and private ones, which need to be  *
  405.       * reserved here to prevent clashing with application messages         *
  406.       ***********************************************************************}
  407.  
  408.       WM_HELPBASE              =$0F00;
  409.       WM_HELPTOP               =$0FFF;
  410.  
  411.       {User defined commands start here}
  412.       WM_USER                  =$1000;
  413.  
  414.  
  415.       { WinSetWindowPos() flags }
  416.  
  417.       SWP_SIZE                 =$0001;
  418.       SWP_MOVE                 =$0002;
  419.       SWP_ZORDER               =$0004;
  420.       SWP_SHOW                 =$0008;
  421.       SWP_HIDE                 =$0010;
  422.       SWP_NOREDRAW             =$0020;
  423.       SWP_NOADJUST             =$0040;
  424.       SWP_ACTIVATE             =$0080;
  425.       SWP_DEACTIVATE           =$0100;
  426.       SWP_EXTSTATECHANGE       =$0200;
  427.       SWP_MINIMIZE             =$0400;
  428.       SWP_MAXIMIZE             =$0800;
  429.       SWP_RESTORE              =$1000;
  430.       SWP_FOCUSACTIVATE        =$2000;
  431.       SWP_FOCUSDEACTIVATE      =$4000;
  432.       SWP_NOAUTOCLOSE          =$8000;
  433.  
  434.       {SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_SHOW }
  435.       SWP_SPEED                =$008B;
  436.       {SWP_SIZE | SWP_MOVE | SWP_SHOW }
  437.       SWP_ACT                  =$000B;
  438.  
  439.       { Class styles }
  440.  
  441.       CS_MOVENOTIFY            =$00000001;
  442.       CS_SIZEREDRAW            =$00000004;
  443.       CS_HITTEST               =$00000008;
  444.       CS_PUBLIC                =$00000010;
  445.       CS_FRAME                 =$00000020;
  446.       CS_CLIPCHILDREN          =$20000000;
  447.       CS_CLIPSIBLINGS          =$10000000;
  448.       CS_PARENTCLIP            =$08000000;
  449.       CS_SAVEBITS              =$04000000;
  450.       CS_SYNCPAINT             =$02000000;
  451.  
  452.       { background mixes }
  453.  
  454.       BM_ERROR                 =-1;
  455.       BM_DEFAULT               = 0;
  456.       BM_OR                    = 1;
  457.       BM_OVERPAINT             = 2;
  458.       BM_LEAVEALONE            = 5;
  459.       BM_XOR                   = 4;
  460.       BM_AND                   = 6;
  461.       BM_SUBTRACT              = 7;
  462.       BM_MASKSRCNOT            = 8;
  463.       BM_ZERO                  = 9;
  464.       BM_NOTMERGESRC           = 10;
  465.       BM_NOTXORSRC             = 11;
  466.       BM_INVERT                = 12;
  467.       BM_MERGESRCNOT           = 13;
  468.       BM_NOTCOPYSRC            = 14;
  469.       BM_MERGENOTSRC           = 15;
  470.       BM_NOTMASKSRC            = 16;
  471.       BM_ONE                   = 17;
  472.       BM_SRCTRANSPARENT        = 18;
  473.       BM_DESTTRANSPARENT       = 19;
  474.  
  475.       {Message box types }
  476.  
  477.       MB_OK                    =$0000;
  478.       MB_OKCANCEL              =$0001;
  479.       MB_RETRYCANCEL           =$0002;
  480.       MB_ABORTRETRYIGNORE      =$0003;
  481.       MB_YESNO                 =$0004;
  482.       MB_YESNOCANCEL           =$0005;
  483.       MB_CANCEL                =$0006;
  484.       MB_ENTER                 =$0007;
  485.       MB_ENTERCANCEL           =$0008;
  486.  
  487.       MB_NOICON                =$0000;
  488.       MB_CUANOTIFICATION       =$0000;
  489.       MB_ICONQUESTION          =$0010;
  490.       MB_ICONEXCLAMATION       =$0020;
  491.       MB_CUAWARNING            =$0020;
  492.       MB_ICONASTERISK          =$0030;
  493.       MB_ICONHAND              =$0040;
  494.       MB_CUACRITICAL           =$0040;
  495.       MB_QUERY                 =$0010;
  496.       MB_WARNING               =$0020;
  497.       MB_INFORMATION           =$0030;
  498.       MB_CRITICAL              =$0040;
  499.       MB_ERROR                 =$0040;
  500.  
  501.       MB_DEFBUTTON1            =$0000;
  502.       MB_DEFBUTTON2            =$0100;
  503.       MB_DEFBUTTON3            =$0200;
  504.  
  505.       MB_APPLMODAL             =$0000;
  506.       MB_SYSTEMMODAL           =$1000;
  507.       MB_HELP                  =$2000;
  508.       MB_MOVEABLE              =$4000;
  509.  
  510.       { Message box return codes }
  511.  
  512.       MBID_OK                  =1;
  513.       MBID_CANCEL              =2;
  514.       MBID_ABORT               =3;
  515.       MBID_RETRY               =4;
  516.       MBID_IGNORE              =5;
  517.       MBID_YES                 =6;
  518.       MBID_NO                  =7;
  519.       MBID_HELP                =8;
  520.       MBID_ENTER               =9;
  521.       MBID_ERROR               =$ffff;
  522.  
  523.       SV_SWAPBUTTON            =0;
  524.       SV_DBLCLKTIME            =1;
  525.       SV_CXDBLCLK              =2;
  526.       SV_CYDBLCLK              =3;
  527.       SV_CXSIZEBORDER          =4;
  528.       SV_CYSIZEBORDER          =5;
  529.       SV_ALARM                 =6;
  530.       SV_RESERVEDFIRST1        =7;
  531.       SV_RESERVEDLAST1         =8;
  532.       SV_CURSORRATE            =9;
  533.       SV_FIRSTSCROLLRATE       =10;
  534.       SV_SCROLLRATE            =11;
  535.       SV_NUMBEREDLISTS         =12;
  536.       SV_WARNINGFREQ           =13;
  537.       SV_NOTEFREQ              =14;
  538.       SV_ERRORFREQ             =15;
  539.       SV_WARNINGDURATION       =16;
  540.       SV_NOTEDURATION          =17;
  541.       SV_ERRORDURATION         =18;
  542.       SV_RESERVEDFIRST         =19;
  543.       SV_RESERVEDLAST          =19;
  544.       SV_CXSCREEN              =20;
  545.       SV_CYSCREEN              =21;
  546.       SV_CXVSCROLL             =22;
  547.       SV_CYHSCROLL             =23;
  548.       SV_CYVSCROLLARROW        =24;
  549.       SV_CXHSCROLLARROW        =25;
  550.       SV_CXBORDER              =26;
  551.       SV_CYBORDER              =27;
  552.       SV_CXDLGFRAME            =28;
  553.       SV_CYDLGFRAME            =29;
  554.       SV_CYTITLEBAR            =30;
  555.       SV_CYVSLIDER             =31;
  556.       SV_CXHSLIDER             =32;
  557.       SV_CXMINMAXBUTTON        =33;
  558.       SV_CYMINMAXBUTTON        =34;
  559.       SV_CYMENU                =35;
  560.       SV_CXFULLSCREEN          =36;
  561.       SV_CYFULLSCREEN          =37;
  562.       SV_CXICON                =38;
  563.       SV_CYICON                =39;
  564.       SV_CXPOINTER             =40;
  565.       SV_CYPOINTER             =41;
  566.       SV_DEBUG                 =42;
  567.       SV_CMOUSEBUTTONS         =43;
  568.       SV_CPOINTERBUTTONS       =43;
  569.       SV_POINTERLEVEL          =44;
  570.       SV_CURSORLEVEL           =45;
  571.       SV_TRACKRECTLEVEL        =46;
  572.       SV_CTIMERS               =47;
  573.       SV_MOUSEPRESENT          =48;
  574.       SV_CXBYTEALIGN           =49;
  575.       SV_CXALIGN               =49;
  576.       SV_CYBYTEALIGN           =50;
  577.       SV_CYALIGN               =50;
  578.       SV_NOTRESERVED           =56;
  579.       SV_EXTRAKEYBEEP          =57;
  580.       SV_SETLIGHTS             =58;
  581.       SV_INSERTMODE            =59;
  582.       SV_MENUROLLDOWNDELAY     =64;
  583.       SV_MENUROLLUPDELAY       =65;
  584.       SV_ALTMNEMONIC           =66;
  585.       SV_TASKLISTMOUSEACCESS   =67;
  586.       SV_CXICONTEXTWIDTH       =68;
  587.       SV_CICONTEXTLINES        =69;
  588.       SV_CHORDTIME             =70;
  589.       SV_CXCHORD               =71;
  590.       SV_CYCHORD               =72;
  591.       SV_CXMOTIONSTART         =73;
  592.       SV_CYMOTIONSTART         =74;
  593.       SV_BEGINDRAG             =75;
  594.       SV_ENDDRAG               =76;
  595.       SV_SINGLESELECT          =77;
  596.       SV_OPEN                  =78;
  597.       SV_CONTEXTMENU           =79;
  598.       SV_CONTEXTHELP           =80;
  599.       SV_TEXTEDIT              =81;
  600.       SV_BEGINSELECT           =82;
  601.       SV_ENDSELECT             =83;
  602.       SV_BEGINDRAGKB           =84;
  603.       SV_ENDDRAGKB             =85;
  604.       SV_SELECTKB              =86;
  605.       SV_OPENKB                =87;
  606.       SV_CONTEXTMENUKB         =88;
  607.       SV_CONTEXTHELPKB         =89;
  608.       SV_TEXTEDITKB            =90;
  609.       SV_BEGINSELECTKB         =91;
  610.       SV_ENDSELECTKB           =92;
  611.       SV_ANIMATION             =93;
  612.       SV_ANIMATIONSPEED        =94;
  613.       SV_MONOICONS             =95;
  614.       SV_KBDALTERED            =96;
  615.       SV_PRINTSCREEN           =97;
  616.       SV_CSYSVALUES            =98;
  617.  
  618.  
  619.  
  620.       { Standard WinQueryWindowUShort/ULong() indices }
  621.  
  622.       QWS_USER                   =0;
  623.       QWS_ID                     =-1;
  624.       QWS_MIN                    =-1;
  625.       QWL_USER                   =0;
  626.       QWL_STYLE                  =-2;
  627.       QWP_PFNWP                  =-3;
  628.       QWL_HMQ                    =-4;
  629.       QWL_RESERVED               =-5;
  630.       QWL_PENDATA                =-7;
  631.       QWL_MIN                    =-7;
  632.  
  633.       { WC_FRAME WinQueryWindowUShort/ULong() indices }
  634.  
  635.       QWL_HHEAP                  =$0004;
  636.       QWL_HWNDFOCUSSAVE          =$0018;
  637.       QWL_DEFBUTTON              =$0040;
  638.       QWL_PSSCBLK                =$0048;
  639.       QWL_PFEPBLK                =$004c;
  640.       QWL_PSTATBLK               =$0050;
  641.  
  642.       QWS_FLAGS                  =$0008;
  643.       QWS_RESULT                 =$000a;
  644.       QWS_XRESTORE               =$000c;
  645.       QWS_YRESTORE               =$000e;
  646.       QWS_CXRESTORE              =$0010;
  647.       QWS_CYRESTORE              =$0012;
  648.       QWS_XMINIMIZE              =$0014;
  649.       QWS_YMINIMIZE              =$0016;
  650.  
  651.  
  652. {**************************************************************************
  653. *                                                                         *
  654. *                                                                         *
  655. *                Common procedures and functions                          *
  656. *                                                                         *
  657. *                                                                         *
  658. ***************************************************************************}
  659.  
  660.  
  661. PROCEDURE DrawStringXY(_hps:HPS;VAR pt:POINTL;VAR s:string;start,Len:LONGWORD;
  662.                        Color,BackColor:LONGWORD);
  663. BEGIN
  664.      GpiSetColor(Color,_hps);
  665.      GpiSetBackColor(BackColor,_hps);
  666.      GpiCharStringAt(s[Start],Len,pt,_hps);
  667. END;
  668.  
  669.  
  670. PROCEDURE MaximizeWindow(Win:HWND);
  671. BEGIN
  672.      WinSetWindowPos(SWP_MAXIMIZE OR SWP_ACTIVATE OR SWP_SHOW,0,0,0,0,
  673.                      HWND_TOP,Win);
  674. END;
  675.  
  676. PROCEDURE MinimizeWindow(Win:HWND);
  677. BEGIN
  678.      WinSetWindowPos(SWP_MINIMIZE OR SWP_ACTIVATE OR SWP_SHOW,0,0,0,0,
  679.                      HWND_TOP,Win);
  680. END;
  681.  
  682.  
  683. FUNCTION IsWindowMaximized(Win:HWND):BOOLEAN;
  684. VAR r:LONGWORD;
  685. BEGIN
  686.      IF Win=0 THEN
  687.      BEGIN
  688.           IsWindowMaximized:=FALSE;
  689.           exit;
  690.      END;
  691.      IF WinQueryWindowUShort(QWS_ID,Win)=FID_CLIENT THEN
  692.       Win:=WinQueryWindow(QW_PARENT,Win);
  693.      r:=WinQueryWindowULong(QWL_STYLE,Win) and WS_MAXIMIZED;
  694.      IF r<>0 THEN IsWindowMaximized:=TRUE
  695.      ELSE IsWindowMaximized:=FALSE;
  696. END;
  697.  
  698. FUNCTION IsWindowMinimized(Win:HWND):BOOLEAN;
  699. VAR r:LONGWORD;
  700. BEGIN
  701.      IF Win=0 THEN
  702.      BEGIN
  703.           IsWindowMinimized:=FALSE;
  704.           exit;
  705.      END;
  706.      IF WinQueryWindowUShort(QWS_ID,Win)=FID_CLIENT THEN
  707.       Win:=WinQueryWindow(QW_PARENT,Win);
  708.      r:=WinQueryWindowULong(QWL_STYLE,Win) and WS_MINIMIZED;
  709.      IF r<>0 THEN IsWindowMinimized:=TRUE
  710.      ELSE IsWindowMinimized:=FALSE;
  711. END;
  712.  
  713. PROCEDURE HideWindow(Win:HWND);
  714. BEGIN
  715.      WinSetWindowPos(SWP_HIDE,0,0,0,0,0,Win);
  716. END;
  717.  
  718. PROCEDURE ShowWindow(Win:HWND);
  719. BEGIN
  720.      WinSetWindowPos(SWP_SHOW,0,0,0,0,0,Win);
  721. END;
  722.  
  723. PROCEDURE DisableWindow(Win:HWND);
  724. BEGIN
  725.      WinEnableWindow(0,Win);
  726. END;
  727.  
  728.  
  729. PROCEDURE EnableWindow(Win:HWND);
  730. BEGIN
  731.      WinEnableWindow(1,Win);
  732. END;
  733.  
  734. PROCEDURE RestoreWindow(Win:HWND);
  735. BEGIN
  736.      WinSetWindowPos(SWP_RESTORE,0,0,0,0,0,Win);
  737. END;
  738.  
  739. FUNCTION ConfirmBox(msg:String):BOOLEAN;
  740. VAR s:PString;
  741.     result:LONGWORD;
  742. BEGIN
  743.      s:='Confirm action';
  744.      result:=WinMessageBox(MB_YESNO or MB_MOVEABLE or MB_Query,0,s,msg,
  745.                            AppWinFrameHandle,HWND_Desktop);
  746.      ConfirmBox:=result=MBID_YES;
  747. END;
  748.  
  749.  
  750. PROCEDURE MessageBox(msg:String);
  751. VAR s:PString;
  752. BEGIN
  753.      s:='Message';
  754.      WinMessageBox(MB_OK or MB_MOVEABLE or MB_Query,0,s,msg,AppWinFrameHandle,
  755.                    HWND_Desktop);
  756. END;
  757.  
  758. PROCEDURE ErrorBox(err:String);
  759. VAR s:PString;
  760. BEGIN
  761.      s:='Error';
  762.      WinMessageBox(MB_OK or MB_MOVEABLE or MB_Query,0,s,err,AppWinFrameHandle,
  763.                    HWND_Desktop);
  764. END;
  765.  
  766.  
  767. FUNCTION PointerToWord(p:POINTER):WORD;ASM;
  768. BEGIN
  769.      ASM
  770.         MOV EBX,ESP
  771.         MOV EAX,[EBX+4]
  772.         RETN32 4
  773.      END;
  774. END;
  775.  
  776. FUNCTION PointerFrom2Short(s1,s2:Word):POINTER;ASM;
  777. BEGIN
  778.      ASM
  779.         MOV EBX,ESP
  780.         MOV EAX,[EBX+4]
  781.         RETN32 4
  782.      END;
  783. END;
  784.  
  785. FUNCTION PointerFromShort(s:Word):POINTER;ASM;
  786. BEGIN
  787.      ASM
  788.         MOV EBX,ESP
  789.         MOV AX,[EBX+4]
  790.         MOVZX EAX,AX
  791.         RETN32 2
  792.      END;
  793. END;
  794.  
  795. {**************************************************************************
  796. *                                                                         *
  797. *                                                                         *
  798. *                Object Implementation TAPPLICATION                       *
  799. *                                                                         *
  800. *                                                                         *
  801. ***************************************************************************}
  802.  
  803. PROCEDURE MessageHandler(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  804. BEGIN
  805.      ASM
  806.         PUSH EBP
  807.         MOV EBP,ESP
  808.         SUB ESP,2
  809.         MOVW [EBP-2],0   ;Not Handled
  810.  
  811.         PUSHL $Win
  812.         PUSHL $Msg
  813.         PUSHL $para1
  814.         PUSHL $para2
  815.         LEA EAX,[EBP-2]
  816.         PUSH EAX
  817.         MOV EDI,_MainAppVMT
  818.         PUSH EDI         ;VMT Pointer
  819.         MOV EDI,[EDI+0]  ;get VMT pointer for AppHandleEvent
  820.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  821.         MOV BL,[EBP-2]
  822.         CMP BL,0
  823.         JNE !hh
  824.         ;not handled
  825.         ;Default Window handler
  826.         PUSHL $para2
  827.         PUSHL $para1
  828.         PUSHL $msg
  829.         PUSHL $win
  830.         MOV AL,4
  831.         CALLDLL PMWin,911   ;WinDefWindowProc
  832.         ADD ESP,16
  833. !hh:
  834.         LEAVE
  835.         RETN32
  836.      END;
  837. END;
  838.  
  839.  
  840. PROCEDURE TApplication.InvalidateWindow(Win:HWND);
  841. VAR rc:RECTL;
  842. BEGIN
  843.      ASM
  844.         LEA EAX,$rc
  845.         PUSH EAX
  846.         PUSHL $Win
  847.         MOV AL,2
  848.         CALLDLL PMWIN,840  ;WinQueryWindowRect
  849.         ADD ESP,8
  850.  
  851.         PUSHL 0
  852.         LEA EAX,$rc
  853.         PUSH EAX
  854.         PUSHL $Win
  855.         MOV AL,3
  856.         CALLDLL PMWIN,765   ;WinInvalidateRect
  857.         ADD ESP,12
  858.      END;
  859. END;
  860.  
  861.  
  862. CONSTRUCTOR TApplication.Init(AppmainID:LONGWORD);
  863. {Initializes application}
  864. VAR t:WORD;
  865. BEGIN
  866.      MainID:=AppMainID;
  867.      AlternateExit:=TRUE; {Set alternate WM_QUIT Handler}
  868.      MenuResource:=FALSE;
  869.      IconResource:=FALSE;
  870.      AccelResource:=FALSE;
  871.      HelpResource:=FALSE;
  872.  
  873.      AppBackColor:=8; {CLR_DARKGRAY}
  874.  
  875.      TextDrawColor:=6; {CLR_YELLOW}
  876.      TextBackColor:=9; {CLR_DARKBLUE}
  877.  
  878.      ClientBackColor:=9; {CLR_DARKBLUE}
  879.      ChildCount:=0;
  880.      ActiveChild:=0;
  881.      MinimizedCount:=0;
  882.  
  883.      WinX:=50;
  884.      WinY:=100;
  885.      WinCX:=550;
  886.      WinCY:=320;
  887.      MainAppVMT:=SELF;
  888.      {Create Application Window class}
  889.      WinRegisterClass(0,CS_SizeRedraw,@MessageHandler,AppWinName,AppHandle);
  890. END;
  891.  
  892. DESTRUCTOR TApplication.Done;
  893. BEGIN
  894. END;
  895.  
  896.  
  897.  
  898. PROCEDURE TApplication.InsertHelp(Filename,WindowTitle:String);
  899. BEGIN
  900.      HelpResource:=TRUE;
  901.      HelpFileName:=FileName;
  902.      HelpTitle:=Windowtitle;
  903. END;
  904.  
  905.  
  906. PROCEDURE TApplication.AppCreateNotify(AppWin:HWND);
  907. BEGIN
  908.      WinSetWindowPos(SWP_SPEED,WinCY,WinCX,WinY,WinX,HWND_TOP,AppWinFrameHandle);
  909. END;
  910.  
  911. PROCEDURE MainMessageLoop;
  912. VAR _qmsg:QMSG;
  913. BEGIN
  914.      ASM
  915. !ndis:
  916.         PUSHL 0    ;PM_NOREMOVE
  917.         PUSHL 0
  918.         PUSHL 0
  919.         PUSHL 0
  920.         LEA EAX,$_qmsg
  921.         PUSH EAX
  922.         PUSHL _AppHandle
  923.         MOV AL,6
  924.         CALLDLL PMWIN,918  ;WinPeekMsg
  925.         ADD ESP,24
  926.         CMP EAX,0         ;Message in the queue ??
  927.         JNE !mes_here
  928.  
  929.         ;There was no message in the queue
  930.         CMPB _Drag_Mode,0
  931.         JE !mes_here       ;Wait for next message
  932.  
  933.         ;Create a WM_MouseDRAG Message at last Message Position
  934.         PUSHL 0
  935.         PUSHL _LastDragPos
  936.         PUSHL 1000h   ;WM_MOUSEDRAG1
  937.         PUSHL _DragWindow
  938.         MOV AL,4
  939.         CALLDLL PMWIN,920       ;WinSendMsg
  940.         ADD ESP,16
  941.  
  942.         JMP !ndis
  943. !mes_here:
  944.         PUSHL 0
  945.         PUSHL 0
  946.         PUSHL 0
  947.         LEA EAX,$_qmsg
  948.         PUSH EAX
  949.         PUSHL _AppHandle
  950.         MOV AL,5
  951.         CALLDLL PMWIN,915  ;WinGetMsg
  952.         ADD ESP,20
  953.         CMP EAX,0
  954.         JE !exdis
  955.  
  956.         LEA ESI,$_qmsg
  957.         MOV EAX,[ESI+4]     ;qmsg.msg
  958.         CMP EAX,72h         ;WM_Button1Up
  959.         JE !naus
  960.         CMP EAX,0412h       ;WM_Button1MotionEnd
  961.         JNE !naus_1
  962. !naus:
  963.         MOVB _MouseButton1Down,0
  964.         MOVB _Drag_Mode,0
  965. !naus_1:
  966.         LEA EAX,$_qmsg
  967.         PUSH EAX
  968.         PUSHL _AppHandle
  969.         MOV AL,2
  970.         CALLDLL PMWIN,912  ;WinDispatchMsg
  971.         ADD ESP,8
  972.         JMP !ndis
  973. !exdis:
  974.      END;
  975. END;
  976.  
  977.  
  978.  
  979. PROCEDURE TApplication.Run(Title:String;flags,frame:LongWord);
  980. {Starts execution of Application.
  981.  Title is the Title of the Main Application window.
  982.  If flags is not zero then flags will be the window style.
  983.  If frame is not zero then frame will be the frame flags.}
  984. VAR f:LONGWORD;
  985.     fr:LONGWORD; {Frame flags}
  986.     HelpInit:THelpInit;
  987.     p:POINTER;
  988. BEGIN
  989.      IF frame<>0 THEN fr:=frame
  990.      ELSE fr:=FCF_Simple;
  991.      IF flags<>0 THEN f:=Flags
  992.      ELSE f:=0;
  993.      IF MenuResource THEN fr:=fr OR FCF_MENU;
  994.      IF IconResource THEN fr:=fr OR FCF_ICON;
  995.      IF AccelResource THEN fr:=fr OR FCF_ACCELTABLE;
  996.      AppWinFrameHandle:=WinCreateStdWindow(AppWinHandle,MainID,0,0,
  997.                                         Title,AppWinName,fr,
  998.                                         f,HWND_DESKTOP);
  999.  
  1000.      HelpWindow:=0;
  1001.      IF HelpResource THEN
  1002.      BEGIN
  1003.           p:=@helptitle;
  1004.           inc(p);
  1005.           HelpInit.pszHelpWindowTitle:=p;
  1006.           p:=@HelpFileName;
  1007.           inc(p);
  1008.           HelpInit.pszHelpLibraryName:=p;
  1009.           HelpInit.cb:=sizeof(THelpInit);
  1010.           HelpInit.ulReturnCode:=0;
  1011.           HelpInit.pszTutorialname:=NIL;
  1012.           HelpInit.phtHelptable:=$FFFF0000 OR MainID;
  1013.           HelpInit.hmodHelptableModule:=0;
  1014.           HelpInit.hmodAccelActionBarModule:=0;
  1015.           HelpInit.idAcceltable:=0;
  1016.           HelpInit.idActionBar:=0;
  1017.           HelpInit.fShowPanelID:=1;
  1018.           HelpWindow:=WinCreateHelpInstance(HelpInit,Apphandle);
  1019.           IF HelpWindow<>0 THEN WinAssociateHelpInstance(AppWinFrameHandle,
  1020.                                                          HelpWindow)
  1021.           ELSE ErrorBox('Application failed to initialize help');
  1022.      END;                                        
  1023.      AppCreateNotify(AppWinFrameHandle);
  1024.  
  1025.      MainMessageLoop;
  1026.      WinDestroyWindow(AppWinFrameHandle);
  1027.      IF HelpWindow<>0 THEN WinDestroyHelpInstance(HelpWindow);
  1028. END;
  1029.  
  1030. PROCEDURE TApplication.PrintString(_hps:HPS;x,y:LONGWORD;s:string);
  1031. VAR
  1032.     pt:POINTL;
  1033.     ps:PString;
  1034. BEGIN
  1035.      pt.x:=x;
  1036.      pt.y:=y;
  1037.      GpiSetColor(TextDrawColor,_hps);
  1038.      GpiSetBackColor(TextBackColor,_hps);
  1039.      GpiSetBackMix(BM_OVERPAINT,_hps);
  1040.      ps:=s;
  1041.      GpiCharStringAt(ps,length(s),pt,_hps);
  1042. END;
  1043.  
  1044. PROCEDURE TApplication.Redraw(Win:HWND;_hps:HPS);
  1045. VAR rc:RECTL;
  1046. BEGIN
  1047.      WinQueryWindowRect(rc,Win);
  1048.      WinFillRect(AppBackColor,rc,_hps);
  1049. END;
  1050.  
  1051. PROCEDURE TApplication.SetWindowLoc(x,y,cx,cy:LONGWORD);
  1052. BEGIN
  1053.      WinX:=x;
  1054.      WinY:=y;
  1055.      WinCX:=cx;
  1056.      WinCY:=cy;
  1057. END;
  1058.  
  1059. PROCEDURE TApplication.InsertMenuResource;
  1060. BEGIN
  1061.      MenuResource:=TRUE;
  1062. END;
  1063.  
  1064. PROCEDURE TApplication.InsertIconResource;
  1065. BEGIN
  1066.      IconResource:=TRUE;
  1067. END;
  1068.  
  1069. PROCEDURE TApplication.InsertAccelResource;
  1070. BEGIN
  1071.      AccelResource:=TRUE;
  1072. END;
  1073.  
  1074. PROCEDURE TApplication.GetMaxWindow(VAR _swp:SWP);
  1075. VAR rec:RECTL;
  1076.     XDiv,YDiv,UWin:LONGWORD;
  1077. BEGIN
  1078.      XDiv:=WinQuerySysValue(SV_CXSIZEBORDER,HWND_DESKTOP);
  1079.      XDiv:=XDiv+WinQuerySysValue(SV_CXMINMAXBUTTON,HWND_DESKTOP) DIV 2;
  1080.  
  1081.      YDiv:=WinQuerySysValue(SV_CYSIZEBORDER,HWND_DESKTOP);
  1082.      YDiv:=YDiv+WinQuerySysValue(SV_CYMINMAXBUTTON,HWND_DESKTOP);
  1083.      WinQueryWindowRect(rec,AppWinHandle);
  1084.      _swp.cx:=rec.XRight-rec.XLeft;
  1085.      _swp.cy:=rec.yTop-rec.yBottom;
  1086.      _swp.x:=rec.xRight-_swp.cx;
  1087.      _swp.y:=rec.yTop-_swp.cy;
  1088. END;
  1089.  
  1090.  
  1091.  
  1092. PROCEDURE TApplication.TileWindows(Win:HWND);
  1093. VAR
  1094.     Buf:PSWPBUF;
  1095.     Square,Rows,Columns,ExtraCols,Width,Height:LONGWORD;
  1096.     rec:RECTL;
  1097.     Child:HWND;
  1098.     _hEnum:LONGWORD;
  1099.     CurRow,CurCol:LONGWORD;
  1100.     ChildCnt:LONGWORD;
  1101.     t:LONGWORD;
  1102. LABEL l;
  1103. BEGIN
  1104.      Square:=2;
  1105.      ChildCnt:=ChildCount-MinimizedCount;
  1106.      IF ChildCnt=0 THEN
  1107.      BEGIN
  1108.           MessageBox('No Windows to tile !');
  1109.           exit;
  1110.      END;
  1111.      WHILE Square*2<=ChildCnt DO inc(Square);
  1112.      IF ChildCnt=3 THEN Square:=3;
  1113.  
  1114.      Columns:=Square-1;
  1115.      Rows:=ChildCnt DIV Columns;
  1116.      ExtraCols:=ChildCnt MOD Columns;
  1117.  
  1118.      WinQueryWindowRect(rec,Win);
  1119.      IF rec.xRight>0 THEN IF rec.yBottom<rec.yTop THEN
  1120.      BEGIN
  1121.           _hEnum:=WinBeginEnumWindows(Win);
  1122.           Child:=WinGetNextWindow(_hEnum);
  1123.           IF Child<>0 THEN
  1124.           BEGIN
  1125.                GetMem(Buf,sizeof(TSWPBUF)*ChildCount);
  1126.                ChildCnt:=0;
  1127.                Height:=(rec.yTop-rec.yBottom) div Rows;
  1128.  
  1129.                FOR CurRow:=0 TO Rows-1 DO
  1130.                BEGIN
  1131.                     IF Rows-CurRow<=ExtraCols THEN inc(Columns);
  1132.                     FOR CurCol:=0 TO Columns-1 DO
  1133.                     BEGIN
  1134.                          Width:=rec.xRight div Columns;
  1135.  
  1136.                          {Skip minimized Windows}
  1137. l:
  1138.                          IF ((IsWindowMinimized(Child))OR
  1139.                          (WinQueryWindowUShort(QWS_ID,Child)=0)) THEN
  1140.                          BEGIN
  1141.                               Child:=WinGetNextWindow(_hEnum);
  1142.                               If Child<>0 THEN goto l;
  1143.                          END;
  1144.  
  1145.                          IF Child<>0 THEN
  1146.                          BEGIN
  1147.                               IF IsWindowMaximized(Child) THEN
  1148.                                Buf^[ChildCnt].fl:=SWP_SPEED OR SWP_RESTORE
  1149.                               ELSE Buf^[ChildCnt].fl:=SWP_SPEED;
  1150.                               buf^[ChildCnt].x:=Width*CurCol;
  1151.                               buf^[ChildCnt].y:=rec.yTop-(Height*(CurRow+1));
  1152.                               buf^[ChildCnt].cx:=Width;
  1153.                               buf^[ChildCnt].cy:=Height;
  1154.                               buf^[ChildCnt]._hwnd:=Child;
  1155.                               inc(ChildCnt);
  1156.  
  1157.                               Child:=WinGetNextWindow(_hEnum);
  1158.                          END;
  1159.                     END;
  1160.                     IF Rows-CurRow<=ExtraCols THEN
  1161.                     BEGIN
  1162.                          dec(Columns);
  1163.                          dec(ExtraCols);
  1164.                     END;
  1165.                END;
  1166.  
  1167.                WinEndEnumWindows(_HEnum);
  1168.                WinSetMultWindowPos(ChildCnt,Buf^[0],AppHandle);
  1169.                FreeMem(Buf,sizeof(TSWPBUF)*ChildCount);
  1170.           END;
  1171.  
  1172.      END;
  1173. END;
  1174.  
  1175. PROCEDURE TApplication.CascadeWindows(Win:HWND);
  1176. VAR Next:HWND;
  1177.     Count:LONGWORD;
  1178.     Buf:PLONGBUF;
  1179.     t:LONGWORD;
  1180.     _swp:SWP;
  1181.     XDiv,YDiv:LONGWORD;
  1182.     Frame:HWND;
  1183. BEGIN
  1184.      If ChildCount-MinimizedCount=0 THEN
  1185.      begin
  1186.           MessageBox('No Windows to cascade !');
  1187.           exit; {No childs exist}
  1188.      end;
  1189.      XDiv:=WinQuerySysValue(SV_CXSIZEBORDER,HWND_DESKTOP);
  1190.      XDiv:=XDiv+WinQuerySysValue(SV_CXMINMAXBUTTON,HWND_DESKTOP) DIV 2;
  1191.  
  1192.      YDiv:=WinQuerySysValue(SV_CYSIZEBORDER,HWND_DESKTOP);
  1193.      YDiv:=YDiv+WinQuerySysValue(SV_CYMINMAXBUTTON,HWND_DESKTOP);
  1194.      Next:=WinQueryWindow(QW_BOTTOM,Win);
  1195.      if Next=0 THEN
  1196.      begin
  1197.           MessageBox('No Windows to cascade !');
  1198.           exit; {No childs exist}
  1199.      end;
  1200.      Count:=0;
  1201.      GetMem(Buf,4*ChildCount);
  1202.      WHILE Next<>0 DO
  1203.      BEGIN
  1204.           IF ((not IsWindowMinimized(Next))AND
  1205.              (WinQueryWindowUShort(QWS_ID,Next)<>0))
  1206.           THEN
  1207.           BEGIN
  1208.                Buf^[Count]:=Next;
  1209.                Inc(Count);
  1210.           END;
  1211.           Next:=WinQueryWindow(QW_PREV,Next);
  1212.      END;
  1213.      GetMaxWindow(_swp);
  1214.      FOR t:=0 TO Count-1 DO
  1215.      BEGIN
  1216.           WinSetWindowPos(SWP_SPEED,_swp.cy,_swp.cx,_swp.y,_swp.x,0,
  1217.                           Buf^[t]);
  1218.           inc(_swp.x,XDiv);
  1219.           dec(_swp.cx,XDiv);
  1220.           dec(_swp.cy,YDiv);
  1221.      END;
  1222.      FreeMem(Buf,4*ChildCount);
  1223. END;
  1224.  
  1225. PROCEDURE TApplication.NextWindow;
  1226. VAR Next:HWND;
  1227.     AcFrame:HWND;
  1228.     f:LONGWORD;
  1229. BEGIN
  1230.      Next:=WinQueryWindow(QW_PARENT,ActiveChild);
  1231.      AcFrame:=Next;
  1232.      Next:=WinQueryWindow(QW_NEXT,Next);
  1233.      WHILE ((Next<>0)AND(WinQueryWindowUShort(QWS_ID,Next)=0)) DO
  1234.        Next:=WinQueryWindow(QW_NEXT,Next);
  1235.      IF Next<>0 THEN
  1236.      BEGIN
  1237.            WinSetWindowPos(SWP_ZORDER or SWP_ACTIVATE,0,0,0,0,HWND_TOP,
  1238.                            Next);
  1239.            IF IsWindowMaximized(AcFrame) THEN f:=SWP_RESTORE OR SWP_ZORDER
  1240.            ELSE f:=SWP_ZORDER;
  1241.            WinSetWindowPos(f,0,0,0,0,HWND_BOTTOM,AcFrame);
  1242.      END;
  1243. END;
  1244.  
  1245. PROCEDURE TApplication.CloseAllWindows(Win:HWND);
  1246. VAR Child:HWND;
  1247.     _hEnum:LONGWORD;
  1248. BEGIN
  1249.      _hEnum:=WinBeginEnumWindows(Win);
  1250.      Child:=WinGetNextWindow(_HEnum);
  1251.      WHILE Child<>0 DO
  1252.      BEGIN
  1253.            WinDestroyWindow(Child);
  1254.            Child:=WinGetNextWindow(_HEnum);
  1255.      END;
  1256.      WinEndEnumWindows(_HEnum);
  1257. END;
  1258.  
  1259. PROCEDURE TApplication.HandleCharEvent(Win:HWND;ch:Char);
  1260. BEGIN
  1261. END;
  1262.  
  1263. PROCEDURE TApplication.HandleScanEvent(Win:HWND;scan:Word);
  1264. BEGIN
  1265. END;
  1266.  
  1267. PROCEDURE TApplication.MDIHandleCharEvent(Win:HWND;Extra:POINTER;ch:Char);
  1268. BEGIN
  1269. END;
  1270.  
  1271. PROCEDURE TApplication.MDIHandleScanEvent(Win:HWND;Extra:POINTER;scan:Word);
  1272. BEGIN
  1273. END;
  1274.  
  1275. FUNCTION TApplication.AppHandleEvent(Win:HWND;Msg:LONGWORD;
  1276.                                      para1,para2:POINTER;
  1277.                                      VAR Handled:BOOLEAN):LONGWORD;
  1278. VAR
  1279.     H:Boolean;
  1280.     _hps:HPS;
  1281.     r:LONGWORD;
  1282.     command:WORD;
  1283.     rc:RECTL;
  1284.     w,w1:Word;
  1285.     b:WORD;
  1286.     ch:char;
  1287. label l,l1;
  1288. BEGIN
  1289.       r:=0;
  1290.       H:=TRUE;
  1291.       CASE Msg OF
  1292.           HM_QUERY_KEYS_HELP:r:=CM_KEYSHELP;
  1293.           HM_ERROR:ErrorBox('Help manager error!');
  1294.           HM_HELPSUBITEM_NOT_FOUND:ErrorBox('Helpsubitem not found!');
  1295.           HM_EXT_HELP_UNDEFINED:ErrorBox('Extended help undefined!');
  1296.           HM_GENERAL_HELP_UNDEFINED:ErrorBox('General help undefined!');
  1297.           WM_CHAR:
  1298.           BEGIN
  1299.                r:=LONGINT(para1);
  1300.                w:=lo(r);
  1301.                IF w AND $41=1 THEN {KC_CHAR valid and KC_KEYUP}
  1302.                BEGIN
  1303.                     r:=LONGINT(para2);
  1304.                     w1:=lo(r);
  1305.                     b:=lo(w1);
  1306.                     if b<32 THEN goto l;
  1307.                     IF w and $10=$10 THEN goto l; {KC_CTRL valid}
  1308.                     ch:=chr(b);
  1309.                     HandleCharEvent(Win,ch);
  1310.                     goto l1;
  1311.                END
  1312.                ELSE
  1313.                BEGIN
  1314.                     IF w AND $44=4 THEN {KC_CHAR valid and KC_KEYUP}
  1315.                     BEGIN
  1316.                          w1:=hi(r);
  1317.                          b:=hi(w1);
  1318. l:
  1319.                          IF w and $10=$10 THEN inc(b,256); {KC_CTRL valid}
  1320.                          HandleScanEvent(Win,b);
  1321.                          goto l1;
  1322.                     END;
  1323.                END;
  1324.           END;
  1325.           WM_COMMAND:
  1326.           BEGIN
  1327.                command:=PointerToWord(para1);
  1328.                CASE command OF
  1329.                    CM_HELPONHELP:IF HelpWindow<>0 THEN
  1330.                              WinSendMsg(NIL,NIL,HM_DISPLAY_HELP,HelpWindow);
  1331.                    CM_EXTENDEDHELP:IF HelpWindow<>0 THEN
  1332.                              WinSendMsg(NIL,NIL,HM_EXT_HELP,HelpWindow);
  1333.                    CM_KEYSHELP:IF HelpWindow<>0 THEN
  1334.                              WinSendMsg(NIL,NIL,HM_KEYS_HELP,HelpWindow);
  1335.                    CM_HELPINDEX:IF HelpWindow<>0 THEN
  1336.                              WinSendMsg(NIL,NIL,HM_HELP_INDEX,HelpWindow);
  1337.                END; {case}
  1338.                IF ChildCount>0 THEN
  1339.                BEGIN
  1340.                     CASE command OF
  1341.                       CM_CLOSE:WinSendMsg(NIL,NIL,WM_CLOSE,ActiveChild);
  1342.                       CM_CASCADE:CascadeWindows(Win);
  1343.                       CM_TILE:TileWindows(Win);
  1344.                       CM_CLOSEALL:CloseAllWindows(Win);
  1345.                       CM_Next:NextWindow;
  1346.                     ELSE IF not Handled THEN H:=FALSE;
  1347.                     END; {case}
  1348.                END
  1349.                ELSE IF not Handled THEN H:=FALSE;
  1350.           END;
  1351.           WM_CLOSE:
  1352.           BEGIN
  1353.                WinPostMsg(NIL,NIL,WM_QUIT,Win);
  1354.           END;
  1355.           WM_PAINT:
  1356.           BEGIN
  1357.                _hps:=WinBeginPaint(rc,0,Win);
  1358.                Redraw(Win,_hps);
  1359.                WinEndPaint(_hps);
  1360.           END;
  1361.           WM_BUTTON1UP:
  1362.           BEGIN
  1363.                MouseButton1Down:=FALSE;
  1364.                Drag_Mode:=FALSE;
  1365.                IF not Handled THEN H:=FALSE;
  1366.           END;
  1367.           ELSE IF not Handled THEN H:=FALSE;
  1368.       END;
  1369. l1:
  1370.       Handled:=H;
  1371.       AppHandleEvent:=r;
  1372. END;
  1373.  
  1374. PROCEDURE TApplication.MDIRedraw(Win:HWND;_hps:HPS;Extra:POINTER);
  1375. BEGIN
  1376. END;
  1377.  
  1378. PROCEDURE TApplication.MDIPaintNotify(Win:HWND;_hps:HPS;Extra:POINTER);
  1379. VAR rc:RECTL;
  1380. BEGIN
  1381.      WinQueryWindowRect(rc,Win);
  1382.      WinFillRect(ClientBackColor,rc,_hps);
  1383.      MDIRedraw(Win,_hps,Extra);
  1384. END;
  1385.  
  1386.  
  1387. FUNCTION TApplication.MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,para2:POINTER;
  1388.                                      VAR Handled:BOOLEAN;Extra:POINTER):LONGWORD;
  1389. VAR
  1390.     H:Boolean;
  1391.     _hps:HPS;
  1392.     r:LONGWORD;
  1393.     command:WORD;
  1394.     rc:RECTL;
  1395.     _pswp:PSWP;
  1396.     Frame:HWND;
  1397.     w,w1:Word;
  1398.     b:WORD;
  1399.     ch:char;
  1400. label l,l1;
  1401. BEGIN
  1402.       r:=0;
  1403.       H:=TRUE;
  1404.       CASE Msg OF
  1405.           WM_CHAR:
  1406.           BEGIN
  1407.                r:=LONGINT(para1);
  1408.                w:=lo(r);
  1409.                IF w AND $41=1 THEN {KC_CHAR valid and KC_KEYUP}
  1410.                BEGIN
  1411.                     r:=LONGINT(para2);
  1412.                     w1:=lo(r);
  1413.                     b:=lo(w1);
  1414.                     if b<32 THEN goto l;
  1415.                     IF w and $10=$10 THEN goto l; {KC_CTRL valid}
  1416.                     ch:=chr(b);
  1417.                     MDIHandleCharEvent(Win,Extra,ch);
  1418.                     goto l1;
  1419.                END
  1420.                ELSE
  1421.                BEGIN
  1422.                     IF w AND $44=4 THEN {KC_CHAR valid and KC_KEYUP}
  1423.                     BEGIN
  1424.                          w1:=hi(r);
  1425.                          b:=hi(w1);
  1426. l:
  1427.                          IF w and $10=$10 THEN inc(b,256); {KC_CTRL valid}
  1428.                          MDIHandleScanEvent(Win,Extra,b);
  1429.                          goto l1;
  1430.                     END;
  1431.                END;
  1432.           END;
  1433.           WM_MINMAXFRAME:
  1434.           BEGIN
  1435.                {Minimize the window ??}
  1436.                _pswp:=para1;
  1437.                IF _pswp^.fl AND SWP_MINIMIZE<>0 THEN INC(MinimizedCount)
  1438.                ELSE
  1439.                BEGIN
  1440.                     Frame:=WinQueryWindow(QW_PARENT,Win);
  1441.                     IF IsWindowMinimized(Win) THEN
  1442.                     BEGIN
  1443.                          DEC(MinimizedCount);
  1444.                          WinSetWindowUShort(-1,QWS_XMINIMIZE,Frame);
  1445.                          WinSetWindowUShort(-1,QWS_YMINIMIZE,Frame);
  1446.                     END;
  1447.                END;
  1448.           END;
  1449.           WM_CREATE:
  1450.           BEGIN
  1451.                inc(ChildCount);
  1452.           END;
  1453.           WM_ACTIVATE:
  1454.           BEGIN
  1455.                ActiveChild:=Win;
  1456.           END;
  1457.           WM_CLOSE:
  1458.           BEGIN
  1459.                WinDestroyWindow(WinQueryWindow(QW_PARENT,Win));
  1460.           END;
  1461.           WM_DESTROY:
  1462.           BEGIN
  1463.                IF IsWindowMinimized(Win) THEN dec(MinimizedCount);
  1464.                dec(ChildCount);
  1465.           END;
  1466.           WM_BUTTON1DOWN:
  1467.           BEGIN
  1468.                Drag_Mode:=FALSE;
  1469.                MouseButton1Down:=TRUE;
  1470.                IF not Handled THEN H:=FALSE;
  1471.           END;
  1472.           WM_BUTTON1UP:
  1473.           BEGIN
  1474.                MouseButton1Down:=FALSE;
  1475.                Drag_Mode:=FALSE;
  1476.                IF not Handled THEN H:=FALSE;
  1477.           END;
  1478.           WM_MOUSEMOVE:
  1479.           BEGIN
  1480.                IF MouseButton1Down THEN WinSendMsg(NIL,para1,WM_MOUSEDRAG1,Win);
  1481.                IF not Handled THEN H:=FALSE;
  1482.           END;
  1483.           WM_PAINT:
  1484.           BEGIN
  1485.                _hps:=WinBeginPaint(rc,0,Win);
  1486.                MDIPaintNotify(Win,_hps,Extra);
  1487.                WinEndPaint(_hps);
  1488.           END;
  1489.           ELSE IF not Handled THEN H:=FALSE;
  1490.       END;
  1491. l1:
  1492.       Handled:=H;
  1493.       MDIHandleEvent:=r;
  1494. END;
  1495.  
  1496.  
  1497. PROCEDURE TApplication.CenterWindow(Win:HWND);
  1498. VAR ScrWidth,ScrHeight:LONGWORD;
  1499.     rec:RECTL;
  1500. BEGIN
  1501.      ScrWidth:=WinQuerySysValue(SV_CXSCREEN,HWND_DESKTOP);
  1502.      ScrHeight:=WinQuerySysValue(SV_CYSCREEN,HWND_DESKTOP);
  1503.      WinQueryWindowRect(rec,Win);
  1504.      WinSetWindowPos(SWP_MOVE OR SWP_ACTIVATE,0,0,(ScrHeight-rec.yTop) DIV 2,
  1505.                      (ScrWidth-rec.xRight) DIV 2,HWND_TOP,Win);
  1506. END;
  1507.  
  1508.  
  1509. {**************************************************************************
  1510. *                                                                         *
  1511. *                                                                         *
  1512. *                Object Implementation TMDIAPPLICATION                    *
  1513. *                                                                         *
  1514. *                                                                         *
  1515. ***************************************************************************}
  1516.  
  1517. PROCEDURE MDIMessageHandler(para2,para1:POINTER;Msg,Win:LONGWORD);ASM;
  1518. BEGIN
  1519.      ASM
  1520.         PUSH EBP
  1521.         MOV EBP,ESP
  1522.         SUB ESP,2
  1523.         MOVW [EBP-2],0   ;Not Handled
  1524.  
  1525.         PUSHL $Win
  1526.         PUSHL $Msg
  1527.         PUSHL $para1
  1528.         PUSHL $para2
  1529.         LEA EAX,[EBP-2]
  1530.         PUSH EAX
  1531.         PUSHL 0
  1532.         PUSHL $Win
  1533.         MOV AL,2
  1534.         CALLDLL PMWIN,843   ;QueryWindowUlong
  1535.         ADD ESP,8
  1536.         PUSH EAX
  1537.         MOV EDI,_MainAppVMT
  1538.         PUSH EDI         ;VMT Pointer
  1539.         MOV EDI,[EDI+0]  ;get VMT pointer for MDIHandleEvent
  1540.         ADD EDI,4
  1541.         db ffh,17h       ;CALL NEAR32 [EDI+0] --> in Methode springen
  1542.         MOV BL,[EBP-2]
  1543.         CMP BL,0
  1544.         JNE !hh_1
  1545.         ;not handled
  1546.         ;Default Window handler
  1547.         PUSHL $para2
  1548.         PUSHL $para1
  1549.         PUSHL $msg
  1550.         PUSHL $win
  1551.         MOV AL,4
  1552.         CALLDLL PMWin,911   ;WinDefWindowProc
  1553.         ADD ESP,16
  1554. !hh_1:
  1555.         LEAVE
  1556.         RETN32
  1557.      END;
  1558. END;
  1559.  
  1560. CONSTRUCTOR TMDIApplication.Init(AppMainID:LONGWORD);
  1561. BEGIN
  1562.      Inherited.Init(AppMainID);
  1563.      {Create MDI Window class}
  1564.      WinRegisterClass(4,CS_SizeRedraw,@MDIMessageHandler,AppChildName,AppHandle);
  1565. END;
  1566.  
  1567. DESTRUCTOR TMDIApplication.Done;
  1568. BEGIN
  1569. END;
  1570.  
  1571.  
  1572. FUNCTION TMDIApplication.MDICreateChild(Title:String;Extra:POINTER;
  1573.                                          fcfFlags:LONGWORD):HWND;
  1574. VAR HWndChild,ChildFrame:HWND;
  1575.     fr:LONGWORD;
  1576.     _Swp:SWP;
  1577.     LastWin:HWND;
  1578. BEGIN
  1579.      IF ChildCount>=20 THEN
  1580.      BEGIN
  1581.           ErrorBox('Too much child windows');
  1582.           exit;
  1583.      END;
  1584.      fr:=FCF_SPEEDCHILD or FCF_ICON or fcfFlags;
  1585.      LastWin:=ActiveChild;
  1586.      ChildFrame:=WinCreateStdWindow(hwndChild,1001,0,0,Title,AppChildName,
  1587.                                         fr,0,AppWinHandle);
  1588.      IF ActiveChild<>0 THEN IF IsWindowMaximized(ActiveChild) THEN
  1589.       RestoreWindow(WinQueryWindow(QW_PARENT,ActiveChild));
  1590.      WinSetOwner(ChildFrame,hwndChild);
  1591.      GetMaxWindow(_swp);
  1592.      WinSetWindowULong(LONGWORD(Extra),0,hwndChild);
  1593.      WinSetWindowPos(SWP_SPEED,_swp.cy,_swp.cx,_swp.y,_swp.x,0,ChildFrame);
  1594.      MDICreateNotify(hwndchild,Extra);
  1595.      MDICreateChild:=ChildFrame;
  1596. END;
  1597.  
  1598. PROCEDURE TMDIApplication.MDICreateNotify(Win:HWND;Extra:POINTER);
  1599. BEGIN
  1600. END;
  1601.  
  1602. FUNCTION TMDIApplication.MDIGetExtraPointer(Win:HWND):POINTER;
  1603. VAr Result:POINTER;
  1604. BEGIN
  1605.     ASM
  1606.        PUSHL 0
  1607.        PUSHL $Win
  1608.        MOV AL,2
  1609.        CALLDLL PMWIN,843   ;WinQueryWindowUlong
  1610.        ADD ESP,8
  1611.        MOV $Result,EAX
  1612.     END;
  1613.     MDIGetExtraPointer:=result;
  1614. END;
  1615.  
  1616. FUNCTION TMDIApplication.MDIGetTopWindow(VAR Extra:POINTER):HWND;
  1617. VAR Win:HWND;
  1618. BEGIN
  1619.      Win:=ActiveChild;
  1620.      IF Win<>0 THEN Extra:=MDIGetExtraPointer(Win)
  1621.      ELSE Extra:=NIL;
  1622.      MDIGetTopWindow:=Win;
  1623. END;
  1624.  
  1625. BEGIN
  1626.       AppWinName:='SERVER';
  1627.       AppChildName:='MDICHILD';
  1628. END.
  1629.  
  1630.