X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57bd4c6031d438f11af0ec540136f49a928b923c..ef8f6d9590b7f9c73dcdfac244647c6e88ebd2ec:/src/msw/imaglist.cpp diff --git a/src/msw/imaglist.cpp b/src/msw/imaglist.cpp index 2b3cfb5c58..b499da63b5 100644 --- a/src/msw/imaglist.cpp +++ b/src/msw/imaglist.cpp @@ -37,7 +37,9 @@ #include #endif -#include "wx/msw/imaglist.h" +#include "wx/imaglist.h" +#include "wx/dc.h" +#include "wx/msw/dc.h" #include "wx/msw/private.h" // ---------------------------------------------------------------------------- @@ -117,7 +119,7 @@ wxImageList::~wxImageList() // Returns the number of images in the image list. int wxImageList::GetImageCount() const { - wxASSERT_MSG( m_hImageList, _T("invalid image list") ); + wxASSERT_MSG( m_hImageList, wxT("invalid image list") ); return ImageList_GetImageCount(GetHImageList()); } @@ -125,7 +127,7 @@ int wxImageList::GetImageCount() const // Returns the size (same for all images) of the images in the list bool wxImageList::GetSize(int WXUNUSED(index), int &width, int &height) const { - wxASSERT_MSG( m_hImageList, _T("invalid image list") ); + wxASSERT_MSG( m_hImageList, wxT("invalid image list") ); return ImageList_GetIconSize(GetHImageList(), &width, &height) != 0; } @@ -228,15 +230,7 @@ bool wxImageList::Remove(int index) bool wxImageList::RemoveAll() { // don't use ImageList_RemoveAll() because mingw32 headers don't have it - int count = ImageList_GetImageCount(GetHImageList()); - for ( int i = 0; i < count; i++ ) - { - // the image indexes are shifted, so we should always remove the first - // one - (void)Remove(0); - } - - return true; + return Remove(-1); } // Draws the given image on a dc at the specified position. @@ -249,8 +243,13 @@ bool wxImageList::Draw(int index, int flags, bool solidBackground) { - HDC hDC = GetHdcOf(dc); - wxCHECK_MSG( hDC, false, _T("invalid wxDC in wxImageList::Draw") ); + wxDCImpl *impl = dc.GetImpl(); + wxMSWDCImpl *msw_impl = wxDynamicCast( impl, wxMSWDCImpl ); + if (!msw_impl) + return false; + + HDC hDC = GetHdcOf(*msw_impl); + wxCHECK_MSG( hDC, false, wxT("invalid wxDC in wxImageList::Draw") ); COLORREF clr = CLR_NONE; // transparent by default if ( solidBackground ) @@ -286,7 +285,7 @@ bool wxImageList::Draw(int index, // Get the bitmap wxBitmap wxImageList::GetBitmap(int index) const { -#if wxUSE_WXDIB +#if wxUSE_WXDIB && wxUSE_IMAGE int bmp_width = 0, bmp_height = 0; GetSize(index, bmp_width, bmp_height); @@ -348,6 +347,10 @@ wxIcon wxImageList::GetIcon(int index) const static HBITMAP GetMaskForImage(const wxBitmap& bitmap, const wxBitmap& mask) { +#if wxUSE_IMAGE + wxBitmap bitmapWithMask; +#endif // wxUSE_IMAGE + HBITMAP hbmpMask; wxMask *pMask; bool deleteMask = false; @@ -360,6 +363,23 @@ static HBITMAP GetMaskForImage(const wxBitmap& bitmap, const wxBitmap& mask) else { pMask = bitmap.GetMask(); + +#if wxUSE_IMAGE + // check if we don't have alpha in this bitmap -- we can create a mask + // from it (and we need to do it for the older systems which don't + // support 32bpp bitmaps natively) + if ( !pMask ) + { + wxImage img(bitmap.ConvertToImage()); + if ( img.HasAlpha() ) + { + img.ConvertAlphaToMask(); + bitmapWithMask = wxBitmap(img); + pMask = bitmapWithMask.GetMask(); + } + } +#endif // wxUSE_IMAGE + if ( !pMask ) { // use the light grey count as transparent: the trouble here is