#include "wx/app.h" // for GetComCtl32Version
-// ----------------------------------------------------------------------------
-// conditional compilation
-// ----------------------------------------------------------------------------
-
-// wxWidgets previously always considered that toolbar buttons have light grey
-// (0xc0c0c0) background and so ignored any bitmap masks - however, this
-// doesn't work with XPMs which then appear to have black background. To make
-// this work, we must respect the bitmap masks - which we do now. This should
-// be ok in any case, but to restore 100% compatible with the old version
-// behaviour, you can set this to 0.
-#define USE_BITMAP_MASKS 1
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
#define TB_HITTEST (WM_USER + 69)
#endif
+#ifndef TB_GETMAXSIZE
+ #define TB_GETMAXSIZE (WM_USER + 83)
+#endif
+
// these values correspond to those used by comctl32.dll
#define DEFAULTBITMAPX 16
#define DEFAULTBITMAPY 15
BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
EVT_MOUSE_EVENTS(wxToolBar::OnMouseEvent)
EVT_SYS_COLOUR_CHANGED(wxToolBar::OnSysColourChanged)
+ EVT_ERASE_BACKGROUND(wxToolBar::OnEraseBackground)
END_EVENT_TABLE()
// ----------------------------------------------------------------------------
wxSize wxToolBar::DoGetBestSize() const
{
- wxSize sizeBest = GetToolSize();
- sizeBest.x *= GetToolsCount();
+ wxSize sizeBest;
- // reverse horz and vertical components if necessary
- return HasFlag(wxTB_VERTICAL) ? wxSize(sizeBest.y, sizeBest.x) : sizeBest;
+ SIZE size;
+ if ( !::SendMessage(GetHwnd(), TB_GETMAXSIZE, 0, (LPARAM)&size) )
+ {
+ // maybe an old (< 0x400) Windows version? try to approximate the
+ // toolbar size ourselves
+ sizeBest = GetToolSize();
+ sizeBest.y += 2 * ::GetSystemMetrics(SM_CYBORDER); // Add borders
+ sizeBest.x *= GetToolsCount();
+
+ // reverse horz and vertical components if necessary
+ if ( HasFlag(wxTB_VERTICAL) )
+ {
+ int t = sizeBest.x;
+ sizeBest.x = sizeBest.y;
+ sizeBest.y = t;
+ }
+ }
+ else
+ {
+ sizeBest.x = size.cx;
+ sizeBest.y = size.cy;
+ }
+
+ return sizeBest;
}
WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const
totalBitmapHeight = m_defaultHeight;
// Create a bitmap and copy all the tool bitmaps to it
-#if USE_BITMAP_MASKS
wxMemoryDC dcAllButtons;
wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight);
dcAllButtons.SelectObject(bitmap);
m_hBitmap = bitmap.GetHBITMAP();
HBITMAP hBitmap = (HBITMAP)m_hBitmap;
-#else // !USE_BITMAP_MASKS
- HBITMAP hBitmap = ::CreateCompatibleBitmap(ScreenHDC(),
- totalBitmapWidth,
- totalBitmapHeight);
- if ( !hBitmap )
- {
- wxLogLastError(_T("CreateCompatibleBitmap"));
-
- return false;
- }
-
- m_hBitmap = (WXHBITMAP)hBitmap;
-
- MemoryHDC memoryDC;
- SelectInHDC hdcSelector(memoryDC, hBitmap);
-
- MemoryHDC memoryDC2;
-#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
if (doRemapBg)
{
-#if USE_BITMAP_MASKS
dcAllButtons.SelectObject(wxNullBitmap);
-#endif
// Even if we're not remapping the bitmap
// content, we still have to remap the background.
hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap,
totalBitmapWidth, totalBitmapHeight);
-#if USE_BITMAP_MASKS
dcAllButtons.SelectObject(bitmap);
-#endif
}
// the button position
{
int xOffset = wxMax(0, (m_defaultWidth - bmp.GetWidth())/2);
int yOffset = wxMax(0, (m_defaultHeight - bmp.GetHeight())/2);
-#if USE_BITMAP_MASKS
// notice the last parameter: do use mask
dcAllButtons.DrawBitmap(bmp, x+xOffset, yOffset, true);
-#else // !USE_BITMAP_MASKS
- SelectInHDC hdcSelector2(memoryDC2, GetHbitmapOf(bmp));
- if ( !BitBlt(memoryDC,
- x+xOffset, yOffset, m_defaultWidth, m_defaultHeight,
- memoryDC2,
- 0, 0, SRCCOPY) )
- {
- wxLogLastError(wxT("BitBlt"));
- }
-#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
}
else
{
}
}
-#if USE_BITMAP_MASKS
dcAllButtons.SelectObject(wxNullBitmap);
// don't delete this HBITMAP!
bitmap.SetHBITMAP(0);
-#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
if (doRemap)
{
return;
}
- if (event.RightDown())
+ if ( event.RightDown() )
{
- // For now, we don't have an id. Later we could
- // try finding the tool.
- OnRightClick((int)-1, event.GetX(), event.GetY());
+ // find the tool under the mouse
+ wxCoord x,y;
+ event.GetPosition(&x, &y);
+
+ wxToolBarToolBase *tool = FindToolForPosition(x, y);
+ OnRightClick(tool ? tool->GetId() : -1, x, y);
}
else
{
}
}
+// This handler is required to allow the toolbar to be set to a non-default
+// colour: for example, when it must blend in with a notebook page.
+void wxToolBar::OnEraseBackground(wxEraseEvent& event)
+{
+ wxColour bgCol = GetBackgroundColour();
+ if (!bgCol.Ok())
+ {
+ event.Skip();
+ return;
+ }
+
+ // notice that this 'dumb' implementation may cause flicker for some of the
+ // controls in which case they should intercept wxEraseEvent and process it
+ // themselves somehow
+
+ RECT rect;
+ ::GetClientRect(GetHwnd(), &rect);
+
+ HBRUSH hBrush = ::CreateSolidBrush(wxColourToRGB(bgCol));
+
+ HDC hdc = GetHdcOf((*event.GetDC()));
+
+#ifndef __WXWINCE__
+ int mode = ::SetMapMode(hdc, MM_TEXT);
+#endif
+
+ ::FillRect(hdc, &rect, hBrush);
+ ::DeleteObject(hBrush);
+
+#ifndef __WXWINCE__
+ ::SetMapMode(hdc, mode);
+#endif
+}
+
bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam)
{
// calculate our minor dimension ourselves - we're confusing the standard