#endif
#include "wx/msw/private.h"
+#include "wx/image.h"
// ----------------------------------------------------------------------------
// macros
wxFLAGS_MEMBER(wxBORDER_RAISED)
wxFLAGS_MEMBER(wxBORDER_STATIC)
wxFLAGS_MEMBER(wxBORDER_NONE)
-
+
// old style border flags
wxFLAGS_MEMBER(wxSIMPLE_BORDER)
wxFLAGS_MEMBER(wxSUNKEN_BORDER)
IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
#endif
+BEGIN_EVENT_TABLE(wxBitmapButton, wxBitmapButtonBase)
+ EVT_SYS_COLOUR_CHANGED(wxBitmapButton::OnSysColourChanged)
+END_EVENT_TABLE()
+
/*
TODO PROPERTIES :
m_marginY = wxDEFAULT_BUTTON_MARGIN;
}
- int x = pos.x;
- int y = pos.y;
- int width = size.x;
- int height = size.y;
-
- if (id == -1)
+ if (id == wxID_ANY)
m_windowId = NewControlId();
else
m_windowId = id;
- if ( bitmap.Ok() )
- {
- wxSize newSize = DoGetBestSize();
- if ( width == -1 )
- width = newSize.x;
- if ( height == -1 )
- height = newSize.y;
- }
-
long msStyle = WS_VISIBLE | WS_TABSTOP | WS_CHILD | BS_OWNERDRAW ;
if ( m_windowStyle & wxCLIP_SIBLINGS )
// Subclass again for purposes of dialog editing mode
SubclassWin(m_hWnd);
- SetFont(parent->GetFont());
+ SetPosition(pos);
+ SetBestSize(size);
+
+ return true;
+}
+
+bool wxBitmapButton::SetBackgroundColour(const wxColour& colour)
+{
+ if ( !wxBitmapButtonBase::SetBackgroundColour(colour) )
+ {
+ // didn't change
+ return false;
+ }
- SetSize(x, y, width, height);
+ // 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