PoePoem.mod: Translation to XDS Modula-2

Last updated: 18. 1.1998, 14:38

<* +M2EXTENSIONS *>
MODULE PoePoem;
(*-------------------------------------------------
   POEPOEM.C       --- Demonstrates User-Defined Resource
                   (c) Charles Petzold, 1996
   PoePoem.mod     --- translation to XDS Modula-2
                   (c) Peter Stadler,   1997
  -------------------------------------------------*)






IMPORT h2d_PoePoem;
IMPORT Windows;



IMPORT SYSTEM;

TYPE
  TEXT         = ARRAY[0..4000] OF CHAR;
  PTEXT        = POINTER TO TEXT;
VAR
  szAppName    : ARRAY[0..9] OF CHAR;
  szCaption    : ARRAY[0..34] OF CHAR;
  hInst        : Windows.HINSTANCE;
  hwnd         : Windows.HWND;
  msg          : Windows.MSG;
  wc           : Windows.WNDCLASSEX;

  pText        : PTEXT;
  hResource    : Windows.HGLOBAL;
  hScroll      : Windows.HWND;
  iPosition    : INTEGER;
  cxChar       : INTEGER;
  cyChar       : INTEGER;
  cyClient     : INTEGER;
  iNumLines    : INTEGER;
  xScroll      : INTEGER;

(*++++*****************************************************************)
PROCEDURE MaxInt (a,b : INTEGER) : INTEGER;
(**********************************************************************)
BEGIN
  IF(a>b) THEN
    RETURN a;
  ELSE
    RETURN b;
  END;
END MaxInt;
(*++++*****************************************************************)
PROCEDURE MinInt (a,b : INTEGER) : INTEGER;
(**********************************************************************)
BEGIN
  IF(a>b) THEN
    RETURN b;
  ELSE
    RETURN a;
  END;
END MinInt;




    

    

(*++++*****************************************************************)
PROCEDURE [Windows.CALLBACK] WndProc (hwnd        : Windows.HWND;
(**********************************************************************)
                                      iMsg        : Windows.UINT;
                                      wParam      : Windows.WPARAM;
                                      lParam      : Windows.LPARAM) : Windows.LRESULT;
VAR
   szPoemRes       :  ARRAY[0..14] OF CHAR;
   hdc             :  Windows.HDC;
   ps              :  Windows.PAINTSTRUCT;
   rect            :  Windows.RECT;
   tm              :  Windows.TEXTMETRIC;
   nH              :  INTEGER;
   i               :  CARDINAL;
