* 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:
@@ -75,6 +75,7 @@ protected:
|
|||||||
bool ImageIsOk() const;
|
bool ImageIsOk() const;
|
||||||
|
|
||||||
void SetImage(const wxGDIImage* image);
|
void SetImage(const wxGDIImage* image);
|
||||||
|
void SetImageNoCopy( wxGDIImage* image );
|
||||||
|
|
||||||
// we can have either an icon or a bitmap
|
// we can have either an icon or a bitmap
|
||||||
bool m_isIcon;
|
bool m_isIcon;
|
||||||
|
@@ -54,6 +54,42 @@ IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
|
|||||||
// wxStaticBitmap
|
// 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,
|
bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
|
||||||
const wxGDIImage& bitmap,
|
const wxGDIImage& bitmap,
|
||||||
const wxPoint& pos,
|
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
|
// 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
|
// will transform it to an icon ourselves because otherwise the mask will
|
||||||
// be ignored by Windows
|
// be ignored by Windows
|
||||||
wxIcon *icon = (wxIcon *)NULL;
|
wxGDIImage *image = (wxGDIImage *)NULL;
|
||||||
m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon));
|
m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon));
|
||||||
|
|
||||||
#ifdef __WIN16__
|
#ifdef __WIN16__
|
||||||
wxASSERT_MSG( !m_isIcon, "Icons are not supported in wxStaticBitmap under WIN16." );
|
wxASSERT_MSG( !m_isIcon, "Icons are not supported in wxStaticBitmap under WIN16." );
|
||||||
|
image = &bitmap;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __WIN16__
|
#ifndef __WIN16__
|
||||||
if ( !m_isIcon )
|
image = ConvertImage( bitmap );
|
||||||
{
|
m_isIcon = image->IsKindOf( CLASSINFO(wxIcon) );
|
||||||
const wxBitmap& bmp = (const wxBitmap&)bitmap;
|
|
||||||
wxMask *mask = bmp.GetMask();
|
|
||||||
if ( mask && mask->GetMaskBitmap() )
|
|
||||||
{
|
|
||||||
icon = new wxIcon;
|
|
||||||
icon->CopyFromBitmap(bmp);
|
|
||||||
|
|
||||||
m_isIcon = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
@@ -136,8 +163,8 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
|
|||||||
|
|
||||||
wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
|
wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
|
||||||
|
|
||||||
SetImage(icon ? icon : &bitmap);
|
// no need to delete the new image
|
||||||
delete icon; // may be NULL, ok
|
SetImageNoCopy( image );
|
||||||
|
|
||||||
// Subclass again for purposes of dialog editing mode
|
// Subclass again for purposes of dialog editing mode
|
||||||
SubclassWin(m_hWnd);
|
SubclassWin(m_hWnd);
|
||||||
@@ -168,25 +195,19 @@ wxSize wxStaticBitmap::DoGetBestSize() const
|
|||||||
return wxWindow::DoGetBestSize();
|
return wxWindow::DoGetBestSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxStaticBitmap::SetImage(const wxGDIImage* image)
|
void wxStaticBitmap::SetImage( const wxGDIImage* image )
|
||||||
|
{
|
||||||
|
wxGDIImage* convertedImage = ConvertImage( *image );
|
||||||
|
SetImageNoCopy( convertedImage );
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
|
||||||
{
|
{
|
||||||
Free();
|
Free();
|
||||||
|
|
||||||
const wxIcon *icon = wxDynamicCast(image, wxIcon);
|
m_isIcon = image->IsKindOf( CLASSINFO(wxIcon) );
|
||||||
m_isIcon = icon != NULL;
|
// the image has already been copied
|
||||||
if ( m_isIcon )
|
m_image = image;
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
int w, h;
|
int w, h;
|
||||||
@@ -195,6 +216,9 @@ void wxStaticBitmap::SetImage(const wxGDIImage* image)
|
|||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
HANDLE handle = (HANDLE)m_image->GetHandle();
|
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,
|
::SendMessage(GetHwnd(), STM_SETIMAGE,
|
||||||
m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
|
m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
|
||||||
#endif // Win32
|
#endif // Win32
|
||||||
|
Reference in New Issue
Block a user