📄 toolbar.c
字号:
/**************************************************************************
*
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
* PURPOSE.
*
* Copyright (C) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
*
**************************************************************************/
/****************************************************************************
*
* toolbar.c: Toolbar control window
*
* Vidcap32 Source code
*
***************************************************************************/
#include <string.h>
#include <windows.h>
#include <windowsx.h>
//#include <win32.h>
#include "toolbar.h" // use this for generic app
/************************************************************************/
/* work for win3.0 */
#ifndef COLOR_BTNHIGHLIGHT
#define COLOR_BTNHIGHLIGHT 20
#endif
char szToolBarClass[] = "ToolBarClass";
HBRUSH ghbrToolbar; // brush for toolbar background
//
// Window proc for buttons, THIS FUNCTION MUST BE EXPORTED
//
LONG FAR PASCAL toolbarWndProc(HWND, unsigned, UINT, LONG);
typedef long (FAR PASCAL *LPWNDPROC)();
/*
Defines
*/
#ifdef _WIN32
#define GETARRAYBUTT(hwnd) ((HANDLE)GetWindowLong(hwnd,GWL_ARRAYBUTT))
#define GETNUMBUTTONS(hwnd) ((int)GetWindowLong(hwnd,GWL_NUMBUTTONS))
#define GETPRESSED(hwnd) ((BOOL)GetWindowLong(hwnd,GWL_PRESSED))
#define GETKEYPRESSED(hwnd) ((BOOL)GetWindowLong(hwnd,GWL_KEYPRESSED))
#define GETWHICH(hwnd) ((int)GetWindowLong(hwnd,GWL_WHICH))
#define GETSHIFTED(hwnd) ((BOOL)GetWindowLong(hwnd,GWL_SHIFTED))
#define GETBMPHANDLE(hwnd) ((HANDLE)GetWindowLong(hwnd,GWL_BMPHANDLE))
#define GETBMPINT(hwnd) ((int)GetWindowLong(hwnd,GWL_BMPINT))
#define GETBUTTONSIZE(hwnd) GetWindowLong(hwnd,GWL_BUTTONSIZE)
#define GETHINST(hwnd) ((HANDLE)GetWindowLong(hwnd,GWL_HINST))
#define SETARRAYBUTT(hwnd, h) SetWindowLong(hwnd, GWL_ARRAYBUTT, (UINT)h)
#define SETNUMBUTTONS(hwnd, wNumButtons) \
SetWindowLong(hwnd, GWL_NUMBUTTONS, wNumButtons)
#define SETPRESSED(hwnd, f) SetWindowLong(hwnd, GWL_PRESSED, (UINT)f)
#define SETKEYPRESSED(hwnd, f) SetWindowLong(hwnd, GWL_KEYPRESSED, (UINT)f)
#define SETWHICH(hwnd, i) SetWindowLong(hwnd, GWL_WHICH, (UINT)i)
#define SETSHIFTED(hwnd, i) SetWindowLong(hwnd, GWL_SHIFTED, (UINT)i)
#define SETBMPHANDLE(hwnd, h) SetWindowLong(hwnd, GWL_BMPHANDLE, (UINT)h)
#define SETBMPINT(hwnd, i) SetWindowLong(hwnd, GWL_BMPINT, (UINT)i)
#define SETBUTTONSIZE(hwnd, l) SetWindowLong(hwnd, GWL_BUTTONSIZE, l)
#define SETHINST(hwnd, h) SetWindowLong(hwnd, GWL_HINST, (UINT)h)
#else
#define GETARRAYBUTT(hwnd) ((HANDLE)GetWindowWord(hwnd,GWW_ARRAYBUTT))
#define GETNUMBUTTONS(hwnd) ((int)GetWindowWord(hwnd,GWW_NUMBUTTONS))
#define GETPRESSED(hwnd) ((BOOL)GetWindowWord(hwnd,GWW_PRESSED))
#define GETKEYPRESSED(hwnd) ((BOOL)GetWindowWord(hwnd,GWW_KEYPRESSED))
#define GETWHICH(hwnd) ((int)GetWindowWord(hwnd,GWW_WHICH))
#define GETSHIFTED(hwnd) ((BOOL)GetWindowWord(hwnd,GWW_SHIFTED))
#define GETBMPHANDLE(hwnd) ((HANDLE)GetWindowWord(hwnd,GWW_BMPHANDLE))
#define GETBMPINT(hwnd) ((int)GetWindowWord(hwnd,GWW_BMPINT))
#define GETBUTTONSIZE(hwnd) GetWindowLong(hwnd,GWL_BUTTONSIZE)
#define GETHINST(hwnd) ((HANDLE)GetWindowWord(hwnd,GWW_HINST))
#define SETARRAYBUTT(hwnd, h) SetWindowWord(hwnd, GWW_ARRAYBUTT, (WORD)h)
#define SETNUMBUTTONS(hwnd, wNumButtons) \
SetWindowWord(hwnd, GWW_NUMBUTTONS, wNumButtons)
#define SETPRESSED(hwnd, f) SetWindowWord(hwnd, GWW_PRESSED, (WORD)f)
#define SETKEYPRESSED(hwnd, f) SetWindowWord(hwnd, GWW_KEYPRESSED, (WORD)f)
#define SETWHICH(hwnd, i) SetWindowWord(hwnd, GWW_WHICH, (WORD)i)
#define SETSHIFTED(hwnd, i) SetWindowWord(hwnd, GWW_SHIFTED, (WORD)i)
#define SETBMPHANDLE(hwnd, h) SetWindowWord(hwnd, GWW_BMPHANDLE, (WORD)h)
#define SETBMPINT(hwnd, i) SetWindowWord(hwnd, GWW_BMPINT, (WORD)i)
#define SETBUTTONSIZE(hwnd, l) SetWindowLong(hwnd, GWL_BUTTONSIZE, l)
#define SETHINST(hwnd, h) SetWindowWord(hwnd, GWW_HINST, (WORD)h)
#endif
#define lpCreate ((LPCREATESTRUCT)lParam)
/* Prototypes */
static void NEAR PASCAL NotifyParent(HWND, int);
/**************************************************************************
toolbarInit( hInst, hPrev )
Call this routine to initialize the toolbar code.
Arguments:
hPrev instance handle of previous instance
hInst instance handle of current instance
Returns:
TRUE if successful, FALSE if not
***************************************************************************/
BOOL FAR PASCAL toolbarInit(HANDLE hInst, HANDLE hPrev)
{
WNDCLASS cls;
/* Register the tool bar window class */
if (!hPrev) {
cls.hCursor = LoadCursor(NULL,IDC_ARROW);
cls.hIcon = NULL;
cls.lpszMenuName = NULL;
cls.lpszClassName = (LPSTR)szToolBarClass;
cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
cls.hInstance = hInst;
cls.style = CS_DBLCLKS;
cls.lpfnWndProc = toolbarWndProc;
cls.cbClsExtra = 0;
cls.cbWndExtra = TOOLBAR_EXTRABYTES;
if (!RegisterClass(&cls))
return FALSE;
}
return TRUE;
}
/***************************************************************************/
/* toolbarSetBitmap: takes a resource ID and associates that bitmap with */
/* a given toolbar. Also takes the instance handle and */
/* the size of the buttons on the toolbar. */
/***************************************************************************/
BOOL FAR PASCAL toolbarSetBitmap(HWND hwnd, HANDLE hInst, int ibmp, POINT ptSize)
{
SETHINST(hwnd, hInst);
SETBMPHANDLE(hwnd, NULL);
SETBMPINT(hwnd, ibmp);
SETBUTTONSIZE(hwnd, MAKELONG(ptSize.y, ptSize.x));
return (BOOL)SendMessage(hwnd, WM_SYSCOLORCHANGE, 0, 0L); // do the work
}
/***************************************************************************/
/* toolbarGetNumButtons: return the number of buttons registered on a */
/* given toolbar window. */
/***************************************************************************/
int FAR PASCAL toolbarGetNumButtons(HWND hwnd)
{
return GETNUMBUTTONS(hwnd);
}
/***************************************************************************/
/* toolbarButtonFromIndex: Given an index into the array of buttons on */
/* this toolbar, return which button is there. */
/* Returns -1 for an error code. */
/***************************************************************************/
int FAR PASCAL toolbarButtonFromIndex(HWND hwnd, int iBtnPos)
{
int iButton;
HANDLE h;
TOOLBUTTON far *lpaButtons;
/* Get the array of buttons on this toolbar */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
/* Validate the index passed in */
if (iBtnPos > GETNUMBUTTONS(hwnd) || iBtnPos < 0)
return -1;
lpaButtons = (TOOLBUTTON far *)GlobalLock(h);
/* Read off the answer */
iButton = lpaButtons[iBtnPos].iButton;
GlobalUnlock(h);
return iButton;
}
/***************************************************************************/
/* toolbarIndexFromButton: Given a button ID, return the position in the */
/* array that it appears at. */
/* Returns -1 for an error code. */
/***************************************************************************/
int FAR PASCAL toolbarIndexFromButton(HWND hwnd, int iButton)
{
int i, iBtnPos = -1;
HANDLE h;
TOOLBUTTON far *lpButton;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
lpButton = (TOOLBUTTON far *)GlobalLock(h);
/* loop through until you find it */
for(i = 0; i < GETNUMBUTTONS(hwnd); i++, lpButton++)
if (lpButton->iButton == iButton) {
iBtnPos = i;
break;
}
GlobalUnlock(h);
return iBtnPos;
}
/***************************************************************************/
/* toolbarPrevStateFromButton: Given a button ID, return the state that */
/* the button was in before it was pressed */
/* all the way down (for non-push buttons). */
/* Return -1 for an error code. */
/***************************************************************************/
int FAR PASCAL toolbarPrevStateFromButton(HWND hwnd, int iButton)
{
int i, iPrevState = -1;
HANDLE h;
TOOLBUTTON far *lpButton;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
lpButton = (TOOLBUTTON far *)GlobalLock(h);
/* look for what we need */
for(i = 0; i < GETNUMBUTTONS(hwnd); i++, lpButton++)
if (lpButton->iButton == iButton) {
iPrevState = lpButton->iPrevState;
break;
}
GlobalUnlock(h);
return iPrevState;
}
/***************************************************************************/
/* toolbarActivityFromButton: Given a button ID, return the most recent */
/* activity that happened to it. (eg DBLCLK) */
/* Return -1 for an error code. */
/***************************************************************************/
int FAR PASCAL toolbarActivityFromButton(HWND hwnd, int iButton)
{
int i, iActivity = -1;
HANDLE h;
TOOLBUTTON far *lpButton;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
lpButton = (TOOLBUTTON far *)GlobalLock(h);
/* loop through until you find it */
for(i = 0; i < GETNUMBUTTONS(hwnd); i++, lpButton++)
if (lpButton->iButton == iButton)
iActivity = lpButton->iActivity;
GlobalUnlock(h);
return iActivity;
}
/***************************************************************************/
/* toolbarIndexFromPoint: Given a point in the toolbar window, return the */
/* index of the button beneath that point. */
/* Return -1 for an error code. */
/***************************************************************************/
int FAR PASCAL toolbarIndexFromPoint(HWND hwnd, POINT pt)
{
int i, iBtnPos = -1;
HANDLE h;
TOOLBUTTON far *lpButton;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
lpButton = (TOOLBUTTON far *)GlobalLock(h);
/* loop through until we find an intersection */
for(i = 0; i < GETNUMBUTTONS(hwnd); i++, lpButton++)
if (PtInRect(&lpButton->rc, pt)) {
iBtnPos = i;
break;
}
GlobalUnlock(h);
return iBtnPos;
}
/***************************************************************************/
/* toolbarRectFromIndex: Given an index into our array of buttons, return*/
/* the rect occupied by that button. */
/* Return a NULL rect for an error. */
/***************************************************************************/
BOOL FAR PASCAL toolbarRectFromIndex(HWND hwnd, int iBtnPos, LPRECT lprc)
{
HANDLE h;
TOOLBUTTON far *lpaButtons;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return FALSE;
/* Validate the index passed in */
if (iBtnPos > GETNUMBUTTONS(hwnd) || iBtnPos < 0)
return FALSE;
lpaButtons = (TOOLBUTTON far *)GlobalLock(h);
/* Read off the rect */
*lprc = lpaButtons[iBtnPos].rc;
GlobalUnlock(h);
return TRUE;
}
/***************************************************************************/
/* toolbarFullStateFromButton: Given a button in our array of buttons, */
/* return the state of that button. */
/* (including the wierd state FULLDOWN). For */
/* just UP or DOWN or GRAYED, */
/* call toolbarStateFromButton. */
/* Return -1 for an error. */
/***************************************************************************/
int FAR PASCAL toolbarFullStateFromButton(HWND hwnd, int iButton)
{
int iState, iBtnPos;
HANDLE h;
TOOLBUTTON far *lpaButtons;
iBtnPos = toolbarIndexFromButton(hwnd, iButton);
if (iBtnPos == -1)
return -1;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
lpaButtons = (TOOLBUTTON far *)GlobalLock(h);
/* Read off the state */
iState = lpaButtons[iBtnPos].iState;
GlobalUnlock(h);
return iState;
}
/***************************************************************************/
/* toolbarStateFromButton: This fn is called by the parent application */
/* to get the state of a button. It will only */
/* return DOWN, or UP or GRAYED as opposed to */
/* toolbarFullStateFromButton which could return */
/* FULLDOWN. */
/***************************************************************************/
int FAR PASCAL toolbarStateFromButton(HWND hwnd, int iButton)
{
int iState;
/* If a checkbox button is all the way down, it's previous state is */
/* the one we want. */
if ((iState = toolbarFullStateFromButton(hwnd, iButton))
== BTNST_FULLDOWN) {
iState = toolbarPrevStateFromButton(hwnd, iButton);
return iState;
} else
return iState;
}
/***************************************************************************/
/* toolbarStringFromIndex: Given an index into our array of buttons, return*/
/* the string resource associated with it. */
/* Return -1 for an error. */
/***************************************************************************/
int FAR PASCAL toolbarStringFromIndex(HWND hwnd, int iBtnPos)
{
int iString;
HANDLE h;
TOOLBUTTON far *lpaButtons;
/* Get the array of buttons */
h = GETARRAYBUTT(hwnd);
if (!h)
return -1;
/* Validate the index passed in */
if (iBtnPos > GETNUMBUTTONS(hwnd) || iBtnPos < 0)
return -1;
lpaButtons = (TOOLBUTTON far *)GlobalLock(h);
/* Read off the ID */
iString = lpaButtons[iBtnPos].iString;
GlobalUnlock(h);
return iString;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -