// Replaces a bitmap, optionally passing a mask bitmap. // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap' and 'mask'. bool wxImageList::Replace(int index, const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmp; #if wxUSE_WXDIB && wxUSE_IMAGE // See the comment in Add() above. AutoHBITMAP hbmpRelease; if ( bitmap.HasAlpha() ) { hbmp = wxDIB(bitmap.ConvertToImage(), wxDIB::PixelFormat_NotPreMultiplied).Detach(); hbmpRelease.Init(hbmp); } else #endif // wxUSE_WXDIB && wxUSE_IMAGE hbmp = GetHbitmapOf(bitmap); AutoHBITMAP hbmpMask(GetMaskForImage(bitmap, mask)); if ( !ImageList_Replace(GetHImageList(), index, hbmp, hbmpMask) ) { wxLogLastError(wxT("ImageList_Replace()")); return false; } return true; }
// Adds a bitmap, using the specified colour to create the mask bitmap // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap'. int wxImageList::Add(const wxBitmap& bitmap, const wxColour& maskColour) { HBITMAP hbmp; #if wxUSE_WXDIB && wxUSE_IMAGE // See the comment in overloaded Add() above. AutoHBITMAP hbmpRelease; if ( bitmap.HasAlpha() ) { hbmp = wxDIB(bitmap.ConvertToImage(), wxDIB::PixelFormat_NotPreMultiplied).Detach(); hbmpRelease.Init(hbmp); } else #endif // wxUSE_WXDIB && wxUSE_IMAGE hbmp = GetHbitmapOf(bitmap); int index = ImageList_AddMasked(GetHImageList(), hbmp, wxColourToRGB(maskColour)); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } return index; }
// Adds a bitmap, and optionally a mask bitmap. // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap' and 'mask'. int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmp; #if wxUSE_WXDIB && wxUSE_IMAGE // wxBitmap normally stores alpha in pre-multiplied format but // ImageList_Draw() does pre-multiplication internally so we need to undo // the pre-multiplication here. Converting back and forth like this is, of // course, very inefficient but it's better than wrong appearance so we do // this for now until a better way can be found. AutoHBITMAP hbmpRelease; if ( bitmap.HasAlpha() ) { hbmp = wxDIB(bitmap.ConvertToImage(), wxDIB::PixelFormat_NotPreMultiplied).Detach(); hbmpRelease.Init(hbmp); } else #endif // wxUSE_WXDIB && wxUSE_IMAGE hbmp = GetHbitmapOf(bitmap); // Use mask only if we don't have alpha, the bitmap isn't drawn correctly // if we use both. AutoHBITMAP hbmpMask; if ( !bitmap.HasAlpha() ) hbmpMask.Init(GetMaskForImage(bitmap, mask)); int index = ImageList_Add(GetHImageList(), hbmp, hbmpMask); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } return index; }
wxImageList::~wxImageList() { if ( m_hImageList ) { ImageList_Destroy(GetHImageList()); m_hImageList = 0; } }
// 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); #if wxUSE_WXDIB && wxUSE_IMAGE IMAGEINFO ii; ImageList_GetImageInfo(GetHImageList(), index, &ii); if ( ii.hbmMask ) { // 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 // no mask { // Just draw it normally. ((wxImageList*)this)->Draw(index, dc, 0, 0, wxIMAGELIST_DRAW_NORMAL); dc.SelectObject(wxNullBitmap); // And adjust its alpha flag as the destination bitmap would get it if // the source one had it. // // Note that perhaps we could just call UseAlpha() which would set the // "has alpha" flag unconditionally as it doesn't seem to do any harm, // but for now only do it if necessary, just to be on the safe side, // even if it requires more work (and takes more time). bitmap.MSWUpdateAlpha(); } #else wxBitmap bitmap; #endif return bitmap; }
// Draws the given image on a dc at the specified position. // 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, wxDC& dc, int x, int y, int flags, bool solidBackground) { 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 ) { const wxBrush& brush = dc.GetBackground(); if ( brush.IsOk() ) { clr = wxColourToRGB(brush.GetColour()); } } ImageList_SetBkColor(GetHImageList(), clr); UINT style = 0; if ( flags & wxIMAGELIST_DRAW_NORMAL ) style |= ILD_NORMAL; if ( flags & wxIMAGELIST_DRAW_TRANSPARENT ) style |= ILD_TRANSPARENT; if ( flags & wxIMAGELIST_DRAW_SELECTED ) style |= ILD_SELECTED; if ( flags & wxIMAGELIST_DRAW_FOCUSED ) style |= ILD_FOCUS; bool ok = ImageList_Draw(GetHImageList(), index, hDC, x, y, style) != 0; if ( !ok ) { wxLogLastError(wxT("ImageList_Draw()")); } return ok; }
// Adds a bitmap and mask from an icon. int wxImageList::Add(const wxIcon& icon) { int index = ImageList_AddIcon(GetHImageList(), GetHiconOf(icon)); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } return index; }
// Removes the image at the given index. bool wxImageList::Remove(int index) { bool ok = ImageList_Remove(GetHImageList(), index) != 0; if ( !ok ) { wxLogLastError(wxT("ImageList_Remove()")); } return ok; }
// Replaces a bitmap and mask from an icon. bool wxImageList::Replace(int i, const wxIcon& icon) { bool ok = ImageList_ReplaceIcon(GetHImageList(), i, GetHiconOf(icon)) != -1; if ( !ok ) { wxLogLastError(wxT("ImageList_ReplaceIcon()")); } return ok; }
// Adds a bitmap, using the specified colour to create the mask bitmap // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap'. int wxImageList::Add(const wxBitmap& bitmap, const wxColour& maskColour) { int index = ImageList_AddMasked(GetHImageList(), GetHbitmapOf(bitmap), wxColourToRGB(maskColour)); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } return index; }
// Adds a bitmap, and optionally a mask bitmap. // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap' and 'mask'. int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmp; bool useMask; #if wxUSE_WXDIB && wxUSE_IMAGE // wxBitmap normally stores alpha in pre-multiplied format but // ImageList_Draw() does pre-multiplication internally so we need to undo // the pre-multiplication here. Converting back and forth like this is, of // course, very inefficient but it's better than wrong appearance so we do // this for now until a better way can be found. AutoHBITMAP hbmpRelease; if ( bitmap.HasAlpha() ) { wxImage img = bitmap.ConvertToImage(); // For comctl32.dll < 6 remove alpha channel from image // to prevent possible interferences with the mask. if ( wxApp::GetComCtl32Version() < 600 ) { img.ClearAlpha(); useMask = true; } else { useMask = false; } hbmp = wxDIB(img, wxDIB::PixelFormat_NotPreMultiplied).Detach(); hbmpRelease.Init(hbmp); } else #endif // wxUSE_WXDIB && wxUSE_IMAGE { hbmp = GetHbitmapOf(bitmap); useMask = true; } // Use mask only if we don't have alpha, the bitmap isn't drawn correctly // if we use both. AutoHBITMAP hbmpMask; if ( useMask ) hbmpMask.Init(GetMaskForImage(bitmap, mask)); int index = ImageList_Add(GetHImageList(), hbmp, hbmpMask); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } return index; }
// Adds a bitmap, and optionally a mask bitmap. // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap' and 'mask'. int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmpMask = GetMaskForImage(bitmap, mask); int index = ImageList_Add(GetHImageList(), GetHbitmapOf(bitmap), hbmpMask); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } ::DeleteObject(hbmpMask); return index; }
// Replaces a bitmap, optionally passing a mask bitmap. // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap' and 'mask'. bool wxImageList::Replace(int index, const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmpMask = GetMaskForImage(bitmap, mask); bool ok = ImageList_Replace(GetHImageList(), index, GetHbitmapOf(bitmap), hbmpMask) != 0; if ( !ok ) { wxLogLastError(wxT("ImageList_Replace()")); } ::DeleteObject(hbmpMask); return ok; }
// Replaces a bitmap, optionally passing a mask bitmap. // Note that wxImageList creates new bitmaps, so you may delete // 'bitmap' and 'mask'. bool wxImageList::Replace(int index, const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmp; bool useMask; #if wxUSE_WXDIB && wxUSE_IMAGE // See the comment in Add() above. AutoHBITMAP hbmpRelease; if ( bitmap.HasAlpha() ) { wxImage img = bitmap.ConvertToImage(); if ( wxApp::GetComCtl32Version() < 600 ) { img.ClearAlpha(); useMask = true; } else { useMask = false; } hbmp = wxDIB(img, wxDIB::PixelFormat_NotPreMultiplied).Detach(); hbmpRelease.Init(hbmp); } else #endif // wxUSE_WXDIB && wxUSE_IMAGE { hbmp = GetHbitmapOf(bitmap); useMask = true; } AutoHBITMAP hbmpMask; if ( useMask ) hbmpMask.Init(GetMaskForImage(bitmap, mask)); if ( !ImageList_Replace(GetHImageList(), index, hbmp, hbmpMask) ) { wxLogLastError(wxT("ImageList_Replace()")); return false; } return true; }
// 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; }
// Replaces a bitmap and mask from an icon. bool wxImageList::Replace(int i, const wxIcon& icon) { // ComCtl32 prior 6.0 doesn't support images with alpha // channel so if we have 32-bit icon with transparency // we need to replace it as a wxBitmap via dedicated method // where alpha channel will be converted to the mask. if ( wxApp::GetComCtl32Version() < 600 ) { wxBitmap bmp(icon); if ( bmp.HasAlpha() ) { return Replace(i, bmp); } } bool ok = ImageList_ReplaceIcon(GetHImageList(), i, GetHiconOf(icon)) != -1; if ( !ok ) { wxLogLastError(wxT("ImageList_ReplaceIcon()")); } return ok; }
// Adds a bitmap and mask from an icon. int wxImageList::Add(const wxIcon& icon) { // ComCtl32 prior 6.0 doesn't support images with alpha // channel so if we have 32-bit icon with transparency // we need to add it as a wxBitmap via dedicated method // where alpha channel will be converted to the mask. if ( wxApp::GetComCtl32Version() < 600 ) { wxBitmap bmp(icon); if ( bmp.HasAlpha() ) { return Add(bmp); } } int index = ImageList_AddIcon(GetHImageList(), GetHiconOf(icon)); if ( index == -1 ) { wxLogError(_("Couldn't add an image to the image list.")); } return index; }
// 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, wxT("invalid image list") ); return ImageList_GetIconSize(GetHImageList(), &width, &height) != 0; }
// Returns the number of images in the image list. int wxImageList::GetImageCount() const { wxASSERT_MSG( m_hImageList, wxT("invalid image list") ); return ImageList_GetImageCount(GetHImageList()); }