X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9f8845289521c7f53e95b6dfd8275daab8b05639..169adfa9c4b781f737920bc808da91cd926c3e36:/src/msw/bmpbuttn.cpp diff --git a/src/msw/bmpbuttn.cpp b/src/msw/bmpbuttn.cpp index 7788ce8b2b..b8ae50c907 100644 --- a/src/msw/bmpbuttn.cpp +++ b/src/msw/bmpbuttn.cpp @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "bmpbuttn.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -29,6 +25,7 @@ #endif #include "wx/msw/private.h" +#include "wx/image.h" // ---------------------------------------------------------------------------- // macros @@ -47,7 +44,7 @@ wxBEGIN_FLAGS( wxBitmapButtonStyle ) wxFLAGS_MEMBER(wxBORDER_RAISED) wxFLAGS_MEMBER(wxBORDER_STATIC) wxFLAGS_MEMBER(wxBORDER_NONE) - + // old style border flags wxFLAGS_MEMBER(wxSIMPLE_BORDER) wxFLAGS_MEMBER(wxSUNKEN_BORDER) @@ -88,6 +85,10 @@ wxCONSTRUCTOR_5( wxBitmapButton , wxWindow* , Parent , wxWindowID , Id , wxBitma IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) #endif +BEGIN_EVENT_TABLE(wxBitmapButton, wxBitmapButtonBase) + EVT_SYS_COLOUR_CHANGED(wxBitmapButton::OnSysColourChanged) +END_EVENT_TABLE() + /* TODO PROPERTIES : @@ -98,8 +99,6 @@ bitmap "focus" , bitmap "disabled" , */ -#define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1) - bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, const wxPoint& pos, @@ -126,7 +125,7 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, m_marginY = wxDEFAULT_BUTTON_MARGIN; } - if (id == -1) + if (id == wxID_ANY) m_windowId = NewControlId(); else m_windowId = id; @@ -168,6 +167,33 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, 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 @@ -415,11 +441,28 @@ void wxBitmapButton::DrawButtonFocus( WXHDC dc, int left, int top, int right, 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 @@ -434,8 +477,6 @@ void wxBitmapButton::DrawButtonDisable( WXHDC dc, int left, int top, int right, } ::PatBlt( (HDC) dc, left, top, right, bottom, PATTERNPAINT); - - ::SelectObject( (HDC) dc, old ); } void wxBitmapButton::SetDefault() @@ -445,26 +486,16 @@ 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