home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / winprogs.zip / COLORS1.ZIP / COLORS1.C next >
Text File  |  1990-12-26  |  9KB  |  279 lines

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