|
|
1.1 ! root 1: // ************************************************************************ ! 2: // PROGRAM : ToolBar.C ! 3: // PURPOSE : A Win32 DLL containing various ToolBar controls ! 4: // FUNCTIONS : ! 5: // LibMain() - Dll entry point ! 6: // TextButtonBar() - generate a text button ToolBar ! 7: // TextButtonBarProc - processes messages for the TextButtonBarWClass ! 8: // COMMENTS : ! 9: // ************************************************************************ ! 10: #define NOMINMAX // eliminate the duplicate min, max defs ! 11: #include <Windows.H> // required for all Windows applications ! 12: #include <String.H> // strlen(), strchr(), strcpy(), strcat() ! 13: #include <StdLib.H> // ltoa() ! 14: ! 15: #include "ToolBar.H" // specific to this program ! 16: ! 17: //-- internal data ! 18: HWND hWndToolBarOwner; // window handle of Toolbar owner ! 19: // where all WM_COMMAND messages are sent ! 20: ! 21: // ************************************************************************ ! 22: // FUNCTION : LibMain( HANDLE, DWORD, LPVOID ) ! 23: // PURPOSE : LibMain is called by Windows when ! 24: // the DLL is initialized, Thread Attached, and other times. ! 25: // No initialization is needed here. ! 26: // ************************************************************************ ! 27: BOOL ! 28: LibMain( HANDLE hInst, DWORD dwReason, LPVOID lpReserved ) ! 29: { ! 30: UNREFERENCED_PARAMETER( hInst ); ! 31: UNREFERENCED_PARAMETER( dwReason ); ! 32: UNREFERENCED_PARAMETER( lpReserved ); ! 33: ! 34: return( TRUE ); ! 35: } ! 36: ! 37: ! 38: // ************************************************************************ ! 39: // FUNCTION : TextButtonBar( HANDLE, HWND, LPTEXTBUTTON, LPINT ) ! 40: // PURPOSE : Generate a text button ToolBar ! 41: // COMMENTS : lpTextButton points to an array of TEXTBUTTON ! 42: // structures. The last structure must set the ! 43: // member lpButtonText to NULL. lpHeight contains the ! 44: // height of the ToolBar window. ! 45: // ************************************************************************ ! 46: HWND ! 47: TextButtonBar( HWND hWndParent, LPTEXTBUTTON lpTextButton, LPINT lpHeight ) ! 48: { ! 49: #define BUTTON_BORDER 4 ! 50: #define BUTTONBAR_BORDER 4 ! 51: ! 52: static HWND hWndTextButtonBar; ! 53: ! 54: HDC hDC; ! 55: WNDCLASS wndclass; ! 56: LONG ButtonWidth; ! 57: LONG ButtonHeight; ! 58: INT xPosButton; ! 59: INT ButtonSpacing; ! 60: INT ButtonSpace; ! 61: LPTSTR lpButtonString; ! 62: LPTEXTBUTTON lpTempTextButton; ! 63: TEXTMETRIC tm; ! 64: SIZE ButtonTextSize; ! 65: RECT rect; ! 66: ! 67: ! 68: //-- store owner of Toolbar ! 69: hWndToolBarOwner = hWndParent; ! 70: ! 71: //-- register the TestButtonBar window class ! 72: wndclass.style = NULL; ! 73: wndclass.lpfnWndProc = (WNDPROC) TextButtonBarProc; ! 74: wndclass.cbClsExtra = 0; ! 75: wndclass.cbWndExtra = 0; ! 76: wndclass.hInstance = NULL; ! 77: wndclass.hIcon = NULL; ! 78: wndclass.hCursor = NULL; ! 79: wndclass.hbrBackground = GetStockObject(LTGRAY_BRUSH); ! 80: wndclass.lpszMenuName = NULL; ! 81: wndclass.lpszClassName = "TextButtonBarWClass"; ! 82: ! 83: if( !RegisterClass( &wndclass ) ) ! 84: return( NULL ); ! 85: ! 86: hDC = GetDC( hWndParent ); ! 87: GetTextMetrics( hDC, &tm ); ! 88: ButtonHeight = 2 * BUTTON_BORDER + tm.tmHeight; ! 89: *lpHeight = 2 * BUTTONBAR_BORDER + ButtonHeight; ! 90: ! 91: GetWindowRect( GetDesktopWindow(), &rect ); ! 92: hWndTextButtonBar = CreateWindow( ! 93: "TextButtonBarWClass", "Toolbar", ! 94: WS_CHILD | WS_CLIPSIBLINGS, ! 95: 0, 0, rect.right - rect.left, *lpHeight, ! 96: hWndToolBarOwner, ! 97: (HMENU) NULL, (HANDLE) NULL, NULL ); ! 98: ! 99: SetWindowPos( hWndTextButtonBar, (HWND) 1, 0, 0, 0, 0, ! 100: SWP_NOMOVE | SWP_NOSIZE ); ! 101: ! 102: //-- button spacing information ! 103: ButtonSpacing = BUTTON_BORDER / 2; ! 104: ButtonSpace = BUTTON_BORDER * 4; ! 105: xPosButton = BUTTON_BORDER * 2; ! 106: ! 107: //-- Create all the button windows ! 108: for( lpTempTextButton = lpTextButton; ! 109: !(lpTempTextButton->lpButtonText == '\0' && lpTempTextButton->idButton == NULL); ! 110: lpTempTextButton++ ) { ! 111: ! 112: //-- if TB_SPACE the adjust new xPos and continue ! 113: if( lpTempTextButton->idButton == TB_SPACE ) { ! 114: xPosButton += ButtonSpace; ! 115: continue; ! 116: } ! 117: ! 118: lpButtonString = lpTempTextButton->lpButtonText; ! 119: GetTextExtentPoint( hDC, lpButtonString, strlen(lpButtonString), &ButtonTextSize ); ! 120: ButtonWidth = (4 * BUTTON_BORDER) + (LONG) ButtonTextSize.cx; ! 121: ! 122: (lpTempTextButton->hWndButton) = CreateWindow( ! 123: "BUTTON", lpButtonString, ! 124: WS_VISIBLE | BS_PUSHBUTTON /* | WS_CLIPSIBLINGS */ | WS_CHILD, ! 125: xPosButton, BUTTONBAR_BORDER, ButtonWidth, ButtonHeight, ! 126: hWndTextButtonBar, ! 127: (HMENU) lpTempTextButton->idButton, ! 128: (HANDLE) NULL, NULL ); ! 129: ! 130: xPosButton += ButtonWidth + ButtonSpacing; ! 131: } ! 132: ReleaseDC( hWndParent, hDC ); ! 133: ! 134: return( hWndTextButtonBar ); ! 135: } ! 136: ! 137: ! 138: // ************************************************************************ ! 139: // FUNCTION : TextButtonBarProc( HWND, UINT, WPARAM, LPARAM ) ! 140: // PURPOSE : Processes messages for the TextButtonBarWClass ! 141: // MESSAGES : ! 142: // WM_COMMAND - forwarded onto the owner ! 143: // WM_PAINT - draw a 3D background ! 144: // COMMENTS : ! 145: // ************************************************************************ ! 146: LRESULT CALLBACK ! 147: TextButtonBarProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) ! 148: { ! 149: static HDC hDC; ! 150: static RECT rect; ! 151: static PAINTSTRUCT ps; ! 152: ! 153: switch( uMsg ) { ! 154: ! 155: case WM_COMMAND: ! 156: SendMessage( hWndToolBarOwner, uMsg, wParam, lParam ); ! 157: return( NULL ); ! 158: ! 159: case WM_PAINT: ! 160: hDC = BeginPaint( hWnd, &ps ); ! 161: GetClientRect( hWnd, &rect ); ! 162: ! 163: SelectObject( hDC, GetStockObject(WHITE_PEN) ); ! 164: MoveToEx( hDC, rect.left, rect.top, NULL ); ! 165: LineTo( hDC, rect.right+1, rect.top ); ! 166: ! 167: #define DKGRAY_PEN RGB(128, 128, 128) ! 168: SelectObject( hDC, (HANDLE) CreatePen( PS_SOLID, 1, DKGRAY_PEN ) ); ! 169: MoveToEx( hDC, rect.left, rect.bottom-2, NULL ); ! 170: LineTo( hDC, rect.right+1, rect.bottom-2 ); ! 171: ! 172: SelectObject( hDC, (HANDLE) CreatePen( PS_SOLID, 1, BLACK_PEN ) ); ! 173: MoveToEx( hDC, rect.left, rect.bottom-1, NULL ); ! 174: LineTo( hDC, rect.right+1, rect.bottom-1 ); ! 175: ! 176: DeleteObject( SelectObject( hDC, GetStockObject(BLACK_PEN) ) ); ! 177: EndPaint( hWnd, &ps ); ! 178: return( NULL ); ! 179: ! 180: default: ! 181: return( DefWindowProc(hWnd, uMsg, wParam, lParam) ); ! 182: } ! 183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.