#endif
#include "wx/msw/private.h"
+#include "wx/image.h"
// ----------------------------------------------------------------------------
// macros
IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
#endif
+BEGIN_EVENT_TABLE(wxBitmapButton, wxBitmapButtonBase)
+ EVT_SYS_COLOUR_CHANGED(wxBitmapButton::OnSysColourChanged)
+END_EVENT_TABLE()
+
/*
TODO PROPERTIES :
return true;
}
+bool wxBitmapButton::SetBackgroundColour(const wxColour& colour)
+{
+ if ( !wxBitmapButtonBase::SetBackgroundColour(colour) )
+ {
+ // didn't change
+ return false;
+ }
+
+ // invalidate the brush, it will be recreated the next time it's needed
+ m_brushDisabled = wxNullBrush;
+
+ return true;
+}
+
+void wxBitmapButton::OnSysColourChanged(wxSysColourChangedEvent& event)
+{
+ m_brushDisabled = wxNullBrush;
+
+ if ( !IsEnabled() )
+ {
+ // this change affects our current state
+ Refresh();
+ }
+
+ event.Skip();
+}
+
// VZ: should be at the very least less than wxDEFAULT_BUTTON_MARGIN
#define FOCUS_MARGIN 3
DrawFocusRect( (HDC) dc, &rect );
}
-extern HBRUSH wxDisableButtonBrush;
-void wxBitmapButton::DrawButtonDisable( WXHDC dc, int left, int top, int right,
- int bottom, bool with_marg )
+void
+wxBitmapButton::DrawButtonDisable( WXHDC dc,
+ int left, int top, int right, int bottom,
+ bool with_marg )
{
- HBRUSH old = (HBRUSH) SelectObject( (HDC) dc, wxDisableButtonBrush );
+ if ( !m_brushDisabled.Ok() )
+ {
+ // draw a bitmap with two black and two background colour pixels
+ wxBitmap bmp(2, 2);
+ wxMemoryDC dc;
+ dc.SelectObject(bmp);
+ dc.SetPen(*wxBLACK_PEN);
+ dc.DrawPoint(0, 0);
+ dc.DrawPoint(1, 1);
+ dc.SetPen(GetBackgroundColour());
+ dc.DrawPoint(0, 1);
+ dc.DrawPoint(1, 0);
+
+ m_brushDisabled = wxBrush(bmp);
+ }
+
+ SelectInHDC selectBrush((HDC)dc, GetHbrushOf(m_brushDisabled));
// ROP for "dest |= pattern" operation -- as it doesn't have a standard
// name, give it our own
}
::PatBlt( (HDC) dc, left, top, right, bottom, PATTERNPAINT);
-
- ::SelectObject( (HDC) dc, old );
}
void wxBitmapButton::SetDefault()
wxSize wxBitmapButton::DoGetBestSize() const
{
- wxSize best;
- if (m_bmpNormal.Ok())
- {
- best.x = m_bmpNormal.GetWidth() + 2*m_marginX;
- best.y = m_bmpNormal.GetHeight() + 2*m_marginY;
- }
-
- // all buttons have at least the standard size unless the user explicitly
- // wants them to be of smaller size and used wxBU_EXACTFIT style when
- // creating the button
- if ( !HasFlag(wxBU_EXACTFIT) )
+ if ( m_bmpNormal.Ok() )
{
- wxSize sz = GetDefaultSize();
- if (best.x > sz.x)
- sz.x = best.x;
- if (best.y > sz.y)
- sz.y = best.y;
+ wxSize best(m_bmpNormal.GetWidth() + 2*m_marginX,
+ m_bmpNormal.GetHeight() + 2*m_marginY);
+ CacheBestSize(best);
+ return best;
}
- return best;
+ // no idea what our best size should be, defer to the base class
+ return wxBitmapButtonBase::DoGetBestSize();
}
#endif // wxUSE_BMPBUTTON