Use kControlContentIconRef in SetBitmapLabel for wxBORDER_NONE buttons.

Factor out code to create a standard sized bitmap so it can be used in
SetBitmapLabel too.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@49358 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2007-10-23 18:27:52 +00:00
parent 3815803a84
commit eb0144e8b1

View File

@@ -23,6 +23,63 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
#include "wx/mac/uma.h" #include "wx/mac/uma.h"
//---------------------------------------------------------------------------
// Helper functions
static wxBitmap wxMakeStdSizeBitmap(const wxBitmap& bitmap)
{
// in Mac OS X the icon controls (which are used for borderless bitmap
// buttons) can have only one of the few standard sizes and if they
// don't, the OS rescales them automatically resulting in really ugly
// images, so centre the image in a square of standard size instead
// the supported sizes, sorted in decreasng order
static const int stdSizes[] = { 128, 48, 32, 16, 0 };
const int width = bitmap.GetWidth();
const int height = bitmap.GetHeight();
wxBitmap newBmp(bitmap);
int n;
for ( n = 0; n < (int)WXSIZEOF(stdSizes); n++ )
{
const int sizeStd = stdSizes[n];
if ( width > sizeStd || height > sizeStd )
{
// it will become -1 if the bitmap is larger than the biggest
// supported size, this is intentional
n--;
break;
}
}
if ( n != -1 )
{
const int sizeStd = stdSizes[n];
if ( width != sizeStd || height != sizeStd )
{
wxASSERT_MSG( width <= sizeStd && height <= sizeStd,
_T("bitmap shouldn't be cropped") );
newBmp.Create(sizeStd, sizeStd);
wxMemoryDC dcMem;
dcMem.SelectObject(newBmp);
dcMem.Clear();
dcMem.DrawBitmap(bitmap,
(sizeStd - width)/2, (sizeStd-height)/2,
true);
}
}
//else: let the system rescale the bitmap
return newBmp;
}
//---------------------------------------------------------------------------
bool wxBitmapButton::Create( wxWindow *parent, bool wxBitmapButton::Create( wxWindow *parent,
wxWindowID id, const wxBitmap& bitmap, wxWindowID id, const wxBitmap& bitmap,
const wxPoint& pos, const wxPoint& pos,
@@ -56,54 +113,8 @@ bool wxBitmapButton::Create( wxWindow *parent,
m_peer = new wxMacControl( this ); m_peer = new wxMacControl( this );
if ( bitmap.Ok() && HasFlag(wxBORDER_NONE) ) if ( bitmap.Ok() && HasFlag(wxBORDER_NONE) )
{ m_bmpNormal = wxMakeStdSizeBitmap(bitmap);
// in Mac OS X the icon controls (which are used for borderless bitmap else
// buttons) can have only one of the few standard sizes and if they
// don't, the OS rescales them automatically resulting in really ugly
// images, so centre the image in a square of standard size instead
// the supported sizes, sorted in decreasng order
static const int stdSizes[] = { 128, 48, 32, 16, 0 };
const int width = bitmap.GetWidth();
const int height = bitmap.GetHeight();
int n;
for ( n = 0; n < (int)WXSIZEOF(stdSizes); n++ )
{
const int sizeStd = stdSizes[n];
if ( width > sizeStd || height > sizeStd )
{
// it will become -1 if the bitmap is larger than the biggest
// supported size, this is intentional
n--;
break;
}
}
if ( n != -1 )
{
const int sizeStd = stdSizes[n];
if ( width != sizeStd || height != sizeStd )
{
wxASSERT_MSG( width <= sizeStd && height <= sizeStd,
_T("bitmap shouldn't be cropped") );
m_bmpNormal.Create(sizeStd, sizeStd);
wxMemoryDC dcMem;
dcMem.SelectObject(m_bmpNormal);
dcMem.Clear();
dcMem.DrawBitmap(bitmap,
(sizeStd - width)/2, (sizeStd-height)/2,
true);
}
}
//else: let the system rescale the bitmap
}
if ( !m_bmpNormal.Ok() )
m_bmpNormal = bitmap; m_bmpNormal = bitmap;
@@ -138,7 +149,11 @@ bool wxBitmapButton::Create( wxWindow *parent,
void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap ) void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap )
{ {
m_bmpNormal = bitmap; if ( HasFlag( wxBORDER_NONE ) )
m_bmpNormal = wxMakeStdSizeBitmap(bitmap);
else
m_bmpNormal = bitmap;
InvalidateBestSize(); InvalidateBestSize();
ControlButtonContentInfo info; ControlButtonContentInfo info;
@@ -146,7 +161,7 @@ void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap )
#ifdef __WXMAC_OSX__ #ifdef __WXMAC_OSX__
if ( HasFlag( wxBORDER_NONE ) ) if ( HasFlag( wxBORDER_NONE ) )
{ {
wxMacCreateBitmapButton( &info, m_bmpNormal ); wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef );
if ( info.contentType != kControlNoContent ) if ( info.contentType != kControlNoContent )
m_peer->SetData( kControlIconPart, kControlIconContentTag, info ); m_peer->SetData( kControlIconPart, kControlIconContentTag, info );
} }