home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / VIEW.ZIP / SCROLL2.C < prev    next >
Text File  |  1989-04-02  |  6KB  |  230 lines

  1. #define INCL_PM
  2. #define INCL_DOS
  3.  
  4. #include <os2.h>
  5. #include <string.h>
  6. #include "scroll2.h"
  7.  
  8. MRESULT EXPENTRY ScrollWndProc(HWND,USHORT,MPARAM,MPARAM);
  9. VOID GetFontData(HWND,SHORT *,SHORT *,SHORT *);
  10. VOID  ReadTextFile(VOID);
  11. SHORT GetScrollBar(SHORT,SHORT,SHORT,SHORT,SHORT);
  12. VOID DisplayText(HPS,SHORT,SHORT,SHORT,SHORT,SHORT);
  13. CHAR szDisplay[50][81];
  14. SHORT TotalLines = 0;
  15.  
  16. int main(void)
  17.      {
  18.      static CHAR szClass [] = "Scroll2";
  19.      HAB         hab;
  20.      HMQ         hmq;
  21.      HWND        hwndClient, hwndFrame;
  22.      QMSG        qmsg;
  23.      ULONG       ctlData =  FCF_TITLEBAR | FCF_SYSMENU
  24.                   | FCF_SIZEBORDER | FCF_MINMAX | FCF_VERTSCROLL
  25.                   | FCF_SHELLPOSITION | FCF_TASKLIST;
  26.  
  27.  
  28.      hab = WinInitialize(NULL);
  29.      hmq = WinCreateMsgQueue(hab, 0);
  30.  
  31.      WinRegisterClass(hab, szClass, ScrollWndProc, CS_SIZEREDRAW, 0);
  32.  
  33.      hwndFrame = WinCreateStdWindow(
  34.                                HWND_DESKTOP,
  35.                                WS_VISIBLE,
  36.                                &ctlData,
  37.                                szClass,
  38.                                NULL,
  39.                                0L,
  40.                                NULL,
  41.                                0,
  42.                                &hwndClient);
  43.  
  44.      while(WinGetMsg(hab, &qmsg, NULL, 0, 0))
  45.           WinDispatchMsg(hab, &qmsg);
  46.  
  47.      WinDestroyWindow(hwndFrame);
  48.      WinDestroyMsgQueue(hmq);
  49.      WinTerminate(hab);
  50.  
  51.      return(0);
  52.      }
  53.  
  54. MRESULT EXPENTRY ScrollWndProc(hwnd, msg, mp1, mp2)
  55. HWND hwnd;
  56. USHORT msg;
  57. MPARAM mp1, mp2;
  58. {
  59.  
  60.      HPS  hps;
  61.      SHORT  i=0;
  62.      static HWND   hwndVscroll;
  63.      static SHORT  sVscroll=0, cx, cy;
  64.      static SHORT  AveChar, MaxBase, MaxDesc;
  65.  
  66.  
  67.      switch(msg)
  68.           {
  69.           case WM_CREATE:
  70.                GetFontData(hwnd, &AveChar, &MaxBase, &MaxDesc);
  71.                ReadTextFile();
  72.                hwndVscroll = WinWindowFromID(
  73.                                    WinQueryWindow(hwnd, QW_PARENT, FALSE),
  74.                                    FID_VERTSCROLL);
  75.  
  76.                WinSendMsg(hwndVscroll, SBM_SETSCROLLBAR,
  77.                                    MPFROM2SHORT(sVscroll, 0),
  78.                                    MPFROM2SHORT(0, TotalLines - 1));
  79.                return(FALSE);
  80.  
  81.  
  82.           case WM_SIZE:
  83.                cx = SHORT1FROMMP(mp2);
  84.                cy = SHORT2FROMMP(mp2);
  85.                return(NULL);
  86.  
  87.           case WM_VSCROLL:
  88.                sVscroll = GetScrollBar(sVscroll, SHORT2FROMMP(mp2),
  89.                                        SHORT1FROMMP(mp2), cx, AveChar);
  90.  
  91.                WinSendMsg(hwndVscroll, SBM_SETPOS,
  92.                           MPFROM2SHORT(sVscroll, 0), NULL);
  93.                WinInvalidateRect(hwnd, NULL, FALSE);
  94.                return(NULL);
  95.  
  96.           case WM_PAINT:
  97.                hps = WinBeginPaint(hwnd, NULL, NULL);
  98.                GpiErase(hps);
  99.                DisplayText(hps, cy, sVscroll,
  100.                               AveChar, MaxBase, MaxDesc);
  101.                WinEndPaint(hps);
  102.                return(NULL);
  103.           }
  104.      return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  105. }
  106.  
  107.  
  108. VOID GetFontData(hwnd, AveChar, MaxBase, MaxDesc)
  109. HWND hwnd;
  110. SHORT *AveChar, *MaxBase, *MaxDesc;
  111. {
  112.      HPS hps;
  113.  
  114.      FONTMETRICS   fm;
  115.  
  116.      hps = WinGetPS(hwnd);
  117.      GpiQueryFontMetrics(hps,(LONG) sizeof fm, &fm);
  118.      *AveChar =(SHORT) fm.lAveCharWidth;
  119.      *MaxBase =(SHORT) fm.lMaxBaselineExt;
  120.      *MaxDesc =(SHORT) fm.lMaxDescender;
  121.      WinReleasePS(hps);
  122. }
  123.  
  124. SHORT GetScrollBar(sVscroll, sScroll, sSlider, cy, AveChar)
  125. SHORT sVscroll, sScroll, sSlider, cy, AveChar;
  126. {
  127.  
  128.        switch(sScroll)
  129.          {
  130.             case SB_SLIDERPOSITION:
  131.                  sVscroll = sSlider;
  132.                  break;
  133.  
  134.             case SB_PAGEDOWN:
  135.                  sVscroll += cy / AveChar;
  136.                  break;
  137.  
  138.             case SB_PAGEUP:
  139.                  sVscroll -= cy / AveChar;
  140.                  break;
  141.  
  142.             case SB_LINEUP:
  143.                  sVscroll--;
  144.                  break;
  145.  
  146.             case SB_LINEDOWN:
  147.                  sVscroll++;
  148.                  break;
  149.  
  150.          }
  151.  
  152.        return(sVscroll);
  153. }
  154.  
  155.  
  156. VOID ReadTextFile()
  157. {
  158.      CHAR     szText[50][BUFLENGTH+1];
  159.      USHORT   usAction, usBytes;
  160.      HFILE    hf;
  161.      ULONG    ulSize = 0;
  162.      SHORT    i=0, j=0, k=0, n=0;
  163.  
  164.  
  165.      DosOpen("TESTFILE", &hf, &usAction, ulSize,
  166.                      ATTRIBUTE, OPENFLAG, OPENMODE, 0L);
  167.  
  168.      do {
  169.           DosRead(hf, szText[i], BUFLENGTH, &usBytes);
  170.           szText[i][usBytes] = 0;
  171.           i++;
  172.      } while(usBytes == BUFLENGTH);
  173.      TotalLines = i;
  174.      i=0;
  175.  
  176.      while(j <= TotalLines )
  177.  
  178.           switch(szText[j][i])
  179.              {
  180.                  case 10:
  181.                    szDisplay[k][n] = 0;
  182.                    k++;
  183.                    n=0;
  184.                    i++;
  185.                    break;
  186.  
  187.                  case 13:
  188.                    i++;
  189.                    break;
  190.  
  191.                  case 0:
  192.                     j++;
  193.                     i=0;
  194.                     break;
  195.  
  196.                  default:
  197.                     szDisplay[k][n] = szText[j][i];
  198.                     i++;
  199.                     n++;
  200.              }
  201.  
  202.      TotalLines = k;
  203.  
  204.      DosClose(hf);
  205. }
  206.  
  207.  
  208. VOID DisplayText(hps, cy, sVscroll, AveChar, MaxBase, MaxDesc)
  209. HPS hps;
  210. SHORT cy, sVscroll;
  211. SHORT AveChar, MaxBase, MaxDesc;
  212. {
  213.  
  214.       SHORT i, sNewPos;
  215.       POINTL ptl;
  216.  
  217.       sNewPos = (sVscroll < 0) ? 0 : sVscroll;
  218.  
  219.       for(i=0; i < TotalLines; i++)
  220.         {
  221.             ptl.x = AveChar;
  222.             ptl.y = cy - MaxBase * (i + 1 - sNewPos) + MaxDesc;
  223.  
  224.             GpiCharStringAt(hps, &ptl,
  225.                             (LONG) strlen(szDisplay[i]),
  226.                             szDisplay[i]);
  227.         }
  228. }
  229.  
  230.