]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tbar95.cpp
wxFopen arg fixes
[wxWidgets.git] / src / msw / tbar95.cpp
index c5d3aaa39e9bb9a4dd0cc1ef445dcf62000e27e8..48a58f45d4d5f1dad340c4f6ce71c8a1c4b9cd77 100644 (file)
@@ -124,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()
 
 // ----------------------------------------------------------------------------
@@ -350,6 +351,7 @@ wxSize wxToolBar::DoGetBestSize() const
         // 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
@@ -1210,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
     {
@@ -1222,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