home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prog_pm / chap07 / sysvals4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-01-09  |  8.3 KB  |  245 lines

  1. /*--------------------------------------------------------
  2.    SYSVALS4.C -- System Values Display Program using AVIO
  3.   --------------------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #define INCL_VIO
  8. #define INCL_AVIO
  9. #include <os2.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "sysvals.h"
  13.  
  14. #define MAXWIDTH 60
  15.  
  16. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  17.  
  18. HAB  hab ;
  19.  
  20. int main (void)
  21.      {
  22.      static CHAR  szClientClass [] = "SysVals4" ;
  23.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
  24.                                  FCF_SIZEBORDER    | FCF_MINMAX   |
  25.                                  FCF_SHELLPOSITION | FCF_TASKLIST |
  26.                                  FCF_VERTSCROLL    | FCF_HORZSCROLL ;
  27.      HMQ          hmq ;
  28.      HWND         hwndFrame, hwndClient ;
  29.      QMSG         qmsg ;
  30.  
  31.      hab = WinInitialize (0) ;
  32.      hmq = WinCreateMsgQueue (hab, 0) ;
  33.  
  34.      WinRegisterClass (hab, szClientClass, ClientWndProc, 0L, 0) ;
  35.  
  36.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  37.                                      &flFrameFlags, szClientClass, NULL,
  38.                                      0L, NULL, 0, &hwndClient) ;
  39.  
  40.      WinSendMsg (hwndFrame, WM_SETICON,
  41.                  WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
  42.                  NULL) ;
  43.  
  44.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  45.           WinDispatchMsg (hab, &qmsg) ;
  46.  
  47.      WinDestroyWindow (hwndFrame) ;
  48.      WinDestroyMsgQueue (hmq) ;
  49.      WinTerminate (hab) ;
  50.      return 0 ;
  51.      }
  52.  
  53. BYTE RgbToVioColor (COLOR clrRgb)
  54.      {
  55.      BYTE bIrgb ;
  56.      RGB  rgb ;
  57.  
  58.      rgb = MAKETYPE (clrRgb, RGB) ;
  59.  
  60.      if (rgb.bBlue  >= 0x80) bIrgb |= '\x01' ;
  61.      if (rgb.bGreen >= 0x80) bIrgb |= '\x02' ;
  62.      if (rgb.bRed   >= 0x80) bIrgb |= '\x04' ;
  63.  
  64.      if (rgb.bBlue >= 0xC0 || rgb.bGreen >= 0xC0 || rgb.bRed >= 0xC0)
  65.           bIrgb |= 8 ;
  66.  
  67.      if (bIrgb == 0 && rgb.bBlue >= 0x40 && rgb.bGreen >= 0x40 &&
  68.                        rgb.bRed  >= 0x40)
  69.           bIrgb = 8 ;
  70.  
  71.      return bIrgb ;
  72.      }
  73.  
  74. BYTE ConstructDefaultAttribute (VOID)
  75.      {
  76.      return RgbToVioColor (
  77.                  WinQuerySysColor (HWND_DESKTOP, SYSCLR_WINDOW, 0L)) << 4 |
  78.             RgbToVioColor (
  79.                  WinQuerySysColor (HWND_DESKTOP, SYSCLR_WINDOWTEXT, 0L)) ;
  80.      }
  81.  
  82. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  83.      {
  84.      static BYTE   bBlankCell [2] = " " ;
  85.      static HVPS   hvps ;
  86.      static HWND   hwndHscroll, hwndVscroll ;
  87.      static HPS    hps ;
  88.      static SHORT  sHscrollPos, sVscrollPos,
  89.                    cxChar, cyChar, cxClient, cyClient ;
  90.      CHAR          szBuffer [80] ;
  91.      HDC           hdc ;
  92.      SIZEL         sizl ;
  93.      USHORT        usRow ;
  94.  
  95.      switch (msg)
  96.           {
  97.           case WM_CREATE:
  98.                hdc = WinOpenWindowDC (hwnd) ;
  99.  
  100.                sizl.cx = sizl.cy = 0 ;
  101.                hps = GpiCreatePS (hab, hdc, &sizl, PU_PELS    | GPIF_DEFAULT |
  102.                                                    GPIT_MICRO | GPIA_ASSOC) ;
  103.  
  104.                VioCreatePS (&hvps, NUMLINES, MAXWIDTH, 0, 1, NULL) ;
  105.                VioAssociate (hdc, hvps) ;
  106.                VioGetDeviceCellSize (&cyChar, &cxChar, hvps) ;
  107.  
  108.                bBlankCell[1] = ConstructDefaultAttribute () ;
  109.                VioScrollUp (0, 0, -1, -1, -1, bBlankCell, hvps) ;
  110.  
  111.                for (usRow = 0 ; usRow < NUMLINES ; usRow++)
  112.                     VioWrtCharStr (szBuffer,
  113.                                    sprintf (szBuffer, "%-20s%-35s%5ld",
  114.                                             sysvals[usRow].szIdentifier,
  115.                                             sysvals[usRow].szDescription,
  116.                                             WinQuerySysValue (HWND_DESKTOP,
  117.                                             sysvals[usRow].sIndex)),
  118.                                    usRow, 0, hvps) ;
  119.  
  120.                hwndHscroll = WinWindowFromID (
  121.                                    WinQueryWindow (hwnd, QW_PARENT, FALSE),
  122.                                    FID_HORZSCROLL) ;
  123.  
  124.                WinSendMsg (hwndHscroll, SBM_SETSCROLLBAR,
  125.                                         MPFROM2SHORT (sHscrollPos, 0),
  126.                                         MPFROM2SHORT (0, MAXWIDTH - 1)) ;
  127.  
  128.                hwndVscroll = WinWindowFromID (
  129.                                    WinQueryWindow (hwnd, QW_PARENT, FALSE),
  130.                                    FID_VERTSCROLL) ;
  131.  
  132.                WinSendMsg (hwndVscroll, SBM_SETSCROLLBAR,
  133.                                         MPFROM2SHORT (sVscrollPos, 0),
  134.                                         MPFROM2SHORT (0, NUMLINES - 1)) ;
  135.                return 0 ;
  136.  
  137.           case WM_SIZE:
  138.                cxClient = SHORT1FROMMP (mp2) ;
  139.                cyClient = SHORT2FROMMP (mp2) ;
  140.  
  141.                WinDefAVioWindowProc (hwnd, msg, mp1, mp2) ;
  142.                return 0 ;
  143.  
  144.           case WM_HSCROLL:
  145.                switch (SHORT2FROMMP (mp2))
  146.                     {
  147.                     case SB_LINELEFT:
  148.                          sHscrollPos -= 1 ;
  149.                          break ;
  150.  
  151.                     case SB_LINERIGHT:
  152.                          sHscrollPos += 1 ;
  153.                          break ;
  154.  
  155.                     case SB_PAGELEFT:
  156.                          sHscrollPos -= 8 ;
  157.                          break ;
  158.  
  159.                     case SB_PAGERIGHT:
  160.                          sHscrollPos += 8 ;
  161.                          break ;
  162.  
  163.                     case SB_SLIDERPOSITION:
  164.                          sHscrollPos = SHORT1FROMMP (mp2) ;
  165.                          break ;
  166.                     }
  167.                sHscrollPos = max (0, min (sHscrollPos, MAXWIDTH - 1)) ;
  168.  
  169.                if (sHscrollPos != SHORT1FROMMR (WinSendMsg (hwndHscroll,
  170.                                        SBM_QUERYPOS, NULL, NULL)))
  171.                     {
  172.                     VioSetOrg (sVscrollPos, sHscrollPos, hvps) ;
  173.  
  174.                     WinSendMsg (hwndHscroll, SBM_SETPOS,
  175.                                 MPFROM2SHORT (sHscrollPos, 0), NULL) ;
  176.                     }
  177.                return 0 ;
  178.  
  179.           case WM_VSCROLL:
  180.                switch (SHORT2FROMMP (mp2))
  181.                     {
  182.                     case SB_LINEUP:
  183.                          sVscrollPos -= 1 ;
  184.                          break ;
  185.  
  186.                     case SB_LINEDOWN:
  187.                          sVscrollPos += 1 ;
  188.                          break ;
  189.  
  190.                     case SB_PAGEUP:
  191.                          sVscrollPos -= cyClient / cyChar ;
  192.                          break ;
  193.  
  194.                     case SB_PAGEDOWN:
  195.                          sVscrollPos += cyClient / cyChar ;
  196.                          break ;
  197.  
  198.                     case SB_SLIDERPOSITION:
  199.                          sVscrollPos = SHORT1FROMMP (mp2) ;
  200.                          break ;
  201.                     }
  202.                sVscrollPos = max (0, min (sVscrollPos, NUMLINES - 1)) ;
  203.  
  204.                if (sVscrollPos != SHORT1FROMMR (WinSendMsg (hwndVscroll,
  205.                                        SBM_QUERYPOS, NULL, NULL)))
  206.                     {
  207.                     VioSetOrg (sVscrollPos, sHscrollPos, hvps) ;
  208.  
  209.                     WinSendMsg (hwndVscroll, SBM_SETPOS,
  210.                                 MPFROM2SHORT (sVscrollPos, 0), NULL) ;
  211.                     }
  212.                return 0 ;
  213.  
  214.           case WM_CHAR:
  215.                switch (CHARMSG(&msg)->vkey)
  216.                     {
  217.                     case VK_LEFT:
  218.                     case VK_RIGHT:
  219.                          return WinSendMsg (hwndHscroll, msg, mp1, mp2) ;
  220.                     case VK_UP:
  221.                     case VK_DOWN:
  222.                     case VK_PAGEUP:
  223.                     case VK_PAGEDOWN:
  224.                          return WinSendMsg (hwndVscroll, msg, mp1, mp2) ;
  225.                     }
  226.                break ;
  227.  
  228.           case WM_PAINT:
  229.                WinBeginPaint (hwnd, hps, NULL) ;
  230.                GpiErase (hps) ;
  231.  
  232.                VioShowBuf (0, MAXWIDTH * NUMLINES * 2, hvps) ;
  233.  
  234.                WinEndPaint (hps) ;
  235.                return 0 ;
  236.  
  237.           case WM_DESTROY:
  238.                VioAssociate (NULL, hvps) ;
  239.                VioDestroyPS (hvps) ;
  240.                GpiDestroyPS (hps) ;
  241.                return 0 ;
  242.           }
  243.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  244.      }
  245.