Category : C Source Code
Archive   : TOOLBAR.ZIP
Filename : TOOLBAR.C

 
Output of file : TOOLBAR.C contained in archive : TOOLBAR.ZIP
/* Routines for the TOOLBAR library */
/* Copyright (C) Stephen Chung, 1991. */
/* All rights reserved. */


#include
#include "toolbar.h"

#define MAXSTATES 3


static BOOL ClassRegistered = FALSE;
static BOOL Capturing = FALSE;

long FAR PASCAL ToolbarProc (HWND, WORD, WORD, LONG);
long FAR PASCAL ToolbarButtonProc (HWND, WORD, WORD, LONG);


void Create3DEffect (HDC hdc, RECT *rect, int thickness)
{
int i;
int x1 = rect->left;
int y1 = rect->top;
int x2 = rect->right;
int y2 = rect->bottom;
HBRUSH hbrush;
HPEN hpen;

SelectObject(hdc, GetStockObject(BLACK_PEN));
hbrush = CreateSolidBrush(RGB(192, 192, 192));
SelectObject(hdc, hbrush);
Rectangle(hdc, x1, y1, x2, y2);
SelectObject(hdc, GetStockObject(WHITE_PEN));

for (i = 1; i <= thickness; i++) {
MoveTo(hdc, x1 + i, y1 + i); LineTo(hdc, x1 + i, y2 - 1);
MoveTo(hdc, x1 + i, y1 + i); LineTo(hdc, x2 - 1, y1 + i);
}

hpen = CreatePen(PS_SOLID, 1, RGB(128,128,128));
SelectObject(hdc, hpen);

for (i = 1; i <= thickness; i++) {
MoveTo(hdc, x1 + i, y2 - 1 - i);
LineTo(hdc, x2 - 1, y2 - 1 - i);
MoveTo(hdc, x2 - 1 - i, y2 - 2);
LineTo(hdc, x2 - 1 - i, y1 + i);
}

DeleteObject(hbrush);
DeleteObject(hpen);
}



void EnableToolbarButton (HWND hwnd, int id, BOOL enabled)
{
int i, n;
TOOLBARICON *icons;

icons = (TOOLBARICON *) GetWindowWord(hwnd, 0);
n = (int) GetWindowWord(hwnd, sizeof(WORD));

for (i = 0; i < n && icons[i].id != id; i++);

if (i >= n) return;

if (enabled) {
if (icons[i].state >= 0) return;
icons[i].state = icons[i].oldstate;
} else {
if (icons[i].state < 0) return;
icons[i].oldstate = icons[i].state;
icons[i].state = -1;
}
InvalidateRect(icons[i].hwnd, NULL, TRUE);
UpdateWindow(icons[i].hwnd);
}



HWND GetToolbarButton (HWND hwnd, int id, TOOLBARICON *ip)
{
int i, n;
TOOLBARICON *icons;

icons = (TOOLBARICON *) GetWindowWord(hwnd, 0);
n = (int) GetWindowWord(hwnd, sizeof(WORD));

for (i = 0; i < n && icons[i].id != id; i++);

if (i >= n) return (NULL);

if (ip != NULL) *ip = icons[i];

return (icons[i].hwnd);
}



void ModifyToolbarButton (HWND hwnd, TOOLBARICON *icon)
{
TOOLBARICON *old;

old = (TOOLBARICON *) GetWindowWord(hwnd, 0);

old->id = icon->id;
old->x = icon->x;
old->y = icon->y;
old->width = icon->width;
old->height = icon->height;
old->state = icon->state;
old->cycle = icon->cycle;
old->disabled = icon->disabled;
old->undepressed = icon->undepressed;
old->depressed = icon->depressed;
old->grayed = icon->grayed;
old->pressing = icon->pressing;

InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}



HWND CreateToolbar (HWND parent, int x, int y, int width, int height,
int thickness, int id, int n, HANDLE hInstance,
TOOLBARICON *icons, char *xcursor)
{
int i;
HWND hwnd;
WNDCLASS wndclass;

if (!ClassRegistered) {
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = ToolbarProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 4 * sizeof(WORD);
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = COLOR_BTNFACE + 1;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TOOLBARCLASS;

RegisterClass(&wndclass);

wndclass.cbWndExtra = sizeof(WORD);
wndclass.lpfnWndProc = ToolbarButtonProc;
wndclass.lpszClassName = TOOLBARBUTTONCLASS;

RegisterClass(&wndclass);
}

hwnd = CreateWindow(TOOLBARCLASS, "", WS_CHILD | WS_VISIBLE,
x, y, width, height, parent, id, hInstance, NULL);

SetWindowWord(hwnd, 0, (WORD) icons);
SetWindowWord(hwnd, sizeof(WORD), (WORD) n);
SetWindowWord(hwnd, 2 * sizeof(WORD), (WORD) thickness);
if (xcursor != NULL) {
SetWindowWord(hwnd, 3 * sizeof(WORD), LoadCursor(hInstance, xcursor));
} else {
SetWindowWord(hwnd, 3 * sizeof(WORD), NULL);
}

ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);

