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

  1. /*--------------------------------------------------------
  2.    POEPOEM.C -- Demonstrates Programmer-Defined Resources
  3.   --------------------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #define INCL_DOS
  8. #include <os2.h>
  9. #include <stdlib.h>
  10. #include "poepoem.h"
  11.  
  12. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  13.  
  14. int main (void)
  15.      {
  16.      static CHAR  szClientClass [10] ;
  17.      static CHAR  szTitleBar [40] ;
  18.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
  19.                                  FCF_SIZEBORDER    | FCF_MINMAX   |
  20.                                  FCF_SHELLPOSITION | FCF_TASKLIST |
  21.                                  FCF_VERTSCROLL    | FCF_ICON ;
  22.      HAB          hab ;
  23.      HMQ          hmq ;
  24.      HWND         hwndFrame, hwndClient ;
  25.      QMSG         qmsg ;
  26.  
  27.      hab = WinInitialize (0) ;
  28.      hmq = WinCreateMsgQueue (hab, 0) ;
  29.  
  30.      WinLoadString (hab, NULL, IDS_CLASS, sizeof szClientClass, szClientClass);
  31.      WinLoadString (hab, NULL, IDS_TITLE, sizeof szTitleBar,    szTitleBar) ;
  32.  
  33.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  34.  
  35.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  36.                                      &flFrameFlags, szClientClass, szTitleBar,
  37.                                      0L, NULL, ID_RESOURCE, &hwndClient) ;
  38.  
  39.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  40.           WinDispatchMsg (hab, &qmsg) ;
  41.  
  42.      WinDestroyWindow (hwndFrame) ;
  43.      WinDestroyMsgQueue (hmq) ;
  44.      WinTerminate (hab) ;
  45.      return 0 ;
  46.      }
  47.  
  48. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  49.      {
  50.      static HWND   hwndScroll ;
  51.      static PCHAR  pResource ;
  52.      static SEL    selResource ;
  53.      static SHORT  cxClient, cyClient, cxChar, cyChar, cyDesc,
  54.                    sScrollPos, sNumLines ;
  55.      FONTMETRICS   fm ;
  56.      HPS           hps ;
  57.      PCHAR         pText ;
  58.      POINTL        ptl ;
  59.      SHORT         sLineLength, sLine ;
  60.      ULONG         ulSegSize ;
  61.      
  62.      switch (msg)
  63.           {
  64.           case WM_CREATE:
  65.  
  66.                     /*-----------------------------------------
  67.                        Load the resource, get size and address
  68.                       -----------------------------------------*/
  69.  
  70.                DosGetResource (NULL, IDT_TEXT, IDT_POEM, &selResource) ;
  71.                DosSizeSeg (selResource, &ulSegSize) ;
  72.                pResource = MAKEP (selResource, 0) ;
  73.  
  74.                     /*-----------------------------------------------
  75.                        Determine how many text lines are in resource
  76.                       -----------------------------------------------*/
  77.  
  78.                pText = pResource ;
  79.  
  80.                while (pText - pResource < (USHORT) ulSegSize)
  81.                     {
  82.                     if (*pText == '\0' || *pText == '\x1A')
  83.                          break ;
  84.  
  85.                     if (*pText == '\r')
  86.                          sNumLines ++ ;
  87.  
  88.                     pText++ ;
  89.                     }
  90.  
  91.                     /*------------------------------------------
  92.                        Initialize scroll bar range and position
  93.                       ------------------------------------------*/
  94.  
  95.                hwndScroll = WinWindowFromID (
  96.                                    WinQueryWindow (hwnd, QW_PARENT, FALSE),
  97.                                    FID_VERTSCROLL) ;
  98.  
  99.                WinSendMsg (hwndScroll, SBM_SETSCROLLBAR,
  100.                                        MPFROM2SHORT (sScrollPos, 0),
  101.                                        MPFROM2SHORT (0, sNumLines - 1)) ;
  102.  
  103.                     /*----------------------
  104.                        Query character size
  105.                       ----------------------*/
  106.  
  107.                hps = WinGetPS (hwnd) ;
  108.  
  109.                GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
  110.                cxChar = (SHORT) fm.lAveCharWidth ;
  111.                cyChar = (SHORT) fm.lMaxBaselineExt ;
  112.                cyDesc = (SHORT) fm.lMaxDescender ;
  113.  
  114.                WinReleasePS (hps) ;
  115.                return 0 ;
  116.  
  117.           case WM_SIZE:
  118.                cxClient = SHORT1FROMMP (mp2) ;
  119.                cyClient = SHORT2FROMMP (mp2) ;
  120.                return 0 ;
  121.  
  122.           case WM_CHAR:
  123.                return WinSendMsg (hwndScroll, msg, mp1, mp2) ;
  124.  
  125.           case WM_VSCROLL:
  126.                switch (SHORT2FROMMP (mp2))
  127.                     {
  128.                     case SB_LINEUP:
  129.                          sScrollPos -= 1 ;
  130.                          break ;
  131.  
  132.                     case SB_LINEDOWN:
  133.                          sScrollPos += 1 ;
  134.                          break ;
  135.  
  136.                     case SB_PAGEUP:
  137.                          sScrollPos -= cyClient / cyChar ;
  138.                          break ;
  139.  
  140.                     case SB_PAGEDOWN:
  141.                          sScrollPos += cyClient / cyChar ;
  142.                          break ;
  143.  
  144.                     case SB_SLIDERPOSITION:
  145.                          sScrollPos = SHORT1FROMMP (mp2) ;
  146.                          break ;
  147.                     }
  148.                sScrollPos = max (0, min (sScrollPos, sNumLines - 1)) ;
  149.  
  150.                if (sScrollPos != (SHORT) WinSendMsg (hwndScroll,
  151.                                                      SBM_QUERYPOS, 0L, 0L))
  152.                     {
  153.                     WinSendMsg (hwndScroll, SBM_SETPOS,
  154.                                 MPFROM2SHORT (sScrollPos, 0), NULL) ;
  155.                     WinInvalidateRect (hwnd, NULL, FALSE) ;
  156.                     }
  157.                return 0 ;
  158.  
  159.           case WM_PAINT:
  160.                hps = WinBeginPaint (hwnd, NULL, NULL) ;
  161.                GpiErase (hps) ;
  162.  
  163.                pText = pResource ;
  164.  
  165.                for (sLine = 0 ; sLine < sNumLines ; sLine++)
  166.                     {
  167.                     sLineLength = 0 ;
  168.  
  169.                     while (pText [sLineLength] != '\r')
  170.                          sLineLength ++ ;
  171.  
  172.                     ptl.x = cxChar ;
  173.                     ptl.y = cyClient - cyChar * (sLine + 1 - sScrollPos)
  174.                                      + cyDesc ;
  175.                     
  176.                     GpiCharStringAt (hps, &ptl, (LONG) sLineLength, pText) ;
  177.  
  178.                     pText += sLineLength + 2 ;
  179.                     }
  180.                WinEndPaint (hps) ;
  181.                return 0 ;
  182.  
  183.           case WM_DESTROY:
  184.                DosFreeSeg (selResource) ;
  185.                return 0 ;
  186.           }
  187.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  188.      }
  189.