|
|
//
// TWND.CPP
// ToolBar handler
//
// Copyright Microsoft 1998-
//
// PRECOMP
#include "precomp.h"
//
// This is the button layout for the toolbar
//
static UINT g_uToolBar[TOOLBAR_MAXBUTTON] = { IDM_SELECT, IDM_ERASER, IDM_TEXT, IDM_HIGHLIGHT, IDM_PEN, IDM_LINE, IDM_BOX, IDM_FILLED_BOX, IDM_ELLIPSE, IDM_FILLED_ELLIPSE, 0, IDM_ZOOM, IDM_REMOTE, IDM_LOCK, IDM_SYNC, 0, IDM_GRAB_AREA, IDM_GRAB_WINDOW };
//
//
// Function: WbToolBar constructor
//
// Purpose: Create the tool window
//
//
WbToolBar::WbToolBar() { m_hwnd = NULL; m_hbmImages = NULL; }
WbToolBar::~WbToolBar() { if (m_hbmImages != NULL) { ::DeleteBitmap(m_hbmImages); m_hbmImages = NULL; } }
//
//
// Function: Create
//
// Purpose: Create the tool window
//
//
BOOL WbToolBar::Create(HWND hwndParent) { TBBUTTON tb; int iImage, i;
//
// Create the tool window
//
m_hwnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | TBSTYLE_WRAPABLE | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NOMOVEY | CCS_NORESIZE, 0, 0, 0, 0, hwndParent, (HMENU)IDC_TOOLBAR, g_hInstance, NULL);
if (!m_hwnd) { ERROR_OUT(("WbToolBar::Create create of window failed")); return(FALSE); }
//
// Tell COMCTL32 the structure size for the buttons
//
::SendMessage(m_hwnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
//
// And the margin for the buttons
//
::SendMessage(m_hwnd, TB_SETINDENT, TOOLBAR_MARGINX, 0);
//
// Add the buttons into the toolbar
//
ZeroMemory(&tb, sizeof(tb)); iImage = 0;
for (i = 0; i < TOOLBAR_MAXBUTTON; i++) { tb.fsState = TBSTATE_ENABLED; tb.idCommand = g_uToolBar[i];
if (!tb.idCommand) { tb.fsStyle = TBSTYLE_SEP; tb.iBitmap = TOOLBAR_SEPARATORY; } else { tb.fsStyle = TBSTYLE_BUTTON; tb.iBitmap = iImage++; }
if (!::SendMessage(m_hwnd, TB_ADDBUTTONS, 1, (LPARAM)&tb)) { ERROR_OUT(("Failed to add button %d to toolbar", i)); return(FALSE); } }
//
// Tell the toolbar the image and button sizes
//
::SendMessage(m_hwnd, TB_SETBITMAPSIZE, 0, MAKELONG(TOOLBAR_IMAGEWIDTH, TOOLBAR_IMAGEHEIGHT)); ::SendMessage(m_hwnd, TB_SETBUTTONSIZE, 0, MAKELONG(TOOLBAR_BTNWIDTH, TOOLBAR_BTNHEIGHT));
//
// Load the bitmap resource -- use sys color change handler
//
RecolorButtonImages();
// set up rows
::SendMessage(m_hwnd, TB_SETROWS, MAKELPARAM(TOOLBAR_NUMROWS + TOOLBAR_NUMSEPARATORS, TRUE), 0);
::InvalidateRect(m_hwnd, NULL, TRUE);
return(TRUE); }
//
//
// Function: GetNaturalSize
//
// Purpose: Return the natural size of the tool client area
//
//
void WbToolBar::GetNaturalSize(LPSIZE lpsize) { RECT rectButton; RECT rectButton2;
if (!::SendMessage(m_hwnd, TB_GETITEMRECT, TOOLBAR_FIRSTBUTTON, (LPARAM)&rectButton)) { ::SetRectEmpty(&rectButton); }
if (!::SendMessage(m_hwnd, TB_GETITEMRECT, TOOLBAR_LASTBUTTON, (LPARAM)&rectButton2)) { ::SetRectEmpty(&rectButton2); }
lpsize->cx = TOOLBAR_WIDTH; lpsize->cy = rectButton2.bottom - rectButton.top + // Vertical margin
(rectButton2.bottom - rectButton2.top); }
//
//
// Function: WidthFromHeight
//
// Purpose: Calculate the width of the toolbar, given the height for
// the fixed mode.
//
//
UINT WbToolBar::WidthFromHeight(UINT uiHeight) { SIZE size;
GetNaturalSize(&size); return(size.cx); }
//
//
// Function: PushDown
//
// Purpose: Push down a button in the tool window
//
//
BOOL WbToolBar::PushDown(UINT uiId) { UINT butId; BOOL bDown;
// If this isn't an exclusive checkable group, it's easy.
if ((uiId < IDM_TOOLS_START) || (uiId >= IDM_TOOLS_MAX)) { return (BOOL)(::SendMessage(m_hwnd, TB_CHECKBUTTON, uiId, MAKELPARAM(TRUE, 0))); }
// Push this one down and pop up all the others
for (butId = IDM_TOOLS_START; butId < IDM_TOOLS_MAX; butId++) { bDown = (butId == uiId); ::SendMessage(m_hwnd, TB_CHECKBUTTON, butId, MAKELPARAM(bDown, 0)); }
return( TRUE ); }
//
//
// Function: PopUp
//
// Purpose: Pop up a button in the tool window
//
//
BOOL WbToolBar::PopUp(UINT uiId) { return (BOOL)(::SendMessage(m_hwnd, TB_CHECKBUTTON, uiId, MAKELPARAM(FALSE, 0))); }
//
//
// Function: Enable
//
// Purpose: Enable a button in the tool window
//
//
BOOL WbToolBar::Enable(UINT uiId) { return (BOOL)(::SendMessage(m_hwnd, TB_ENABLEBUTTON, uiId, MAKELPARAM(TRUE, 0))); }
//
//
// Function: Disable
//
// Purpose: Disable a button in the tool window
//
//
BOOL WbToolBar::Disable(UINT uiId) { return (BOOL)(::SendMessage(m_hwnd, TB_ENABLEBUTTON, uiId, MAKELPARAM(FALSE, 0))); }
void WbToolBar::RecolorButtonImages(void) { // re-color bitmap for toolbar
HBITMAP hbmNew;
hbmNew = (HBITMAP)::LoadImage(g_hInstance, MAKEINTRESOURCE(IDR_TOOLS), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
if (hbmNew == NULL) { ERROR_OUT(("OnSysColorChange: failed to load toolbar bitmap")); } else { BITMAP bmp;
::GetObject(hbmNew, sizeof(bmp), &bmp);
if (m_hbmImages == NULL) { TBADDBITMAP addBitmap;
// First time
addBitmap.hInst = NULL; addBitmap.nID = (UINT_PTR)hbmNew;
::SendMessage(m_hwnd, TB_ADDBITMAP, (bmp.bmWidth / TOOLBAR_IMAGEWIDTH), (LPARAM)&addBitmap); } else { TBREPLACEBITMAP replaceBitmap;
replaceBitmap.hInstOld = NULL; replaceBitmap.nIDOld = (UINT_PTR)m_hbmImages; replaceBitmap.hInstNew = NULL; replaceBitmap.nIDNew = (UINT_PTR)hbmNew;
::SendMessage(m_hwnd, TB_REPLACEBITMAP, 0, (LPARAM)&replaceBitmap); }
if (m_hbmImages) { ::DeleteBitmap(m_hbmImages); }
m_hbmImages = hbmNew; } }
|