/* Create the children */

for (i = 0; i < n; i++) {
icons[i].hwnd = CreateWindow(TOOLBARBUTTONCLASS, "",
WS_CHILD | WS_VISIBLE,
icons[i].x, icons[i].y,
icons[i].width, icons[i].height,
hwnd, icons[i].id, hInstance, NULL);

SetWindowWord(icons[i].hwnd, 0, (WORD) &(icons[i]));
ShowWindow(icons[i].hwnd, SW_SHOW);
UpdateWindow(hwnd);
}

return (hwnd);
}



long FAR PASCAL ToolbarProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
int i;
HDC hdc;
PAINTSTRUCT ps;
HWND child;
RECT rect;
TOOLBARICON *icons;


switch (message) {

case WM_PAINT:
GetClientRect(hwnd, &rect);

hdc = BeginPaint(hwnd, &ps);
Create3DEffect(hdc, &rect, GetWindowWord(hwnd, 2 * sizeof(WORD)));
EndPaint(hwnd, &ps);
return (0);

case WM_COMMAND:
SendMessage(GetParent(hwnd), WM_COMMAND,
(wParam << 8) | GetWindowWord(hwnd, GWW_ID), lParam);
return (0);

case BM_SETSTATE:
case BM_GETSTATE:
icons = (TOOLBARICON *) GetWindowWord(hwnd, 0);
for (i = 0; icons[i].id != LOWORD(lParam); i++);
return (SendMessage(icons[i].hwnd, message, wParam, 0L));
}

return (DefWindowProc(hwnd, message, wParam, lParam));
}



long FAR PASCAL ToolbarButtonProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
int i, j;
BOOL crossed;
HDC hdc, hdcmem;
PAINTSTRUCT ps;
HPEN hpen;
HWND child;
TOOLBARICON *icon;
HBITMAP hbitmap;
HANDLE hInstance;
HCURSOR hcursor;


icon = (TOOLBARICON *) GetWindowWord(hwnd, 0);

if (icon->state < 0) {
hcursor = (HCURSOR) GetWindowWord(GetParent(hwnd), 3 * sizeof(WORD));
if (hcursor != NULL) SetCursor(hcursor);
}


switch (message) {

case BM_SETSTATE:
if (icon->state == wParam) return (0);

icon->oldstate = icon->state = wParam;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
return (0);

case BM_GETSTATE:
return (icon->state);

case WM_LBUTTONDOWN:
if (icon->state < 0) return (0);

icon->oldstate = icon->state;
icon->state = MAXSTATES;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
SetCapture(hwnd);
Capturing = TRUE;
return (0);

case WM_LBUTTONUP:
if (!Capturing || icon->state < 0) return (0);

ReleaseCapture();
Capturing = FALSE;

i = LOWORD(lParam);
j = HIWORD(lParam);

if (i < 0 || i >= icon->width || j < 0 || j >= icon->height) {
return (0);
} else if (icon->cycle <= 0) {
icon->state = icon->oldstate;
} else {
icon->oldstate++;
if (icon->oldstate >= icon->cycle) icon->oldstate = 0;
icon->state = icon->oldstate;
}

InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
SendMessage(GetParent(hwnd), WM_COMMAND, icon->id, ((LONG) BN_CLICKED << 16) | hwnd);
return (0);

case WM_MOUSEMOVE:
if (!Capturing || icon->state < 0) return (0);

i = LOWORD(lParam);
j = HIWORD(lParam);

if (i < 0 || i >= icon->width || j < 0 || j >= icon->height) {
crossed = (icon->state == MAXSTATES);
icon->state = icon->oldstate;
} else {
crossed = (icon->state != MAXSTATES);
icon->state = MAXSTATES;
}

if (crossed) {
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
return (0);

case WM_PAINT:
hInstance = GetWindowWord(hwnd, GWW_HINSTANCE);

hdc = BeginPaint(hwnd, &ps);

switch (icon->state) {
default: if (icon->disabled != NULL) {
hbitmap = LoadBitmap(hInstance, icon->disabled);
}
break;
case 0: hbitmap = LoadBitmap(hInstance, icon->undepressed); break;
case 1: hbitmap = LoadBitmap(hInstance, icon->depressed); break;
case 2: hbitmap = LoadBitmap(hInstance, icon->grayed); break;

case MAXSTATES:
hbitmap = LoadBitmap(hInstance, icon->pressing); break;
}

hdcmem = CreateCompatibleDC(hdc);
SelectObject(hdcmem, hbitmap);

BitBlt(hdc, 0, 0, icon->width, icon->height, hdcmem, 0, 0, SRCCOPY);

DeleteDC(hdcmem);
DeleteObject(hbitmap);
EndPaint(hwnd, &ps);
return (0);

}

return (DefWindowProc(hwnd, message, wParam, lParam));
}


  3 Responses to “Category : C Source Code
Archive   : TOOLBAR.ZIP
Filename : TOOLBAR.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/