BEGIN
     CASE (iMsg) OF
          | Windows.WM_CREATE :
               hdc := Windows.GetDC (hwnd);
               Windows.GetTextMetrics (hdc, tm);
               cxChar := tm.tmAveCharWidth;
               cyChar := tm.tmHeight + tm.tmExternalLeading;
               Windows.ReleaseDC (hwnd, hdc);

               xScroll := Windows.GetSystemMetrics (Windows.SM_CXVSCROLL);

               hScroll := Windows.CreateWindow ("scrollbar", "",
                              Windows.WS_CHILD + Windows.WS_VISIBLE + Windows.SBS_VERT,
                              0, 0, 0, 0,
                              hwnd, SYSTEM.CAST(Windows.HMENU,1), hInst, NIL);

               Windows.LoadString (hInst, h2d_PoePoem.IDS_POEMRES, szPoemRes, SIZE (szPoemRes));

               hResource := Windows.LoadResource (hInst,
                           Windows.FindResource (hInst, szPoemRes, "TEXT"));

               pText := SYSTEM.CAST(PTEXT,Windows.LockResource (hResource));

               iNumLines := 0;
               FOR i := 0 TO LENGTH(pText^) DO
                  IF(pText^[i] = CHR(13)) AND(pText^[i+1]= CHR(10)) THEN
                    INC(iNumLines);
                 END;
               END;
               Windows.SetScrollRange (hScroll, Windows.SB_CTL, 0, iNumLines, FALSE);
               Windows.SetScrollPos   (hScroll, Windows.SB_CTL, 0, FALSE);
               RETURN 0;

          | Windows.WM_SIZE :
                IF(cyClient = SYSTEM.CAST(INTEGER,Windows.HIWORD(lParam))) THEN
                   nH := 1;
                ELSE
                   nH := 0;
                END;
                Windows.MoveWindow (hScroll, VAL(INTEGER,Windows.LOWORD (lParam)) - xScroll, 0,
                    xScroll, nH, TRUE);
               Windows.SetFocus (hwnd);
               RETURN 0;

          | Windows.WM_SETFOCUS :
               Windows.SetFocus (hScroll);
               RETURN 0;

          | Windows.WM_VSCROLL :
               CASE SYSTEM.CAST(Windows.SB_ENUM,wParam) OF


                    | Windows.SB_TOP :
                         iPosition := 0;
                    | Windows.SB_BOTTOM :
                         iPosition := iNumLines;
                    | Windows.SB_LINEUP :
                         iPosition := iPosition - 1;
                    | Windows.SB_LINEDOWN :
                         iPosition := iPosition + 1;
                    | Windows.SB_PAGEUP :
                         iPosition := iPosition - cyClient DIV cyChar;
                    | Windows.SB_PAGEDOWN :
                         iPosition := iPosition + cyClient DIV cyChar;
                    | Windows.SB_THUMBPOSITION :
                         iPosition := Windows.LOWORD (lParam);
               ELSE
               END;
               iPosition := MaxInt (0, MinInt (iPosition, iNumLines));

               IF (iPosition # Windows.GetScrollPos (hScroll, Windows.SB_CTL)) THEN
                    Windows.SetScrollPos (hScroll, Windows.SB_CTL, iPosition, TRUE);
                    Windows.InvalidateRect (hwnd, NIL, TRUE);
               END;
               RETURN 0;

          | Windows.WM_PAINT :
               hdc := Windows.BeginPaint (hwnd, ps);

               pText := SYSTEM.CAST(PTEXT, Windows.LockResource (hResource));

               Windows.GetClientRect (hwnd, rect);
               rect.left := rect.left + cxChar;
               rect.top  := rect.top + cyChar * (1 - iPosition);
               Windows.DrawText (hdc, pText^, -1, rect, Windows.DT_EXTERNALLEADING);

               Windows.EndPaint (hwnd, ps);
               RETURN 0;

          | Windows.WM_DESTROY :
               Windows.FreeResource (hResource);
               Windows.PostQuitMessage (0);
               RETURN 0;
     ELSE
          RETURN Windows.DefWindowProc (hwnd, iMsg, wParam, lParam);
     END;
END WndProc;

(*++++*****************************************************************)
PROCEDURE InitApplication () : BOOLEAN;
(**********************************************************************)

BEGIN
  Windows.LoadString (Windows.MyInstance(), h2d_PoePoem.IDS_APPNAME, szAppName, SIZE(szAppName));
  Windows.LoadString (Windows.MyInstance(), h2d_PoePoem.IDS_CAPTION, szCaption, SIZE(szCaption));

  wc.cbSize        := SIZE(wc);
  wc.style         := Windows.CS_HREDRAW + Windows.CS_VREDRAW;
  wc.lpfnWndProc   := WndProc;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  wc.hInstance     := Windows.MyInstance();
  wc.hIcon         := Windows.LoadIcon (Windows.MyInstance(), szAppName);
  wc.hCursor       := Windows.LoadCursor (NIL, Windows.IDC_ARROW);
  wc.hbrBackground := SYSTEM.CAST(Windows.HBRUSH, Windows.GetStockObject(Windows.WHITE_BRUSH));
  wc.lpszMenuName  := NIL;
  wc.lpszClassName := SYSTEM.ADR(szAppName);
  wc.hIconSm       := Windows.LoadIcon (Windows.MyInstance(), szAppName);

  RETURN Windows.RegisterClassEx(wc)#0;
END InitApplication;
(*++++*****************************************************************)
PROCEDURE InitMainWindow () : BOOLEAN;
(**********************************************************************)
BEGIN
  hInst := Windows.MyInstance();
  hwnd := Windows.CreateWindow (szAppName,
                        szCaption,
                        Windows.WS_OVERLAPPEDWINDOW + Windows.WS_CLIPCHILDREN,
                        Windows.CW_USEDEFAULT,
                        Windows.CW_USEDEFAULT,
                        Windows.CW_USEDEFAULT,
                        Windows.CW_USEDEFAULT,
                        NIL,
                        NIL,
                        Windows.MyInstance(),
                        NIL);

  Windows.ShowWindow (hwnd, Windows.SW_SHOWDEFAULT);
  Windows.UpdateWindow (hwnd);
  RETURN TRUE;
END InitMainWindow;

BEGIN
  IF InitApplication()  AND  InitMainWindow() THEN
    WHILE (Windows.GetMessage(msg,NIL,0,0)) DO
      Windows.TranslateMessage(msg);
      Windows.DispatchMessage(msg);
    END;
  END;
END PoePoem.