Metropoli BBS
VIEWER: winsave.pas MODE: TEXT (CP437)
{█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█}
{█                                                       █}
{█      Virtual Pascal Examples. Version 1.10            █}
{█        Saving window size and position example        █}
{█        The Art Of OS/2, Chapter 10, p. 175-177        █}
{█      ─────────────────────────────────────────────────█}
{█      Copyright (c) 1992-1996 by Kathleen Panov        █}
{█      VP/2 Version Copyright (C) 1996 fPrint UK Ltd    █}
{█                                                       █}
{▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀}

Program WinSave;

{$PMTYPE PM}

Uses
  Os2Def, Os2PmApi;

{$D WinRestoreWindowPos example - Copyright (c) 1992-1995 by Kathleen Panov}

{$IFDEF VPDEMO}
  {&Dynamic VP11Demo.Lib}
{$ENDIF}

Const
 CLS_CLIENT  = 'MyClass';

 SAVE_NAME   = 'WINSAVE';
 SAVE_KEY    = 'WINDOWPOS';

Function ClientWndProc ( hwndWnd : HWND ;
                         ulMsg   : ULONG;
                         mpParm1 : MPARAM;
                         mpParm2 : MPARAM ) : mResult; cdecl;
begin
  ClientWndProc := ord(False);

  Case ulMsg of
    WM_ERASEBACKGROUND :
      ClientWndProc := ord(True);

    WM_SAVEAPPLICATION :
      WinStoreWindowPos ( SAVE_NAME,
                          SAVE_KEY,
                          WinQueryWindow ( hwndWnd, QW_PARENT )) ;

  else
    ClientWndProc := WinDefWindowProc ( hwndWnd,
                                        ulMsg,
                                        mpParm1,
                                        mpParm2 ) ;
   end;  { Case }
end;

Var
  habAnchor :  HAB;
  hmqQueue :   HMQ;
  ulFlags :    ULONG;
  hwndFrame :  HWND;
  hwndClient : HWND;
  bReturn :    BOOL;
  bLoop :      BOOL;
  qmMsg :      QMSG;

begin

   habAnchor := WinInitialize ( 0 ) ;
   hmqQueue := WinCreateMsgQueue ( habAnchor, 0 ) ;

   WinRegisterClass ( habAnchor,
                      CLS_CLIENT,
                      ClientWndProc,
                      CS_SIZEREDRAW,
                      0 ) ;

   ulFlags := FCF_TITLEBAR OR FCF_SYSMENU OR FCF_SIZEBORDER OR
              FCF_MINMAX OR FCF_TASKLIST ;

   hwndFrame := WinCreateStdWindow ( HWND_DESKTOP,
                                    WS_VISIBLE,
                                    ulFlags,
                                    CLS_CLIENT,
                                    'Titlebar',
                                    0,
                                    NULLHANDLE,
                                    0,
                                    @hwndClient ) ;

   if ( hwndFrame <> NULLHANDLE ) then
     begin
      bReturn := WinRestoreWindowPos ( SAVE_NAME,
                                       SAVE_KEY,
                                       hwndFrame ) ;

      if bReturn then
         WinSetWindowPos ( hwndFrame,
                           HWND_TOP,
                           0,
                           0,
                           0,
                           0,
                           SWP_ACTIVATE OR SWP_SHOW )
      else
         WinSetWindowPos ( hwndFrame,
                           NULLHANDLE,
                           10,
                           10,
                           400,
                           300,
                           SWP_ACTIVATE OR
                           SWP_MOVE OR
                           SWP_SIZE OR
                           SWP_SHOW ) ;

      bLoop := WinGetMsg (habAnchor,
                          qmMsg,
                          NULLHANDLE,
                          0,
                          0 ) ;

      while bLoop do
        begin
          WinDispatchMsg ( habAnchor, qmMsg ) ;
          bLoop := WinGetMsg ( habAnchor,
                              qmMsg,
                              NULLHANDLE,
                              0,
                              0 ) ;
        end; { endwhile }

      WinDestroyWindow ( hwndFrame ) ;
     end;

   WinDestroyMsgQueue ( hmqQueue ) ;
   WinTerminate ( habAnchor ) ;
end.

[ RETURN TO DIRECTORY ]