* 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:
Mattia Barbon 2001-11-06 21:16:02 +00:00
parent e37177c27b
commit d8bffc1335
2 changed files with 56 additions and 31 deletions

View File

@ -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;

View File

@ -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