Annotation of pmsdk/samples/petzold/chap09/poepoem.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.