m_defaultWidth = DEFAULTBITMAPX;
m_defaultHeight = DEFAULTBITMAPY;
- m_pInTool = 0;
+ m_pInTool = NULL;
}
bool wxToolBar::Create(wxWindow *parent,
// toolbar-specific post initialisation
::SendMessage(GetHwnd(), TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
+#ifdef TB_SETEXTENDEDSTYLE
+ if ( wxApp::GetComCtl32Version() >= 471 )
+ ::SendMessage(GetHwnd(), TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS);
+#endif
+
return true;
}
button.fsStyle = TBSTYLE_BUTTON;
break;
+ case wxITEM_DROPDOWN:
+ button.fsStyle = TBSTYLE_DROPDOWN;
+ break;
+
default:
wxFAIL_MSG( _T("unexpected toolbar button kind") );
button.fsStyle = TBSTYLE_BUTTON;
WXLPARAM lParam,
WXLPARAM *WXUNUSED(result))
{
+ LPNMHDR hdr = (LPNMHDR)lParam;
+ if ( hdr->code == TBN_DROPDOWN )
+ {
+ LPNMTOOLBAR tbhdr = (LPNMTOOLBAR)lParam;
+
+ wxCommandEvent evt(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, tbhdr->iItem);
+ if ( GetEventHandler()->ProcessEvent(evt) )
+ {
+ // Event got handled, don't display default popup menu
+ return false;
+ }
+
+ const wxToolBarToolBase * const tool = FindById(tbhdr->iItem);
+ wxCHECK_MSG( tool, false, _T("drop down message for unknown tool") );
+
+ wxMenu * const menu = tool->GetDropdownMenu();
+ if ( !menu )
+ return false;
+
+ // Display popup menu below button
+ RECT r;
+ if (::SendMessage(GetHwnd(), TB_GETITEMRECT, GetToolPos(tbhdr->iItem), (LPARAM)&r))
+ PopupMenu(menu, r.left, r.bottom);
+
+ return true;
+ }
+
+
if( !HasFlag(wxTB_NO_TOOLTIPS) )
{
#if wxUSE_TOOLTIPS
// First check if this applies to us
- NMHDR *hdr = (NMHDR *)lParam;
// the tooltips control created by the toolbar is sometimes Unicode, even
// in an ANSI application - this seems to be a bug in comctl32.dll v5
void wxToolBar::OnMouseEvent(wxMouseEvent& event)
{
- if (event.Leaving() && m_pInTool)
+ if ( event.Leaving() )
{
- OnMouseEnter( -1 );
+ if ( m_pInTool )
+ {
+ OnMouseEnter(wxID_ANY);
+ m_pInTool = NULL;
+ }
+
event.Skip();
return;
}
RECT rect = wxGetClientRect(GetHwnd());
HDC hdc = GetHdcOf((*event.GetDC()));
+ int majorVersion, minorVersion;
+ wxGetOsVersion(& majorVersion, & minorVersion);
+
#if wxUSE_UXTHEME
// we may need to draw themed colour so that we appear correctly on
// e.g. notebook page under XP with themes but only do it if the parent
wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr);
}
}
+
+ // Only draw a rebar theme on Vista, since it doesn't jive so well with XP
+ if ( !UseBgCol() && majorVersion >= 6 )
+ {
+ wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive();
+ if ( theme )
+ {
+ wxUxThemeHandle hTheme(this, L"REBAR");
+
+ RECT r;
+ wxRect rect = GetClientRect();
+ wxCopyRectToRECT(rect, r);
+
+ HRESULT hr = theme->DrawThemeBackground(hTheme, hdc, 0, 0, & r, NULL);
+ if ( hr == S_OK )
+ return;
+
+ // it can also return S_FALSE which seems to simply say that it
+ // didn't draw anything but no error really occurred
+ if ( FAILED(hr) )
+ wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr);
+ }
+ }
+
#endif // wxUSE_UXTHEME
if ( UseBgCol() || (GetMSWToolbarStyle() & TBSTYLE_TRANSPARENT) )
// no controls, nothing to erase
return false;
+ wxSize clientSize = GetClientSize();
+ int majorVersion, minorVersion;
+ wxGetOsVersion(& majorVersion, & minorVersion);
+
// prepare the DC on which we'll be drawing
wxClientDC dc(this);
dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID));
// does it intersect the control?
wxRect rectItem;
wxCopyRECTToRect(r, rectItem);
- if ( rectCtrl.Intersects(rectItem) )
+ if ( rectCtrl.Intersects(rectItem) || (staticText && rectStaticText.Intersects(rectItem)))
{
// yes, do erase it!
- dc.DrawRectangle(rectItem);
+ bool haveRefreshed = false;
+
+#if wxUSE_UXTHEME
+ if ( !UseBgCol() && !GetParent()->UseBgCol() )
+ {
+ // Don't use DrawThemeBackground
+ }
+ else if ( !UseBgCol() && majorVersion >= 6 )
+ {
+ wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive();
+ if ( theme )
+ {
+ wxUxThemeHandle hTheme(this, L"REBAR");
+
+ RECT clipRect = r;
+
+ // Draw the whole background since the pattern may be position sensitive;
+ // but clip it to the area of interest.
+ r.left = 0;
+ r.right = clientSize.x;
+ r.top = 0;
+ r.bottom = clientSize.y;
+
+ HRESULT hr = theme->DrawThemeBackground(hTheme, (HDC) dc.GetHDC(), 0, 0, & r, & clipRect);
+ if ( hr == S_OK )
+ haveRefreshed = true;
+ }
+ }
+#endif
+
+ if (!haveRefreshed)
+ dc.DrawRectangle(rectItem);
+ }
+
+ if ( rectCtrl.Intersects(rectItem) )
+ {
// Necessary in case we use a no-paint-on-size
// style in the parent: the controls can disappear
control->Refresh(false);
- }
+ }
+
if ( staticText && rectStaticText.Intersects(rectItem) )
{
- // yes, do erase it!
- dc.DrawRectangle(rectItem);
-
// Necessary in case we use a no-paint-on-size
// style in the parent: the controls can disappear
staticText->Refresh(false);
y = GET_Y_LPARAM(lParam);
wxToolBarToolBase* tool = FindToolForPosition( x, y );
- // cursor left current tool
- if ( tool != m_pInTool && !tool )
- {
- m_pInTool = 0;
- OnMouseEnter( -1 );
- }
-
- // cursor entered a tool
- if ( tool != m_pInTool && tool )
+ // has the current tool changed?
+ if ( tool != m_pInTool )
{
m_pInTool = tool;
- OnMouseEnter( tool->GetId() );
+ OnMouseEnter(tool ? tool->GetId() : wxID_ANY);
}
}