X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/59af881e445d3343b0ab5ed24f92d21a524c5a9f..669c595dafb825d27fda99fcde39ad2fc88e0db3:/src/msw/imaglist.cpp?ds=inline diff --git a/src/msw/imaglist.cpp b/src/msw/imaglist.cpp index ca19520082..7a42766424 100644 --- a/src/msw/imaglist.cpp +++ b/src/msw/imaglist.cpp @@ -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" @@ -28,27 +24,25 @@ #pragma hdrstop #endif -#if defined(__WIN95__) - #ifndef WX_PRECOMP #include "wx/window.h" #include "wx/icon.h" #include "wx/dc.h" #include "wx/string.h" #include "wx/dcmemory.h" + #include "wx/intl.h" + #include "wx/log.h" #include #endif -#include "wx/log.h" -#include "wx/intl.h" +#include "wx/image.h" #include "wx/msw/imaglist.h" #include "wx/msw/private.h" -#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)) - #include -#endif +// include "properly" +#include "wx/msw/wrapcctl.h" // ---------------------------------------------------------------------------- // wxWin macros @@ -202,7 +196,7 @@ bool wxImageList::Replace(int index, GetHbitmapOf(bitmap), hbmpMask) != 0; if ( !ok ) { - wxLogLastError(wxT("ImageList_Add()")); + wxLogLastError(wxT("ImageList_Replace()")); } ::DeleteObject(hbmpMask); @@ -213,7 +207,7 @@ bool wxImageList::Replace(int index, // Replaces a bitmap and mask from an icon. bool wxImageList::Replace(int i, const wxIcon& icon) { - bool ok = ImageList_ReplaceIcon(GetHImageList(), i, GetHiconOf(icon)) != 0; + bool ok = ImageList_ReplaceIcon(GetHImageList(), i, GetHiconOf(icon)) != -1; if ( !ok ) { wxLogLastError(wxT("ImageList_ReplaceIcon()")); @@ -293,6 +287,65 @@ bool wxImageList::Draw(int index, return ok; } +// Get the bitmap +wxBitmap wxImageList::GetBitmap(int index) const +{ +#if wxUSE_WXDIB + 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); +#else + wxBitmap bitmap; +#endif + 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 // ---------------------------------------------------------------------------- @@ -338,6 +391,3 @@ static HBITMAP GetMaskForImage(const wxBitmap& bitmap, const wxBitmap& mask) return hbmpMaskInv; } - -#endif // Win95 -