#ifndef WX_PRECOMP
#include "wx/log.h"
#include "wx/dcmemory.h"
+ #include "wx/image.h"
#endif
#include "wx/msw/private.h"
-#include "wx/image.h"
#include "wx/msw/uxtheme.h"
SubclassWin(m_hWnd);
SetPosition(pos);
- SetBestSize(size);
+ SetInitialSize(size);
return true;
}
}
// draw the bitmap
- wxClientDC dst;
- dst.SetHDC((WXHDC) hDC, false);
+ wxDCTemp dst((WXHDC)hDC);
dst.DrawBitmap(*bitmap, x1, y1, true);
return true;
{
if ( m_bmpNormal.Ok() )
{
+ int width = m_bmpNormal.GetWidth(),
+ height = m_bmpNormal.GetHeight();
+ int marginH = 0,
+ marginV = 0;
+
#if wxUSE_UXTHEME
- if ( (GetWindowStyleFlag() & wxBU_AUTODRAW) && wxUxThemeEngine::GetIfActive() )
+ if ( wxUxThemeEngine::GetIfActive() )
{
wxUxThemeHandle theme((wxBitmapButton *)this, L"BUTTON");
- // calculate content area margins
- // assuming here that each state is the same size
MARGINS margins;
wxUxThemeEngine::Get()->GetThemeMargins(theme, NULL,
BP_PUSHBUTTON, PBS_NORMAL,
TMT_CONTENTMARGINS, NULL,
&margins);
- wxSize best(m_bmpNormal.GetWidth() + 2 * (margins.cxLeftWidth + 1),
- m_bmpNormal.GetHeight() + 2* (margins.cyTopHeight + 1));
- CacheBestSize(best);
- return best;
+
+ // XP doesn't draw themed buttons correctly when the client area is
+ // smaller than 8x8 - enforce this minimum size for small bitmaps
+ if ( width < 8 )
+ width = 8;
+ if ( height < 8 )
+ height = 8;
+
+ // don't add margins for the borderless buttons, they don't need
+ // them and it just makes them appear larger than needed
+ if ( !HasFlag(wxBORDER_NONE) )
+ {
+ // we need 2 extra pixels for the focus rectangle, without them
+ // it's overwritten by the bitmap itself
+ marginH = margins.cxLeftWidth + margins.cxRightWidth + 2;
+ marginV = margins.cyTopHeight + margins.cyBottomHeight + 2;
+ }
}
+ else
#endif // wxUSE_UXTHEME
+ {
+ if ( !HasFlag(wxBORDER_NONE) )
+ {
+ marginH = 2*m_marginX;
+ marginV = 2*m_marginY;
+ }
+ }
- wxSize best(m_bmpNormal.GetWidth() + 2*m_marginX,
- m_bmpNormal.GetHeight() + 2*m_marginY);
+ wxSize best(width + marginH, height + marginV);
CacheBestSize(best);
return best;
}