X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..0ad966eeac4c245a745c6a2056613f9c7367e4b2:/src/msw/imaglist.cpp?ds=sidebyside diff --git a/src/msw/imaglist.cpp b/src/msw/imaglist.cpp index 42db9c1986..39c071e1fd 100644 --- a/src/msw/imaglist.cpp +++ b/src/msw/imaglist.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "imaglist.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -42,6 +38,7 @@ #include "wx/log.h" #include "wx/intl.h" +#include "wx/image.h" #include "wx/msw/imaglist.h" #include "wx/msw/private.h" @@ -85,15 +82,16 @@ bool wxImageList::Create(int width, int height, bool mask, int initial) UINT flags = 0; // set appropriate color depth - int dd = wxDisplayDepth(); #ifdef __WXWINCE__ flags |= ILC_COLOR; #else - if (dd <= 4) flags |= ILC_COLOR; // 16 color - else if (dd <= 8) flags |= ILC_COLOR8; // 256 color - else if (dd <= 16) flags |= ILC_COLOR16; // 64k hi-color - else if (dd <= 24) flags |= ILC_COLOR24; // 16m truecolor - else if (dd <= 32) flags |= ILC_COLOR32; // 16m truecolor + int dd = wxDisplayDepth(); + + if (dd <= 4) flags |= ILC_COLOR; // 16 color + else if (dd <= 8) flags |= ILC_COLOR8; // 256 color + else if (dd <= 16) flags |= ILC_COLOR16; // 64k hi-color + else if (dd <= 24) flags |= ILC_COLOR24; // 16m truecolor + else if (dd <= 32) flags |= ILC_COLOR32; // 16m truecolor #endif if ( mask ) @@ -201,7 +199,7 @@ bool wxImageList::Replace(int index, GetHbitmapOf(bitmap), hbmpMask) != 0; if ( !ok ) { - wxLogLastError(wxT("ImageList_Add()")); + wxLogLastError(wxT("ImageList_Replace()")); } ::DeleteObject(hbmpMask); @@ -245,11 +243,11 @@ bool wxImageList::RemoveAll() (void)Remove(0); } - return TRUE; + return true; } // Draws the given image on a dc at the specified position. -// If 'solidBackground' is TRUE, Draw sets the image list background +// If 'solidBackground' is true, Draw sets the image list background // colour to the background colour of the wxDC, to speed up // drawing by eliminating masked drawing where possible. bool wxImageList::Draw(int index, @@ -259,7 +257,7 @@ bool wxImageList::Draw(int index, bool solidBackground) { HDC hDC = GetHdcOf(dc); - wxCHECK_MSG( hDC, FALSE, _T("invalid wxDC in wxImageList::Draw") ); + wxCHECK_MSG( hDC, false, _T("invalid wxDC in wxImageList::Draw") ); COLORREF clr = CLR_NONE; // transparent by default if ( solidBackground ) @@ -292,6 +290,62 @@ bool wxImageList::Draw(int index, return ok; } +// Get the bitmap +wxBitmap wxImageList::GetBitmap(int index) const +{ + int bmp_width = 0, bmp_height = 0; + GetSize(index, bmp_width, bmp_height); + + wxBitmap bitmap(bmp_width, bmp_height); + wxMemoryDC dc; + dc.SelectObject(bitmap); + + // draw it the first time to find a suitable mask colour + ((wxImageList*)this)->Draw(index, dc, 0, 0, wxIMAGELIST_DRAW_TRANSPARENT); + dc.SelectObject(wxNullBitmap); + + // find the suitable mask colour + wxImage image = bitmap.ConvertToImage(); + unsigned char r = 0, g = 0, b = 0; + image.FindFirstUnusedColour(&r, &g, &b); + + // redraw whole image and bitmap in the mask colour + image.Create(bmp_width, bmp_height); + image.Replace(0, 0, 0, r, g, b); + bitmap = wxBitmap(image); + + // redraw icon over the mask colour to actually draw it + dc.SelectObject(bitmap); + ((wxImageList*)this)->Draw(index, dc, 0, 0, wxIMAGELIST_DRAW_TRANSPARENT); + dc.SelectObject(wxNullBitmap); + + // get the image, set the mask colour and convert back to get transparent bitmap + image = bitmap.ConvertToImage(); + image.SetMaskColour(r, g, b); + bitmap = wxBitmap(image); + + return bitmap; +} + +// Get the icon +wxIcon wxImageList::GetIcon(int index) const +{ + HICON hIcon = ImageList_ExtractIcon(0, GetHImageList(), index); + if (hIcon) + { + wxIcon icon; + icon.SetHICON((WXHICON)hIcon); + + int iconW, iconH; + GetSize(index, iconW, iconH); + icon.SetSize(iconW, iconH); + + return icon; + } + else + return wxNullIcon; +} + // ---------------------------------------------------------------------------- // helpers // ---------------------------------------------------------------------------- @@ -300,7 +354,7 @@ static HBITMAP GetMaskForImage(const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmpMask; wxMask *pMask; - bool deleteMask = FALSE; + bool deleteMask = false; if ( mask.Ok() ) { @@ -321,7 +375,7 @@ static HBITMAP GetMaskForImage(const wxBitmap& bitmap, const wxBitmap& mask) pMask = new wxMask(bitmap, col); - deleteMask = TRUE; + deleteMask = true; } hbmpMask = (HBITMAP)pMask->GetMaskBitmap();