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

  1. /*----------------------------------------
  2.    COLORS1.C -- Colors Using Scroll Bars
  3.                 (c) Charles Petzold, 1990
  4.   ----------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <stdlib.h>
  8.  
  9. long FAR PASCAL WndProc    (HWND, WORD, WORD, LONG) ;
  10. long FAR PASCAL ScrollProc (HWND, WORD, WORD, LONG) ;
  11.  
  12. FARPROC lpfnOldScr[3] ;
  13. HWND    hwndScrol[3], hwndLabel[3], hwndValue[3], hwndRect ;
  14. short   color[3], nFocus ;
  15.  
  16. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  17.                     LPSTR lpszCmdLine, int nCmdShow)
  18.      {
  19.      static char szAppName[] = "Colors1" ;
  20.      static char *szColorLabel[] = { "Red", "Green", "Blue" } ;
  21.      FARPROC     lpfnScrollProc ;
  22.      HWND        hwnd ;
  23.      MSG         msg;
  24.      short       n ;
  25.      WNDCLASS    wndclass ;
  26.  
  27.      if (hPrevInstance)
  28.           return FALSE ;
  29.  
  30.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  31.      wndclass.lpfnWndProc   = WndProc ;
  32.      wndclass.cbClsExtra    = 0 ;
  33.      wndclass.cbWndExtra    = 0 ;
  34.      wndclass.hInstance     = hInstance ;
  35.      wndclass.hIcon         = NULL ;
  36.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  37.      wndclass.hbrBackground = CreateSolidBrush (0L) ;
  38.      wndclass.lpszMenuName  = NULL ;
  39.      wndclass.lpszClassName = szAppName ;
  40.  
  41.      RegisterClass (&wndclass) ;
  42.  
  43.      hwnd = CreateWindow (szAppName, "Color Scroll",
  44.                           WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  45.                           CW_USEDEFAULT, CW_USEDEFAULT,
  46.                           CW_USEDEFAULT, CW_USEDEFAULT,
  47.                           NULL, NULL, hInstance, NULL) ;
  48.  
  49.      hwndRect = CreateWindow ("static", NULL,
  50.                               WS_CHILD | WS_VISIBLE | SS_WHITERECT,
  51.                               0, 0, 0, 0,
  52.                               hwnd, 9, hInstance, NULL) ;
  53.  
  54.      lpfnScrollProc = MakeProcInstance ((FARPROC) ScrollProc, hInstance) ;
  55.  
  56.      for (n = 0 ; n < 3 ; n++) 
  57.           {
  58.           hwndScrol[n] = CreateWindow ("scrollbar", NULL,
  59.                               WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT,
  60.                               0, 0, 0, 0,
  61.                               hwnd, n, hInstance, NULL) ;
  62.  
  63.           hwndLabel[n] = CreateWindow ("static", szColorLabel[n],
  64.                               WS_CHILD | WS_VISIBLE | SS_CENTER,
  65.                               0, 0, 0, 0,
  66.                               hwnd, n + 3, hInstance, NULL) ;
  67.  
  68.           hwndValue[n] = CreateWindow ("static", "0",
  69.                               WS_CHILD | WS_VISIBLE | SS_CENTER,
  70.                               0, 0, 0, 0,
  71.                               hwnd, n + 6, hInstance, NULL) ; 
  72.  
  73.           lpfnOldScr[n] = (FARPROC) GetWindowLong (hwndScrol[n], GWL_WNDPROC) ;
  74.           SetWindowLong (hwndScrol[n], GWL_WNDPROC, (LONG) lpfnScrollProc) ;
  75.  
  76.           SetScrollRange (hwndScrol[n], SB_CTL, 0, 255, FALSE) ;
  77.           SetScrollPos   (hwndScrol[n], SB_CTL, 0, FALSE) ;
  78.           }
  79.  
  80.      ShowWindow (hwnd, nCmdShow) ;
  81.      UpdateWindow (hwnd);
  82.  
  83.      while (GetMessage (&msg, NULL, 0, 0))
  84.           {
  85.           TranslateMessage (&msg) ;
  86.           DispatchMessage  (&msg) ;
  87.           }
  88.      return msg.wParam ;
  89.      }
  90.  
  91. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  92.      {
  93.      static HBRUSH hBrush[3] ;
  94.      char          szbuffer[10] ;
  95.      HDC           hdc ;
  96.      POINT         point ;
  97.      short         n, cxClient, cyClient, cyChar ;
  98.      TEXTMETRIC    tm ;
  99.  
  100.      switch (message)
  101.           {
  102.           case WM_CREATE :
  103.                hBrush[0] = CreateSolidBrush (RGB (255, 0, 0)) ;
  104.                hBrush[1] = CreateSolidBrush (RGB (0, 255, 0)) ;
  105.                hBrush[2] = CreateSolidBrush (RGB (0, 0, 255)) ;
  106.                return 0 ;
  107.  
  108.           case WM_SIZE :
  109.                cxClient = LOWORD (lParam) ;
  110.                cyClient = HIWORD (lParam) ;
  111.  
  112.                hdc = GetDC (hwnd) ;
  113.                GetTextMetrics (hdc, &tm) ;
  114.                cyChar = tm.tmHeight ;
  115.                ReleaseDC (hwnd, hdc) ;
  116.  
  117.                MoveWindow (hwndRect, 0, 0, cxClient / 2, cyClient, TRUE) ;
  118.  
  119.                for (n = 0 ; n < 3 ; n++)
  120.                     {
  121.                     MoveWindow (hwndScrol[n],
  122.                          (2 * n + 1) * cxClient / 14, 2 * cyChar,
  123.                          cxClient / 14, cyClient - 4 * cyChar, TRUE) ;
  124.  
  125.                     MoveWindow (hwndLabel[n],
  126.                          (4 * n + 1) * cxClient / 28, cyChar / 2,
  127.                          cxClient / 7, cyChar, TRUE) ;
  128.  
  129.                     MoveWindow (hwndValue[n],
  130.                          (4 * n + 1) * cxClient / 28, cyClient - 3 * cyChar / 2,
  131.                          cxClient / 7, cyChar, TRUE) ;
  132.                     }
  133.                SetFocus (hwnd) ;
  134.                return 0 ;
  135.  
  136.           case WM_SETFOCUS:
  137.                SetFocus (hwndScrol[nFocus]) ;
  138.                return 0 ;
  139.  
  140.           case WM_VSCROLL :
  141.                n = GetWindowWord (HIWORD (lParam), GWW_ID) ;
  142.  
  143.                switch (wParam)
  144.                     {
  145.                     case SB_PAGEDOWN :
  146.                          color[n] += 15 ;         /* fall through */
  147.                     case SB_LINEDOWN :
  148.                          color[n] = min (255, color[n] + 1) ;
  149.                          break ;
  150.                     case SB_PAGEUP :
  151.                          color[n] -= 15 ;         /* fall through */
  152.                     case SB_LINEUP :
  153.                          color[n] = max (0, color[n] - 1) ;
  154.                          break ;
  155.                     case SB_TOP:
  156.                          color[n] = 0 ;
  157.                          break ;
  158.                     case SB_BOTTOM :
  159.                          color[n] = 255 ;
  160.                          break ;
  161.                     case SB_THUMBPOSITION :
  162.                     case SB_THUMBTRACK :
  163.                          color[n] = LOWORD (lParam) ;
  164.                          break ;
  165.                     default :
  166.                          break ;
  167.                     }
  168.                SetScrollPos  (hwndScrol[n], SB_CTL, color[n], TRUE) ;
  169.                SetWindowText (hwndValue[n], itoa (color[n], szbuffer, 10)) ;
  170.  
  171.                DeleteObject (GetClassWord (hwnd, GCW_HBRBACKGROUND)) ;
  172.                SetClassWord (hwnd, GCW_HBRBACKGROUND,
  173.                     CreateSolidBrush (RGB (color[0], color[1], color[2]))) ;
  174.  
  175.                InvalidateRect (hwnd, NULL, TRUE) ;
  176.                return 0 ;
  177.  
  178.           case WM_CTLCOLOR:
  179.                if (HIWORD (lParam) == CTLCOLOR_SCROLLBAR)
  180.                     {
  181.                     SetBkColor (wParam, GetSysColor (COLOR_CAPTIONTEXT)) ;
  182.                     SetTextColor (wParam, GetSysColor (COLOR_WINDOWFRAME)) ;
  183.  
  184.                     n = GetWindowWord (LOWORD (lParam), GWW_ID) ;
  185.                     point.x = point.y = 0 ;
  186.                     ClientToScreen (hwnd, &point) ;
  187.                     UnrealizeObject (hBrush[n]) ;
  188.                     SetBrushOrg (wParam, point.x, point.y) ;
  189.                     return ((DWORD) hBrush[n]) ;
  190.                     }
  191.                break ;
  192.  
  193.           case WM_DESTROY:
  194.                DeleteObject (GetClassWord (hwnd, GCW_HBRBACKGROUND)) ;
  195.                for (n = 0 ; n < 3 ; DeleteObject (hBrush [n++])) ;
  196.                PostQuitMessage (0) ;
  197.                return 0 ;
  198.           }
  199.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  200.      }
  201.  
  202. long FAR PASCAL ScrollProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  203.      {
  204.      short n = GetWindowWord (hwnd, GWW_ID) ;
  205.  
  206.      switch (message)
  207.           {
  208.           case WM_KEYDOWN:
  209.                if (wParam == VK_TAB)
  210.                     SetFocus (hwndScrol[(n +
  211.                          (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3]) ;
  212.                break ;
  213.  
  214.           case WM_SETFOCUS:
  215.                nFocus = n ;
  216.                break ;
  217.           }
  218.      return CallWindowProc (lpfnOldScr[n], hwnd, message, wParam, lParam) ;
  219.      }
  220.