// 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"
#include "wx/msw/private.h"
#include "wx/image.h"
+#include "wx/msw/uxtheme.h"
// ----------------------------------------------------------------------------
// macros
BEGIN_EVENT_TABLE(wxBitmapButton, wxBitmapButtonBase)
EVT_SYS_COLOUR_CHANGED(wxBitmapButton::OnSysColourChanged)
+ EVT_ENTER_WINDOW(wxBitmapButton::OnMouseEnterOrLeave)
+ EVT_LEAVE_WINDOW(wxBitmapButton::OnMouseEnterOrLeave)
END_EVENT_TABLE()
/*
bitmap "disabled" ,
*/
-#define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1)
-
bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id,
const wxBitmap& bitmap,
const wxPoint& pos,
if ( style & wxBU_AUTODRAW )
{
- m_marginX = wxDEFAULT_BUTTON_MARGIN;
- m_marginY = wxDEFAULT_BUTTON_MARGIN;
+ m_marginX =
+ m_marginY = 4;
}
if (id == wxID_ANY)
event.Skip();
}
+void wxBitmapButton::OnMouseEnterOrLeave(wxMouseEvent& event)
+{
+ if ( IsEnabled() && m_bmpHover.Ok() )
+ Refresh();
+
+ event.Skip();
+}
+
+void wxBitmapButton::OnSetBitmap()
+{
+ // if the focus bitmap is specified but hover one isn't, use the focus
+ // bitmap for hovering as well if this is consistent with the current
+ // Windows version look and feel
+ //
+ // rationale: this is compatible with the old wxGTK behaviour and also
+ // makes it much easier to do "the right thing" for all platforms (some of
+ // them, such as Windows XP, have "hot" buttons while others don't)
+ if ( !m_bmpHover.Ok() &&
+ m_bmpFocus.Ok() &&
+ wxUxThemeEngine::GetIfActive() )
+ {
+ m_bmpHover = m_bmpFocus;
+ }
+
+ // this will redraw us
+ wxBitmapButtonBase::OnSetBitmap();
+}
+
// VZ: should be at the very least less than wxDEFAULT_BUTTON_MARGIN
#define FOCUS_MARGIN 3
// choose the bitmap to use depending on the button state
- wxBitmap* bitmap;
+ wxBitmap *bitmap;
if ( isSelected && m_bmpSelected.Ok() )
bitmap = &m_bmpSelected;
+ else if ( m_bmpHover.Ok() && IsMouseInWindow() )
+ bitmap = &m_bmpHover;
else if ((state & ODS_FOCUS) && m_bmpFocus.Ok())
bitmap = &m_bmpFocus;
else if ((state & ODS_DISABLED) && m_bmpDisabled.Ok())
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 )
- best.x = sz.x;
- if ( best.y < sz.y )
- best.y = sz.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