/************************************************************************** * * 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 - 1995 Microsoft Corporation. All Rights Reserved. * **************************************************************************/ /**************************************************************************** * * toolbar.h: Toolbar include file * * Vidcap32 Source code * ***************************************************************************/ /***************************************************************************** * * * Program Description: Implements a generic toolbar. * * * * Here's how to use it: * * * * Include the source files "toolbar.h" and "toolbar.c" in your * * application. * * * * Include a line in your application's RC file that gives a file * * name with a resource id eg. IDBMP_BUTTONS. This is a .BMP file that * * contains all of the pictures of the buttons you want on your toolbar. * * Also, make a define for your label with a unique value. If your app has * * more than one toolbar, and all toolbars don't share a bitmap file, then * * you will need several defines. * * * * e.g. IDBMP_BUTTONS BITMAP "buttons.bmp" * * IDBMP_ARROWS BITMAP "arrows.bmp" * * * * This file must have the different buttons across horizontally * * and the different states for these buttons vertically. Change the * * defines in this header file to match the button names and state names of * * your buttons. You must include the states listed here, and actually * * you probably won't need to change them at all. The numbers for a button * * or state are indexes into the bitmap, so the pictures must match. * * * * STATE DESCRIPTIONS: * * GRAYED: The button cannot be pressed & is inactive * * UP: The button is up * * DOWN: The button is down * * FOCUSUP: The button is up and is the one with focus * * FOCUSDOWN: The button is down and is the one with focus* * FULLDOWN: A checkbox button has this additional state * * where it is all the way down when pressed * * and when it is let go, it will go into * * either the UP or DOWN state (maybe focused) * * * * When you draw the pictures, make sure to get the right state in the right * * vertical position in the bitmap to match the #define's. * * * * A button can also have a type associated with it: * * * * PUSH: When pressed it goes down, when let go it bounces * * up. Therefore, when you aren't currently holding * * the mouse button or space bar on it, it will * * ALWAYS be in the up position. It can be in any * * state except FULLDOWN, which is invalid. * * * * CHECKBOX: This button can be up or down. When pushed, it * * toggles into the opposite state. However, it * * is always in the FULLDOWN state when being held * * down with the mouse button or space bar, and when * * let go, it will go into the opposite state of what * * it was in before you pressed it. E.G. The button * * is up. You press it, and it goes way down. You let * * go, and it comes up a bit, but it's still down. You* * press it again, and it goes further down before * * popping all the way up. * * * * RADIO: This is a group of buttons that can be up or down, * * and also have the intermediate step of being * * FULLDOWN when being held down. But, when you * * push one of the radio buttons down, all other radio * * buttons in its group will pop up. Any group can * * have only 1 down at a time, and 1 must be down. * * * * CUSTOM: If your application is wierd, you can have a custom * * type button that does anything you want it to. * * * * First, your app must call: toolbarInit(hInst, hPrev); * * with the two instance parameters to register a toolbar window class. * * Then your app is free to call CreateWindow with a class of * * szToolBarClass to create one or more toolbar windows anywhere it wants * * and of any size it wants, presumably as the child window of another of the* * app's windows. The file that creates the window must declare an * * extern char szToolBarClass[]; All messages about activity to a toolbar * * button will go to the parent window of the toolbar. * * * * Next, call: toolbarSetBitmap(HWND hwnd, HANDLE hInst, int ibmp, * * POINT ptSize); * * Pass it the resource ID (eg. IDBMP_BUTTONS) to tell the toolbar where to * * find the pictures for the buttons. Also pass a point with the width and * * height of each button (eg. 24 X 22) so it knows how to find individual * * buttons in the bitmap file. * * * * Next, call: toolbarAddTool(HWND hwnd, TOOLBUTTON tb); * * as many times as you want to add a button to the toolbar specified by * * hwnd. You fill in the "tb" struct with the following information: * * * * tb.rc = the rect in the toolbar window to place the button * * based at 0,0 and measured in pixels. * * tb.iButton = the ID of the button you wish the add (which is * * the horizontal offset into the bitmap of buttons). * * Only one of each button allowed. Use one of the * * defines (BTN_??????). * * tb.iState = the initial state of the button (GRAYED, UP, DOWN). * * If you wish, you can specify a FOCUS'ed state to give * * any button you wish the focus. By default, it's the * * one furthest left and tabbing order goes to the right.* * This is the vertical offset into the bitmap. * * Use one of the defines (BTNST_?????). * * tb.iType = The type of button (BTNTYPE_???). Either pushbutton, * * checkbox, or radio button. (or custom). If it is a * * radio button, you can have many groups of radio btn's * * on the same toolbar. Type BTNTYPE_RADIO is one group.* * Use BTNTYPE_RADIO+1 for another group, BTNTYPE_RADIO+2* * for a third group, etc. You have thousands. * * tb.iString = The resource ID of a string to be associated with * * this button (if you'd like). * * * * * * At any time in the app, you can call toolbarAddTool to add more buttons * * or toolbarRemoveTool to take some away. To take one away, identify it * * with it's button ID (horizontal offset in the bitmap). * * * * You can also call toolbarRetrieveTool to get the TOOLBUTTON struct back * * from a button that is on the toolbar. This is the way to change a * * button's position. Change the tb.rc and then Remove and Add the button * * again so that the tabbing order will be re-calculated based on the new * * rect of the tool. * * * * Now, all buttons will automatically behave properly. They'll go up and * * down as you press on them, or use the keyboard, groups of radio buttons * * will pop up as you press a different one down, etc. etc. etc. * * You don't have to do a thing! * * * * The parent of the toolbar window will get a WM_COMMAND message with * * a wParam of IDC_TOOLBAR whenever anything happens to a button. * * The LOWORD of the lParam is the hwnd of the toolbar window that has the * * button on it. The (HIWORD & 0xFF) is the button ID of the button. * * Remember to change IDC_TOOLBAR to something unique. * * * * The app can then call toolbarIndexFromButton(hwnd, buttonID) * * to get the index of the button (used for subsequent calls). * * * * Then call: toolbarStateFromButton(hwnd, buttonID) * * * * to get either BTNST_UP or BTNST_DOWN. This is the * * NEW state of the button since the activity on the * * button. It can also be BTNST_GRAYED, but you won't get * * any activity messages while it's grayed, unless it is a * * cutsom button. * * * * Call toolbarFullStateFromButton(hwnd, buttonID) * * * * to get more detail about the state. It can also return * * BTNST_FULLDOWN as well as the above states. In the case * * of BTNST_FULLDOWN, you'll have to call * * toolbarPrevStateFromButton(hwnd, btn ID) to get the state* * before it went full down. * * * * toolbarPrevStateFromButton(hwnd, buttonID) * * * * is only valid when the state is BTNST_FULLDOWN. * * * * toolbarActivityFromIndex(hwnd, buttonID) * * * * tells you what just happened to the button. * * BTNACT_KEYDOWN, BTNACT_MOUSEUP, etc. are possibilities. * * BTNACT_MOUSEMOUSEOFF means that they pressed it down and * * moved the mouse off of the button ( so it was re- drawn * * in its previous state before being pressed). * * BTNACT_MOUSEMOUSEON means that the above happened and * * then the mouse moved back on top of the button again, so * * the button was re-drawn as if it was pushed again. * * * * For any of the above activities....... * * * * HIWORD & BTN_SHIFT is set if this activity involves the right mouse * * button, or else it is clear. * * HIWORD & BTN_DBLCLICK is set means that this mouse button down activity * * is really a double click (if you care). * * * * If you are a custom button, you can also receive this message... * * * * HIWORD & BTN_REPEAT is set means that the button or key is being held * * down, and you are being sent many down messages * * in a row. The first such message is sent with * * this flag clear, all others have this flag set. * * If you are a custom button, you will have to * * ignore messages that are repeats if you don't * * want to get many down messages in a row. * * * * * * toolbarStringFromIndex(hwnd, index) * * * * will return you the string resource ID you gave when * * you registered this button. * * * * * * IMPORTANT !!!!!!!!!!!!!!!!!!! * * ============================= * * * * When you get the state of a button, it's already been changed by the * * activity so it's the NEW STATE!!!!!!!!! * * * * EXCEPT!!! for a custom button! For a custom button, NOTHING WILL * * happen, you have to do it all yourself!!!! So the state is going to be * * the state BEFORE the activity and you have to call * * toolbarModifyState(hwnd, buttonID, newState) to change the state * * yourself!!!! * * * * You also have toolbarGetNumButtons(hwnd) to tell you how many are on the * * the toolbar. * * And... you have other routines you can use if you really want. * * * * ENJOY!! * * * * P.S. Don't forget to pass on WM_SYSCOLORCHANGE msgs to each toolbar. * * * *****************************************************************************/ #define TOOLGROW 8 // power of 2 #define IDC_TOOLBAR 189 // wParam sent to Parent /* We keep an array of these around (one for each button on the toolbar) */ typedef struct { RECT rc; // draw it at this postion in the toolbar int iButton; // it's this button int iState; // in this state int iPrevState; // for non-push buttons - last state int iType; // type of button int iActivity; // what just happened to button int iString; // string resource associated with button } TOOLBUTTON, FAR *LPTOOLBUTTON; BOOL FAR PASCAL toolbarInit(HANDLE hInst, HANDLE hPrev); BOOL FAR PASCAL toolbarSetBitmap(HWND hwnd, HANDLE hInst, int ibmp, POINT ptSize); BOOL FAR PASCAL toolbarAddTool(HWND hwnd, TOOLBUTTON tb); BOOL FAR PASCAL toolbarRetrieveTool(HWND hwnd, int iButton, LPTOOLBUTTON tb); BOOL FAR PASCAL toolbarRemoveTool(HWND hwnd, int iButton); int FAR PASCAL toolbarGetNumButtons(HWND hwnd); int FAR PASCAL toolbarButtonFromIndex(HWND hwnd, int iBtnPos); int FAR PASCAL toolbarIndexFromButton(HWND hwnd, int iButton); int FAR PASCAL toolbarPrevStateFromButton(HWND hwnd, int iButton); int FAR PASCAL toolbarActivityFromButton(HWND hwnd, int iButton); int FAR PASCAL toolbarIndexFromPoint(HWND hwnd, POINT pt); BOOL FAR PASCAL toolbarRectFromIndex(HWND hwnd, int iBtnPos, LPRECT lprc); int FAR PASCAL toolbarStringFromIndex(HWND hwnd, int iBtnPos); int FAR PASCAL toolbarStateFromButton(HWND hwnd, int iButton); int FAR PASCAL toolbarFullStateFromButton(HWND hwnd, int iButton); int FAR PASCAL toolbarTypeFromIndex(HWND hwnd, int iBtnPos); BOOL FAR PASCAL toolbarModifyState(HWND hwnd, int iButton, int iState); BOOL FAR PASCAL toolbarModifyString(HWND hwnd, int iButton, int iString); BOOL FAR PASCAL toolbarModifyPrevState(HWND hwnd, int iButton, int iPrevState); BOOL FAR PASCAL toolbarModifyActivity(HWND hwnd, int iButton, int iActivity); BOOL FAR PASCAL toolbarExclusiveRadio(HWND hwnd, int iType, int iButton); BOOL FAR PASCAL toolbarMoveFocus(HWND hwnd, BOOL fBackward); BOOL FAR PASCAL toolbarSetFocus(HWND hwnd, int iButton); HBITMAP FAR PASCAL LoadUIBitmap( HANDLE hInstance, // EXE file to load resource from LPCSTR szName, // name of bitmap resource COLORREF rgbText, // color to use for "Button Text" COLORREF rgbFace, // color to use for "Button Face" COLORREF rgbShadow, // color to use for "Button Shadow" COLORREF rgbHighlight, // color to use for "Button Hilight" COLORREF rgbWindow, // color to use for "Window Color" COLORREF rgbFrame); // color to use for "Window Frame" /* In a bitmap file, each button is the same size, and contains * the picture of a button. Each column contains the picture of a distinct * button (e.g. BTN_REWIND, BTN_REVERSE, etc.) and each row contains * a specific button state (BTNST_UP, BTNST_DOWN, * BTNBAR_GRAYED, etc. just as an example). * */ #define TB_FIRST -1 #define TB_LAST -2 #define BTNST_GRAYED 0 // #define BTNST_UP 1 // #define BTNST_DOWN 2 // #define BTNST_FOCUSUP 3 // #define BTNST_FOCUSDOWN 4 // #define BTNST_FULLDOWN 5 // #define BTN_REPEAT 0x100 // add this to button index #define BTN_SHIFT 0x200 #define BTN_DBLCLICK 0x400 /* Types of buttons */ #define BTNTYPE_PUSH 0 #define BTNTYPE_CHECKBOX 1 #define BTNTYPE_CUSTOM 2 #define BTNTYPE_RADIO 3 // MUST BE LAST to reserve room for more // radio groups. (3 == one group, // 4 == another group, etc.) /* tells parent recent activity on button */ #define BTNACT_MOUSEDOWN 0 // clicked mouse button down on tool #define BTNACT_MOUSEUP 1 // let go of mouse button while on tool #define BTNACT_MOUSEMOVEOFF 2 // moved mouse off tool while btn down #define BTNACT_MOUSEMOVEON 3 // moved back on tool (btn still down) #define BTNACT_MOUSEDBLCLK 4 // dbl clicked on tool #define BTNACT_KEYDOWN 5 // key down on tool #define BTNACT_KEYUP 6 // key up from tool /* constants */ #define MSEC_BUTTONREPEAT 200 // milliseconds for auto-repeat /* timers */ #define TIMER_BUTTONREPEAT 1 // timer for button auto-repeat // Window words for Toolbar #ifdef _WIN32 #define GWLP_ARRAYBUTT 0 /* Pointer to array of buttons */ #define GWL_NUMBUTTONS (GWLP_ARRAYBUTT + sizeof(HANDLE)) /* Number of buttons in array */ #define GWL_PRESSED (GWL_NUMBUTTONS + sizeof(int)) /* Is a button currently pressed*/ #define GWL_KEYPRESSED (GWL_PRESSED + sizeof(BOOL)) /* Is a key currently pressed? */ #define GWL_WHICH (GWL_KEYPRESSED + sizeof(BOOL)) /* Which button has the focus? */ #define GWL_SHIFTED (GWL_WHICH + sizeof(int)) /* Is it rt-click or shift-left?*/ #define GWLP_BMPHANDLE (GWL_SHIFTED + sizeof(BOOL)) /* handle to bmp of the buttons */ #define GWL_BMPINT (GWLP_BMPHANDLE + sizeof(HANDLE)) /* resource int of button bmp */ #define GWL_BUTTONSIZE (GWL_BMPINT + sizeof(int)) /* a point (x=hi y=lo) */ #define GWLP_HINST (GWL_BUTTONSIZE + sizeof(long)) /* hinst of the app */ #define TOOLBAR_EXTRABYTES (GWLP_HINST + sizeof(HANDLE)) #else #define GWW_ARRAYBUTT 0 /* Pointer to array of buttons */ #define GWW_NUMBUTTONS 2 /* Number of buttons in array */ #define GWW_PRESSED 4 /* Is a button currently pressed*/ #define GWW_KEYPRESSED 6 /* Is a key currently pressed? */ #define GWW_WHICH 8 /* Which button has the focus? */ #define GWW_SHIFTED 10 /* Is it rt-click or shift-left?*/ #define GWW_BMPHANDLE 12 /* handle to bmp of the buttons */ #define GWW_BMPINT 14 /* resource int of button bmp */ #define GWL_BUTTONSIZE 16 /* a point (x=hi y=lo) */ #define GWW_HINST 20 /* hinst of the app */ #define TOOLBAR_EXTRABYTES 22 #endif