Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

321 lines
6.2 KiB

//
// 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;
}
}