home *** CD-ROM | disk | FTP | other *** search
/ Windoware / WINDOWARE_1_6.iso / source / toolbar / toolbar.c < prev    next >
C/C++ Source or Header  |  1991-07-28  |  9KB  |  348 lines

  1. /* Routines for the TOOLBAR library     */
  2. /* Copyright (C) Stephen Chung, 1991.   */
  3. /* All rights reserved.                 */
  4.  
  5.  
  6. #include <windows.h>
  7. #include "toolbar.h"
  8.  
  9. #define MAXSTATES       3
  10.  
  11.  
  12. static BOOL ClassRegistered = FALSE;
  13. static BOOL Capturing = FALSE;
  14.  
  15. long FAR PASCAL ToolbarProc (HWND, WORD, WORD, LONG);
  16. long FAR PASCAL ToolbarButtonProc (HWND, WORD, WORD, LONG);
  17.  
  18.  
  19. void Create3DEffect (HDC hdc, RECT *rect, int thickness)
  20. {
  21.     int     i;
  22.     int     x1 = rect->left;
  23.     int     y1 = rect->top;
  24.     int     x2 = rect->right;
  25.     int     y2 = rect->bottom;
  26.     HBRUSH  hbrush;
  27.     HPEN    hpen;
  28.  
  29.     SelectObject(hdc, GetStockObject(BLACK_PEN));
  30.     hbrush = CreateSolidBrush(RGB(192, 192, 192));
  31.     SelectObject(hdc, hbrush);
  32.     Rectangle(hdc, x1, y1, x2, y2);
  33.     SelectObject(hdc, GetStockObject(WHITE_PEN));
  34.  
  35.     for (i = 1; i <= thickness; i++) {
  36.         MoveTo(hdc, x1 + i, y1 + i);    LineTo(hdc, x1 + i, y2 - 1);
  37.         MoveTo(hdc, x1 + i, y1 + i);    LineTo(hdc, x2 - 1, y1 + i);
  38.     }
  39.  
  40.     hpen = CreatePen(PS_SOLID, 1, RGB(128,128,128));
  41.     SelectObject(hdc, hpen);
  42.  
  43.     for (i = 1; i <= thickness; i++) {
  44.         MoveTo(hdc, x1 + i, y2 - 1 - i);
  45.         LineTo(hdc, x2 - 1, y2 - 1 - i);
  46.         MoveTo(hdc, x2 - 1 - i, y2 - 2);
  47.         LineTo(hdc, x2 - 1 - i, y1 + i);
  48.     }
  49.  
  50.     DeleteObject(hbrush);
  51.     DeleteObject(hpen);
  52. }
  53.  
  54.  
  55.  
  56. void EnableToolbarButton (HWND hwnd, int id, BOOL enabled)
  57. {
  58.     int             i, n;
  59.     TOOLBARICON     *icons;
  60.  
  61.     icons = (TOOLBARICON *) GetWindowWord(hwnd, 0);
  62.     n = (int) GetWindowWord(hwnd, sizeof(WORD));
  63.  
  64.     for (i = 0; i < n && icons[i].id != id; i++);
  65.  
  66.     if (i >= n) return;
  67.  
  68.     if (enabled) {
  69.         if (icons[i].state >= 0) return;
  70.         icons[i].state = icons[i].oldstate;
  71.     } else {
  72.         if (icons[i].state < 0) return;
  73.         icons[i].oldstate = icons[i].state;
  74.         icons[i].state = -1;
  75.     }
  76.     InvalidateRect(icons[i].hwnd, NULL, TRUE);
  77.     UpdateWindow(icons[i].hwnd);
  78. }
  79.  
  80.  
  81.  
  82. HWND GetToolbarButton (HWND hwnd, int id, TOOLBARICON *ip)
  83. {
  84.     int             i, n;
  85.     TOOLBARICON     *icons;
  86.  
  87.     icons = (TOOLBARICON *) GetWindowWord(hwnd, 0);
  88.     n = (int) GetWindowWord(hwnd, sizeof(WORD));
  89.  
  90.     for (i = 0; i < n && icons[i].id != id; i++);
  91.  
  92.     if (i >= n) return (NULL);
  93.  
  94.     if (ip != NULL) *ip = icons[i];
  95.  
  96.     return (icons[i].hwnd);
  97. }
  98.  
  99.  
  100.  
  101. void ModifyToolbarButton (HWND hwnd, TOOLBARICON *icon)
  102. {
  103.     TOOLBARICON *old;
  104.  
  105.     old = (TOOLBARICON *) GetWindowWord(hwnd, 0);
  106.  
  107.     old->id = icon->id;
  108.     old->x = icon->x;
  109.     old->y = icon->y;
  110.     old->width = icon->width;
  111.     old->height = icon->height;
  112.     old->state = icon->state;
  113.     old->cycle = icon->cycle;
  114.     old->disabled = icon->disabled;
  115.     old->undepressed = icon->undepressed;
  116.     old->depressed = icon->depressed;
  117.     old->grayed = icon->grayed;
  118.     old->pressing = icon->pressing;
  119.  
  120.     InvalidateRect(hwnd, NULL, TRUE);
  121.     UpdateWindow(hwnd);
  122. }
  123.  
  124.  
  125.  
  126. HWND CreateToolbar (HWND parent, int x, int y, int width, int height,
  127.                     int thickness, int id, int n, HANDLE hInstance,
  128.                     TOOLBARICON *icons, char *xcursor)
  129. {
  130.     int         i;
  131.     HWND        hwnd;
  132.     WNDCLASS    wndclass;
  133.  
  134.     if (!ClassRegistered) {
  135.         wndclass.style          = CS_HREDRAW | CS_VREDRAW;
  136.         wndclass.lpfnWndProc    = ToolbarProc;
  137.         wndclass.cbClsExtra     = 0;
  138.         wndclass.cbWndExtra     = 4 * sizeof(WORD);
  139.         wndclass.hInstance      = hInstance;
  140.         wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
  141.         wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  142.         wndclass.hbrBackground  = COLOR_BTNFACE + 1;
  143.         wndclass.lpszMenuName   = NULL;
  144.         wndclass.lpszClassName  = TOOLBARCLASS;
  145.  
  146.         RegisterClass(&wndclass);
  147.  
  148.         wndclass.cbWndExtra     = sizeof(WORD);
  149.         wndclass.lpfnWndProc    = ToolbarButtonProc;
  150.         wndclass.lpszClassName  = TOOLBARBUTTONCLASS;
  151.  
  152.         RegisterClass(&wndclass);
  153.     }
  154.  
  155.     hwnd = CreateWindow(TOOLBARCLASS, "", WS_CHILD | WS_VISIBLE,
  156.                         x, y, width, height, parent, id, hInstance, NULL);
  157.  
  158.     SetWindowWord(hwnd, 0, (WORD) icons);
  159.     SetWindowWord(hwnd, sizeof(WORD), (WORD) n);
  160.     SetWindowWord(hwnd, 2 * sizeof(WORD), (WORD) thickness);
  161.     if (xcursor != NULL) {
  162.         SetWindowWord(hwnd, 3 * sizeof(WORD), LoadCursor(hInstance, xcursor));
  163.     } else {
  164.         SetWindowWord(hwnd, 3 * sizeof(WORD), NULL);
  165.     }
  166.  
  167.     ShowWindow(hwnd, SW_SHOW);
  168.     UpdateWindow(hwnd);
  169.  
  170.     /* Create the children */
  171.  
  172.     for (i = 0; i < n; i++) {
  173.         icons[i].hwnd = CreateWindow(TOOLBARBUTTONCLASS, "",
  174.                                      WS_CHILD | WS_VISIBLE,
  175.                                      icons[i].x, icons[i].y,
  176.                                      icons[i].width, icons[i].height,
  177.                                      hwnd, icons[i].id, hInstance, NULL);
  178.  
  179.         SetWindowWord(icons[i].hwnd, 0, (WORD) &(icons[i]));
  180.         ShowWindow(icons[i].hwnd, SW_SHOW);
  181.         UpdateWindow(hwnd);
  182.     }
  183.  
  184.     return (hwnd);
  185. }
  186.  
  187.  
  188.  
  189. long FAR PASCAL ToolbarProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  190. {
  191.     int             i;
  192.     HDC             hdc;
  193.     PAINTSTRUCT     ps;
  194.     HWND            child;
  195.     RECT            rect;
  196.     TOOLBARICON     *icons;
  197.  
  198.  
  199.     switch (message) {
  200.  
  201.         case WM_PAINT:
  202.             GetClientRect(hwnd, &rect);
  203.  
  204.             hdc = BeginPaint(hwnd, &ps);
  205.             Create3DEffect(hdc, &rect, GetWindowWord(hwnd, 2 * sizeof(WORD)));
  206.             EndPaint(hwnd, &ps);
  207.             return (0);
  208.  
  209.         case WM_COMMAND:
  210.             SendMessage(GetParent(hwnd), WM_COMMAND,
  211.                         (wParam << 8) | GetWindowWord(hwnd, GWW_ID), lParam);
  212.             return (0);
  213.  
  214.         case BM_SETSTATE:
  215.         case BM_GETSTATE:
  216.             icons = (TOOLBARICON *) GetWindowWord(hwnd, 0);
  217.             for (i = 0; icons[i].id != LOWORD(lParam); i++);
  218.             return (SendMessage(icons[i].hwnd, message, wParam, 0L));
  219.     }
  220.  
  221.     return (DefWindowProc(hwnd, message, wParam, lParam));
  222. }
  223.  
  224.  
  225.  
  226. long FAR PASCAL ToolbarButtonProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  227. {
  228.     int             i, j;
  229.     BOOL            crossed;
  230.     HDC             hdc, hdcmem;
  231.     PAINTSTRUCT     ps;
  232.     HPEN            hpen;
  233.     HWND            child;
  234.     TOOLBARICON     *icon;
  235.     HBITMAP         hbitmap;
  236.     HANDLE            hInstance;
  237.     HCURSOR         hcursor;
  238.  
  239.  
  240.     icon = (TOOLBARICON *) GetWindowWord(hwnd, 0);
  241.  
  242.     if (icon->state < 0) {
  243.         hcursor = (HCURSOR) GetWindowWord(GetParent(hwnd), 3 * sizeof(WORD));
  244.         if (hcursor != NULL) SetCursor(hcursor);
  245.     }
  246.  
  247.  
  248.     switch (message) {
  249.  
  250.     case BM_SETSTATE:
  251.         if (icon->state == wParam) return (0);
  252.  
  253.         icon->oldstate = icon->state = wParam;
  254.         InvalidateRect(hwnd, NULL, TRUE);
  255.         UpdateWindow(hwnd);
  256.         return (0);
  257.  
  258.     case BM_GETSTATE:
  259.         return (icon->state);
  260.  
  261.     case WM_LBUTTONDOWN:
  262.         if (icon->state < 0) return (0);
  263.  
  264.         icon->oldstate = icon->state;
  265.         icon->state = MAXSTATES;
  266.         InvalidateRect(hwnd, NULL, TRUE);
  267.         UpdateWindow(hwnd);
  268.         SetCapture(hwnd);
  269.         Capturing = TRUE;
  270.         return (0);
  271.  
  272.     case WM_LBUTTONUP:
  273.         if (!Capturing || icon->state < 0) return (0);
  274.  
  275.         ReleaseCapture();
  276.         Capturing = FALSE;
  277.  
  278.         i = LOWORD(lParam);
  279.         j = HIWORD(lParam);
  280.  
  281.         if (i < 0 || i >= icon->width || j < 0 || j >= icon->height) {
  282.             return (0);
  283.         } else if (icon->cycle <= 0) {
  284.             icon->state = icon->oldstate;
  285.         } else {
  286.             icon->oldstate++;
  287.             if (icon->oldstate >= icon->cycle) icon->oldstate = 0;
  288.             icon->state = icon->oldstate;
  289.         }
  290.  
  291.         InvalidateRect(hwnd, NULL, TRUE);
  292.         UpdateWindow(hwnd);
  293.         SendMessage(GetParent(hwnd), WM_COMMAND, icon->id, ((LONG) BN_CLICKED << 16) | hwnd);
  294.         return (0);
  295.  
  296.     case WM_MOUSEMOVE:
  297.         if (!Capturing || icon->state < 0) return (0);
  298.  
  299.         i = LOWORD(lParam);
  300.         j = HIWORD(lParam);
  301.  
  302.         if (i < 0 || i >= icon->width || j < 0 || j >= icon->height) {
  303.             crossed = (icon->state == MAXSTATES);
  304.             icon->state = icon->oldstate;
  305.         } else {
  306.             crossed = (icon->state != MAXSTATES);
  307.             icon->state = MAXSTATES;
  308.         }
  309.  
  310.         if (crossed) {
  311.             InvalidateRect(hwnd, NULL, TRUE);
  312.             UpdateWindow(hwnd);
  313.         }
  314.         return (0);
  315.  
  316.     case WM_PAINT:
  317.         hInstance = GetWindowWord(hwnd, GWW_HINSTANCE);
  318.  
  319.         hdc = BeginPaint(hwnd, &ps);
  320.  
  321.         switch (icon->state) {
  322.             default: if (icon->disabled != NULL) {
  323.                         hbitmap = LoadBitmap(hInstance, icon->disabled);
  324.                      }
  325.                      break;
  326.             case 0:  hbitmap = LoadBitmap(hInstance, icon->undepressed); break;
  327.             case 1:  hbitmap = LoadBitmap(hInstance, icon->depressed); break;
  328.             case 2:  hbitmap = LoadBitmap(hInstance, icon->grayed); break;
  329.  
  330.             case MAXSTATES:
  331.                     hbitmap = LoadBitmap(hInstance, icon->pressing); break;
  332.         }
  333.  
  334.         hdcmem = CreateCompatibleDC(hdc);
  335.         SelectObject(hdcmem, hbitmap);
  336.  
  337.         BitBlt(hdc, 0, 0, icon->width, icon->height, hdcmem, 0, 0, SRCCOPY);
  338.  
  339.         DeleteDC(hdcmem);
  340.         DeleteObject(hbitmap);
  341.         EndPaint(hwnd, &ps);
  342.         return (0);
  343.  
  344.     }
  345.  
  346.     return (DefWindowProc(hwnd, message, wParam, lParam));
  347. }
  348.