home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk11 / petzold / chap10 / freemem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-20  |  4.2 KB  |  142 lines

  1. /*----------------------------------
  2.    FREEMEM.C -- Free Memory Display 
  3.   ----------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #define INCL_DOS
  8. #include <os2.h>
  9. #include <string.h>
  10.  
  11. #define ID_TIMER 1
  12.  
  13. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  14. VOID    SizeTheWindow (HWND) ;
  15.  
  16. int main (void)
  17.      {
  18.      static CHAR  szClientClass[] = "FreeMem" ;
  19.      static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU  |
  20.                                  FCF_BORDER   | FCF_TASKLIST ;
  21.      HAB          hab ;
  22.      HMQ          hmq ;
  23.      HWND         hwndFrame, hwndClient ;
  24.      QMSG         qmsg ;
  25.  
  26.      hab = WinInitialize (0) ;
  27.      hmq = WinCreateMsgQueue (hab, 0) ;
  28.  
  29.      WinRegisterClass (hab, szClientClass, ClientWndProc, 0L, 0) ;
  30.  
  31.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  32.                                      &flFrameFlags, szClientClass, NULL,
  33.                      0L, NULL, 0, &hwndClient) ;
  34.      SizeTheWindow (hwndFrame) ;
  35.  
  36.      if (WinStartTimer (hab, hwndClient, ID_TIMER, 1000))
  37.           {
  38.           while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  39.                WinDispatchMsg (hab, &qmsg) ;
  40.  
  41.           WinStopTimer (hab, hwndClient, ID_TIMER) ;
  42.           }
  43.      else
  44.           WinMessageBox (HWND_DESKTOP, hwndClient,
  45.                          "Too many clocks or timers",
  46.                          szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
  47.  
  48.      WinDestroyWindow (hwndFrame) ;
  49.      WinDestroyMsgQueue (hmq) ;
  50.      WinTerminate (hab) ;
  51.      return 0 ;
  52.      }
  53.  
  54. VOID SizeTheWindow (HWND hwndFrame)
  55.      {
  56.      static CHAR szText [] = "1,234,567,890 bytes" ;
  57.      HPS         hps ;
  58.      POINTL      aptl[TXTBOX_COUNT] ;
  59.      RECTL       rcl ;
  60.  
  61.      hps = WinGetPS (hwndFrame) ;
  62.      GpiQueryTextBox (hps, sizeof szText - 1L, szText, TXTBOX_COUNT, aptl) ;
  63.      WinReleasePS (hps) ;
  64.  
  65.      rcl.yBottom = 0 ;
  66.      rcl.yTop    = 3 * (aptl[TXTBOX_TOPLEFT].y -
  67.                         aptl[TXTBOX_BOTTOMLEFT].y) / 2 ;
  68.      rcl.xLeft   = 0 ;
  69.      rcl.xRight  = (sizeof szText + 1L) * (aptl[TXTBOX_BOTTOMRIGHT].x -
  70.                    aptl[TXTBOX_BOTTOMLEFT].x) / (sizeof szText - 1L) ;
  71.  
  72.      WinCalcFrameRect (hwndFrame, &rcl, FALSE) ;
  73.  
  74.      WinSetWindowPos (hwndFrame, NULL, (SHORT) rcl.xLeft, (SHORT) rcl.yBottom,
  75.                       (SHORT) (rcl.xRight - rcl.xLeft),
  76.                       (SHORT) (rcl.yTop - rcl.yBottom), SWP_SIZE | SWP_MOVE) ;
  77.      }
  78.  
  79. VOID FormatNumber (CHAR *pchResult, ULONG ulValue)
  80.      {
  81.      BOOL  fDisplay = FALSE ;
  82.      SHORT sDigit ;
  83.      ULONG ulQuotient, ulDivisor = 1000000000L ;
  84.  
  85.      for (sDigit = 0 ; sDigit < 10 ; sDigit++)
  86.           {
  87.           ulQuotient = ulValue / ulDivisor ;
  88.  
  89.           if (fDisplay || ulQuotient > 0 || sDigit == 9)
  90.                {
  91.                fDisplay = TRUE ;
  92.  
  93.                *pchResult++ = (CHAR) ('0' + ulQuotient) ;
  94.  
  95.                if ((sDigit % 3 == 0) && sDigit != 9)
  96.                     *pchResult++ = ',' ;
  97.                }
  98.           ulValue -= ulQuotient * ulDivisor ;
  99.           ulDivisor /= 10 ;
  100.           }
  101.      *pchResult = '\0' ;
  102.      }
  103.  
  104. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  105.      {
  106.      static RECTL rcl ;
  107.      static ULONG ulFreeMem, ulPrevMem ;
  108.      CHAR         szBuffer [24] ;
  109.      HPS          hps;
  110.  
  111.      switch (msg)
  112.           {
  113.           case WM_SIZE:
  114.                WinQueryWindowRect (hwnd, &rcl) ;
  115.                return 0 ;               
  116.  
  117.           case WM_TIMER:
  118.                DosMemAvail (&ulFreeMem) ;
  119.  
  120.                if (ulFreeMem != ulPrevMem)
  121.                     {
  122.                     WinInvalidateRect (hwnd, NULL, FALSE) ;
  123.                     ulPrevMem = ulFreeMem ;
  124.                     }
  125.                return 0 ;
  126.  
  127.           case WM_PAINT:
  128.                hps = WinBeginPaint (hwnd, NULL, NULL) ;
  129.  
  130.                FormatNumber (szBuffer, ulFreeMem) ;
  131.                strcat (szBuffer, " bytes") ;
  132.  
  133.                WinDrawText (hps, -1, szBuffer, &rcl, 
  134.                             CLR_NEUTRAL, CLR_BACKGROUND,
  135.                             DT_CENTER | DT_VCENTER | DT_ERASERECT) ;
  136.  
  137.                WinEndPaint (hps) ;
  138.                return 0 ;
  139.           }
  140.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  141.      }
  142.