home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 24 / CDACTUAL24.iso / SHARE / os2 / edm2 / common / snippets / save_restore_winpos.txt < prev    next >
Encoding:
Internet Message Format  |  1997-10-30  |  6.1 KB

  1. From: Mark Harrison (harrison@lclark.edu)
  2.  
  3. I received only one reader submission for this month, so there seems to be
  4. no competition to see which will be published this month.
  5.  
  6. Remember (I cannot stress this enough), submitted functions must be
  7. modular in fashion.  This means that you should be able to compile them
  8. separately and need only link them with your applications to get them to
  9. work properly (versus actually including the source code as part of your
  10. application).  The functions below do not quite meet this criteria (they
  11. still require the application to define a constant), but they are close
  12. enough.
  13.  
  14. The functions below are for saving and restoring window positions in an
  15. .INI file.  It should be noted, therefore, that OS/2 2.x provides a
  16. superset of this functionality in the WinStoreWindowPos() and
  17. WinRestoreWindowPos() API's.
  18.  
  19. /* ========================================================================
  20.    Submitted by:  Mark Harrison (harrison@lclark.edu)
  21.  
  22.    These two routines will allow you to save the startup position of a
  23.    window in a private ini file.  There are two calls that will do this
  24.    in the PM API ( WinStoreWindowPos() & WinRestoreWindowPos() ), but
  25.    these save your data in the system ini files.  If you prefer to not
  26.    clutter the system files up, you need to take care of saving the
  27.    information in your own private file.
  28.  
  29.    What these two routines do is to save and restore a windows position,
  30.    size and the previous position and size if a window is closed and
  31.    re-opened while it is maximized or minimized.
  32.  
  33.    INI files have a three level heirarchy, set up as follows:
  34.  
  35.    Application         For example to store scores for a       Basketball
  36.       Key Name         Basketball program, the INI file           Score
  37.          Key Data      might look like this.                         45 51
  38.  
  39.    Although you can store more than one applications data in an INI file,
  40.    this probably isn't a good practice in most cases.
  41.  
  42.    [ To use these functions, you need to #define the constant ID_INIPATH.
  43.      See below for more information.  - Editor ]
  44. ======================================================================== */
  45.  
  46. VOID GetStartupData(HWND hWndFrame)
  47. {
  48.    HAB hab;
  49.    CHAR szIniPath[64];
  50.    HINI hMyHini;
  51.    SWP Swp;
  52.    ULONG ulSwpSize = sizeof(SWP);
  53.    ULONG SwpOptions = SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW;
  54.    USHORT RestoreValues[6];
  55.    ULONG ulRestoreValuesSize = sizeof(RestoreValues);
  56.  
  57. /* ========================================================================
  58.    Load the physical pathname from the resource file.  It should be defined
  59.    something like this.
  60.  
  61.    STRINGTABLE LOADONCALL MOVEABLE
  62.    BEGIN
  63.       ID_INIPATH   "C:\\APP.INI"
  64.    END
  65. ======================================================================== */
  66.    hab = WinQueryAnchorBlock(hWndFrame);
  67.    WinLoadString(hab, 0, ID_INIPATH, sizeof(szIniPath), szIniPath);
  68.  
  69.    if ((hMyHini = PrfOpenProfile(hab, szIniPath))!=NULLHANDLE)
  70.       {
  71.       if (PrfQueryProfileData(hMyHini,
  72.                               "App",
  73.                               "WindowSize",
  74.                               (PVOID)&Swp,
  75.                               (PULONG)&ulSwpSize))
  76.          {
  77.          if (Swp.fl & SWP_MAXIMIZE)
  78.             SwpOptions |= SWP_MAXIMIZE;
  79.          else if (Swp.fl & SWP_MINIMIZE)
  80.             SwpOptions |= SWP_MINIMIZE;
  81.  
  82.          WinSetWindowPos(hWndFrame,
  83.                          NULLHANDLE,
  84.                          Swp.x,
  85.                          Swp.y,
  86.                          Swp.cx,
  87.                          Swp.cy,
  88.                          SwpOptions);
  89.  
  90. /* ========================================================================
  91.    Set the following flags in the frame window extra data.  This will tell
  92.    the frame what size it should restore itself to if you restart minimized
  93.    or maximized.
  94. ======================================================================== */
  95.          if (PrfQueryProfileData(hMyHini,
  96.                                  "App",
  97.                                  "RestoreValues",
  98.                                  (PVOID)&RestoreValues,
  99.                                  (PULONG)&ulRestoreValuesSize))
  100.             {
  101.             WinSetWindowUShort(hWndFrame, QWS_XRESTORE, RestoreValues[0]);
  102.             WinSetWindowUShort(hWndFrame, QWS_YRESTORE, RestoreValues[1]);
  103.             WinSetWindowUShort(hWndFrame, QWS_CXRESTORE, RestoreValues[2]);
  104.             WinSetWindowUShort(hWndFrame, QWS_CYRESTORE, RestoreValues[3]);
  105.             WinSetWindowUShort(hWndFrame, QWS_XMINIMIZE, RestoreValues[4]);
  106.             WinSetWindowUShort(hWndFrame, QWS_YMINIMIZE, RestoreValues[5]);
  107.             }
  108.          }
  109.       else
  110.          WinSetWindowPos(hWndFrame, 0, 0L, 40L, 800L, 560L, SwpOptions);
  111.       }
  112.    else
  113.       WinSetWindowPos(hWndFrame, 0, 0L, 40L, 800L, 560L, SwpOptions);
  114.  
  115.    PrfCloseProfile(hMyHini);
  116.    return;
  117. }
  118.  
  119. VOID SaveStartupData(HWND hWndFrame)
  120. {
  121.    HAB hab;
  122.    CHAR szIniPath[64];
  123.    HINI hMyHini;
  124.    SWP Swp;
  125.    USHORT RestoreValues[6];
  126.  
  127.    WinQueryWindowPos(hWndFrame, &Swp);
  128.    RestoreValues[0] = WinQueryWindowUShort(hWndFrame, QWS_XRESTORE);
  129.    RestoreValues[1] = WinQueryWindowUShort(hWndFrame, QWS_YRESTORE);
  130.    RestoreValues[2] = WinQueryWindowUShort(hWndFrame, QWS_CXRESTORE);
  131.    RestoreValues[3] = WinQueryWindowUShort(hWndFrame, QWS_CYRESTORE);
  132.    RestoreValues[4] = WinQueryWindowUShort(hWndFrame, QWS_XMINIMIZE);
  133.    RestoreValues[5] = WinQueryWindowUShort(hWndFrame, QWS_YMINIMIZE);
  134.  
  135.    hab = WinQueryAnchorBlock(hWndFrame);
  136.    WinLoadString(hab, 0, ID_INIPATH, sizeof(szIniPath), szIniPath);
  137.  
  138.    if ((hMyHini = PrfOpenProfile(hab, szIniPath))!=NULLHANDLE)
  139.       {
  140.       PrfWriteProfileData(hMyHini,
  141.                           "App",
  142.                           "WindowSize",
  143.                           (PVOID)&Swp,
  144.                           sizeof(Swp));
  145.       PrfWriteProfileData(hMyHini,
  146.                           "App",
  147.                           "RestoreValues",
  148.                           (PVOID)&RestoreValues,
  149.                           sizeof(RestoreValues));
  150.       }
  151.    PrfCloseProfile(hMyHini);
  152.  
  153.    return;
  154. }
  155.