home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / progwin / chap08 / poepoem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-12  |  6.0 KB  |  181 lines

  1. /*-------------------------------------------------
  2.    POEPOEM.C -- Demonstrates User-Defined Resource
  3.                 (c) Charles Petzold, 1990
  4.   -------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "poepoem.h"
  8.  
  9. long FAR PASCAL WndProc  (HWND, WORD, WORD, LONG) ;
  10.  
  11. char   szAppName [10] ;
  12. char   szCaption [35] ;
  13. HANDLE hInst ;
  14.  
  15. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  16.                     LPSTR lpszCmdLine, int nCmdShow)
  17.      {
  18.      HWND     hwnd ;
  19.      MSG      msg ;
  20.      WNDCLASS wndclass ;
  21.  
  22.      if (!hPrevInstance) 
  23.           {
  24.           LoadString (hInstance, IDS_APPNAME, szAppName, sizeof szAppName) ;
  25.           LoadString (hInstance, IDS_CAPTION, szCaption, sizeof szCaption) ;
  26.  
  27.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  28.           wndclass.lpfnWndProc   = WndProc ;
  29.           wndclass.cbClsExtra    = 0 ;
  30.           wndclass.cbWndExtra    = 0 ;
  31.           wndclass.hInstance     = hInstance ;
  32.           wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
  33.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  34.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  35.           wndclass.lpszMenuName  = NULL ;
  36.           wndclass.lpszClassName = szAppName ;
  37.  
  38.           RegisterClass (&wndclass) ;
  39.           }
  40.      else
  41.           {
  42.           GetInstanceData (hPrevInstance, szAppName, sizeof szAppName) ;
  43.           GetInstanceData (hPrevInstance, szCaption, sizeof szCaption) ;
  44.           }
  45.  
  46.      hInst = hInstance ;
  47.  
  48.      hwnd = CreateWindow (szAppName, szCaption,
  49.                           WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  50.                           CW_USEDEFAULT, CW_USEDEFAULT,
  51.                           CW_USEDEFAULT, CW_USEDEFAULT,
  52.                           NULL, NULL, hInstance, NULL) ;
  53.  
  54.      ShowWindow (hwnd, nCmdShow) ;
  55.      UpdateWindow (hwnd) ;
  56.  
  57.      while (GetMessage (&msg, NULL, 0, 0))
  58.           {
  59.           TranslateMessage (&msg) ;
  60.           DispatchMessage (&msg) ;
  61.           }
  62.      return msg.wParam ;
  63.      }
  64.  
  65. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  66.      {
  67.      static HANDLE hResource ;
  68.      static HWND   hScroll ;
  69.      static short  nPosition, cxChar, cyChar, cyClient, nNumLines, xScroll ;
  70.      char          szPoemRes [15] ;
  71.      char far      *lpText ;
  72.      HDC           hdc ;
  73.      PAINTSTRUCT   ps ;
  74.      RECT          rect ;
  75.      TEXTMETRIC    tm ;
  76.  
  77.      switch (message)
  78.           {
  79.           case WM_CREATE:
  80.                hdc = GetDC (hwnd) ;
  81.                GetTextMetrics (hdc, &tm) ;
  82.                cxChar = tm.tmAveCharWidth ;
  83.                cyChar = tm.tmHeight + tm.tmExternalLeading ;
  84.                ReleaseDC (hwnd, hdc) ;
  85.  
  86.                xScroll = GetSystemMetrics (SM_CXVSCROLL) ;
  87.  
  88.                hScroll = CreateWindow ("scrollbar", NULL,
  89.                               WS_CHILD | WS_VISIBLE | SBS_VERT,
  90.                               0, 0, 0, 0,
  91.                               hwnd, 1, hInst, NULL) ;
  92.  
  93.                LoadString (hInst, IDS_POEMRES, szPoemRes, sizeof szPoemRes) ;
  94.                hResource = LoadResource (hInst, 
  95.                            FindResource (hInst, szPoemRes, "TEXT")) ;
  96.  
  97.                lpText = LockResource (hResource) ;
  98.  
  99.                nNumLines = 0 ;
  100.  
  101.                while (*lpText != '\\' && *lpText != '\0')
  102.                     {
  103.                     if (*lpText == '\n')
  104.                          nNumLines ++ ;
  105.                     lpText = AnsiNext (lpText) ;
  106.                     }
  107.                *lpText = '\0' ;
  108.  
  109.                GlobalUnlock (hResource) ;
  110.  
  111.                SetScrollRange (hScroll, SB_CTL, 0, nNumLines, FALSE) ;
  112.                SetScrollPos   (hScroll, SB_CTL, 0, FALSE) ;
  113.                return 0 ;
  114.  
  115.           case WM_SIZE:
  116.                MoveWindow (hScroll, LOWORD (lParam) - xScroll, 0,
  117.                     xScroll, cyClient = HIWORD (lParam), TRUE) ;
  118.                SetFocus (hwnd) ;
  119.                return 0 ;
  120.  
  121.           case WM_SETFOCUS:
  122.                SetFocus (hScroll) ;
  123.                return 0 ;
  124.  
  125.           case WM_VSCROLL:
  126.                switch (wParam)
  127.                     {
  128.                     case SB_TOP:
  129.                          nPosition = 0 ;
  130.                          break ;
  131.                     case SB_BOTTOM:
  132.                          nPosition = nNumLines ;
  133.                          break ;
  134.                     case SB_LINEUP:
  135.                          nPosition -= 1 ;
  136.                          break ;
  137.                     case SB_LINEDOWN:
  138.                          nPosition += 1 ;
  139.                          break ;
  140.                     case SB_PAGEUP:
  141.                          nPosition -= cyClient / cyChar ;
  142.                          break ;
  143.                     case SB_PAGEDOWN:
  144.                          nPosition += cyClient / cyChar ;
  145.                          break ;
  146.                     case SB_THUMBPOSITION:
  147.                          nPosition = LOWORD (lParam) ;
  148.                          break ;
  149.                     }
  150.                nPosition = max (0, min (nPosition, nNumLines)) ;
  151.  
  152.                if (nPosition != GetScrollPos (hScroll, SB_CTL))
  153.                     {
  154.                     SetScrollPos (hScroll, SB_CTL, nPosition, TRUE) ;
  155.                     InvalidateRect (hwnd, NULL, TRUE) ;
  156.                     }
  157.                return 0 ;
  158.  
  159.           case WM_PAINT:
  160.                hdc = BeginPaint (hwnd, &ps) ;
  161.  
  162.                lpText = LockResource (hResource) ;
  163.  
  164.                GetClientRect (hwnd, &rect) ;
  165.                rect.left += cxChar ;
  166.                rect.top  += cyChar * (1 - nPosition) ;
  167.                DrawText (hdc, lpText, -1, &rect, DT_EXTERNALLEADING) ;
  168.  
  169.                GlobalUnlock (hResource) ;
  170.  
  171.                EndPaint (hwnd, &ps) ;
  172.                return 0 ;
  173.  
  174.           case WM_DESTROY:
  175.                FreeResource (hResource) ;
  176.                PostQuitMessage (0) ;
  177.                return 0 ;
  178.           }
  179.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  180.      }
  181.