X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7406cb31ed5aeba3e77dfbc7d21123f912efa8ae..c6d60564cb1586ea3087696920945e5985641128:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 1d667c258d..48a58f45d4 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -85,6 +85,10 @@ #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 @@ -120,6 +124,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl) BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase) EVT_MOUSE_EVENTS(wxToolBar::OnMouseEvent) EVT_SYS_COLOUR_CHANGED(wxToolBar::OnSysColourChanged) + EVT_ERASE_BACKGROUND(wxToolBar::OnEraseBackground) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -338,11 +343,32 @@ wxToolBar::~wxToolBar() wxSize wxToolBar::DoGetBestSize() const { - wxSize sizeBest = GetToolSize(); - sizeBest.x *= GetToolsCount(); + wxSize 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; + } - // reverse horz and vertical components if necessary - return HasFlag(wxTB_VERTICAL) ? wxSize(sizeBest.y, sizeBest.x) : sizeBest; + return sizeBest; } WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const @@ -1186,11 +1212,14 @@ void wxToolBar::OnMouseEvent(wxMouseEvent& event) 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 { @@ -1198,6 +1227,40 @@ void wxToolBar::OnMouseEvent(wxMouseEvent& event) } } +// 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