* Fixed wxStaticBitmap::SetBitmap so that it does not ignore the mask
* Hopefully made possible use SetBitmap with as wxSB created with an icon and SetIcon with a wxSB created with a bitmap git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
e37177c27b
commit
d8bffc1335
@ -75,6 +75,7 @@ protected:
|
||||
bool ImageIsOk() const;
|
||||
|
||||
void SetImage(const wxGDIImage* image);
|
||||
void SetImageNoCopy( wxGDIImage* image );
|
||||
|
||||
// we can have either an icon or a bitmap
|
||||
bool m_isIcon;
|
||||
|
@ -54,6 +54,42 @@ IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
|
||||
// wxStaticBitmap
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// we may have either bitmap or icon: if a bitmap with mask is passed, we
|
||||
// will transform it to an icon ourselves because otherwise the mask will
|
||||
// be ignored by Windows
|
||||
// note that this function will create a new object every time
|
||||
// it is called even if the image needs no conversion
|
||||
|
||||
#ifndef __WIN16__
|
||||
|
||||
static wxGDIImage* ConvertImage( const wxGDIImage& bitmap )
|
||||
{
|
||||
bool isIcon = bitmap.IsKindOf( CLASSINFO(wxIcon) );
|
||||
|
||||
if( !isIcon )
|
||||
{
|
||||
wxASSERT_MSG( wxDynamicCast(&bitmap, wxBitmap),
|
||||
_T("not an icon and not a bitmap?") );
|
||||
|
||||
const wxBitmap& bmp = (const wxBitmap&)bitmap;
|
||||
wxMask *mask = bmp.GetMask();
|
||||
if ( mask && mask->GetMaskBitmap() )
|
||||
{
|
||||
wxIcon* icon = new wxIcon;
|
||||
icon->CopyFromBitmap(bmp);
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
return new wxBitmap( bmp );
|
||||
}
|
||||
|
||||
// copying a bitmap is a cheap operation
|
||||
return new wxIcon( (const wxIcon&)bitmap );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
|
||||
const wxGDIImage& bitmap,
|
||||
const wxPoint& pos,
|
||||
@ -85,26 +121,17 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
|
||||
// we may have either bitmap or icon: if a bitmap with mask is passed, we
|
||||
// will transform it to an icon ourselves because otherwise the mask will
|
||||
// be ignored by Windows
|
||||
wxIcon *icon = (wxIcon *)NULL;
|
||||
wxGDIImage *image = (wxGDIImage *)NULL;
|
||||
m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon));
|
||||
|
||||
#ifdef __WIN16__
|
||||
wxASSERT_MSG( !m_isIcon, "Icons are not supported in wxStaticBitmap under WIN16." );
|
||||
image = &bitmap;
|
||||
#endif
|
||||
|
||||
#ifndef __WIN16__
|
||||
if ( !m_isIcon )
|
||||
{
|
||||
const wxBitmap& bmp = (const wxBitmap&)bitmap;
|
||||
wxMask *mask = bmp.GetMask();
|
||||
if ( mask && mask->GetMaskBitmap() )
|
||||
{
|
||||
icon = new wxIcon;
|
||||
icon->CopyFromBitmap(bmp);
|
||||
|
||||
m_isIcon = TRUE;
|
||||
}
|
||||
}
|
||||
image = ConvertImage( bitmap );
|
||||
m_isIcon = image->IsKindOf( CLASSINFO(wxIcon) );
|
||||
#endif
|
||||
|
||||
#ifdef __WIN32__
|
||||
@ -136,8 +163,8 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
|
||||
|
||||
wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
|
||||
|
||||
SetImage(icon ? icon : &bitmap);
|
||||
delete icon; // may be NULL, ok
|
||||
// no need to delete the new image
|
||||
SetImageNoCopy( image );
|
||||
|
||||
// Subclass again for purposes of dialog editing mode
|
||||
SubclassWin(m_hWnd);
|
||||
@ -169,24 +196,18 @@ wxSize wxStaticBitmap::DoGetBestSize() const
|
||||
}
|
||||
|
||||
void wxStaticBitmap::SetImage( const wxGDIImage* image )
|
||||
{
|
||||
wxGDIImage* convertedImage = ConvertImage( *image );
|
||||
SetImageNoCopy( convertedImage );
|
||||
}
|
||||
|
||||
void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
|
||||
{
|
||||
Free();
|
||||
|
||||
const wxIcon *icon = wxDynamicCast(image, wxIcon);
|
||||
m_isIcon = icon != NULL;
|
||||
if ( m_isIcon )
|
||||
{
|
||||
m_image = new wxIcon(*icon);
|
||||
}
|
||||
else
|
||||
{
|
||||
wxASSERT_MSG( wxDynamicCast(image, wxBitmap),
|
||||
_T("not an icon and not a bitmap?") );
|
||||
|
||||
const wxBitmap *bitmap = (wxBitmap *)image;
|
||||
|
||||
m_image = new wxBitmap(*bitmap);
|
||||
}
|
||||
m_isIcon = image->IsKindOf( CLASSINFO(wxIcon) );
|
||||
// the image has already been copied
|
||||
m_image = image;
|
||||
|
||||
int x, y;
|
||||
int w, h;
|
||||
@ -195,6 +216,9 @@ void wxStaticBitmap::SetImage(const wxGDIImage* image)
|
||||
|
||||
#ifdef __WIN32__
|
||||
HANDLE handle = (HANDLE)m_image->GetHandle();
|
||||
LONG style = ::GetWindowLong( (HWND)GetHWND(), GWL_STYLE ) ;
|
||||
::SetWindowLong( (HWND)GetHWND(), GWL_STYLE, ( style & ~( SS_BITMAP|SS_ICON ) ) |
|
||||
( m_isIcon ? SS_ICON : SS_BITMAP ) );
|
||||
::SendMessage(GetHwnd(), STM_SETIMAGE,
|
||||
m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
|
||||
#endif // Win32
|
||||
|
Loading…
Reference in New Issue
Block a user