X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ae090fdb7f4be47466b5728ad37065923b48c8c3..4b1ae1539c549eb612e5d2b6876124138ce9cb4e:/src/msw/imaglist.cpp diff --git a/src/msw/imaglist.cpp b/src/msw/imaglist.cpp index 5140135aeb..af74e0328f 100644 --- a/src/msw/imaglist.cpp +++ b/src/msw/imaglist.cpp @@ -5,8 +5,8 @@ // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "imaglist.h" #endif @@ -46,7 +46,7 @@ #include "wx/msw/imaglist.h" #include "wx/msw/private.h" -#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) && !defined(__CYGWIN10__)) +#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)) #include #endif @@ -85,12 +85,17 @@ bool wxImageList::Create(int width, int height, bool mask, int initial) UINT flags = 0; // set appropriate color depth +#ifdef __WXWINCE__ + flags |= ILC_COLOR; +#else 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 ) flags |= ILC_MASK; @@ -162,10 +167,6 @@ int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask) // 'bitmap'. int wxImageList::Add(const wxBitmap& bitmap, const wxColour& maskColour) { -#ifdef __TWIN32__ - wxFAIL_MSG(_T("ImageList_AddMasked not implemented in TWIN32")); - return -1; -#else int index = ImageList_AddMasked(GetHImageList(), GetHbitmapOf(bitmap), wxColourToRGB(maskColour)); @@ -175,7 +176,6 @@ int wxImageList::Add(const wxBitmap& bitmap, const wxColour& maskColour) } return index; -#endif } // Adds a bitmap and mask from an icon. @@ -196,10 +196,6 @@ int wxImageList::Add(const wxIcon& icon) bool wxImageList::Replace(int index, const wxBitmap& bitmap, const wxBitmap& mask) { -#ifdef __TWIN32__ - wxFAIL_MSG(_T("ImageList_Replace not implemented in TWIN32")); - return FALSE; -#else HBITMAP hbmpMask = GetMaskForImage(bitmap, mask); bool ok = ImageList_Replace(GetHImageList(), index, @@ -212,7 +208,6 @@ bool wxImageList::Replace(int index, ::DeleteObject(hbmpMask); return ok; -#endif } // Replaces a bitmap and mask from an icon. @@ -230,10 +225,6 @@ bool wxImageList::Replace(int i, const wxIcon& icon) // Removes the image at the given index. bool wxImageList::Remove(int index) { -#ifdef __TWIN32__ - wxFAIL_MSG(_T("ImageList_Replace not implemented in TWIN32")); - return FALSE; -#else bool ok = ImageList_Remove(GetHImageList(), index) != 0; if ( !ok ) { @@ -241,7 +232,6 @@ bool wxImageList::Remove(int index) } return ok; -#endif } // Remove all images @@ -269,20 +259,16 @@ bool wxImageList::Draw(int index, int flags, bool solidBackground) { -#ifdef __TWIN32__ - wxFAIL_MSG(_T("ImageList_Replace not implemented in TWIN32")); - return FALSE; -#else HDC hDC = GetHdcOf(dc); wxCHECK_MSG( hDC, FALSE, _T("invalid wxDC in wxImageList::Draw") ); COLORREF clr = CLR_NONE; // transparent by default if ( solidBackground ) { - wxBrush *brush = & dc.GetBackground(); - if ( brush && brush->Ok() ) + const wxBrush& brush = dc.GetBackground(); + if ( brush.Ok() ) { - clr = wxColourToRGB(brush->GetColour()); + clr = wxColourToRGB(brush.GetColour()); } } @@ -305,7 +291,6 @@ bool wxImageList::Draw(int index, } return ok; -#endif } // ---------------------------------------------------------------------------- @@ -315,37 +300,41 @@ bool wxImageList::Draw(int index, static HBITMAP GetMaskForImage(const wxBitmap& bitmap, const wxBitmap& mask) { HBITMAP hbmpMask; - wxBitmap *bmpMask = NULL; + wxMask *pMask; + bool deleteMask = FALSE; if ( mask.Ok() ) { hbmpMask = GetHbitmapOf(mask); + pMask = NULL; } else { - wxMask *pMask = bitmap.GetMask(); - if ( pMask ) - { - hbmpMask = (HBITMAP)pMask->GetMaskBitmap(); - } - else + pMask = bitmap.GetMask(); + if ( !pMask ) { - // create a non transparent mask - apparently, this is needed under - // Win9x (it doesn't behave correctly if it's passed 0 mask) - bmpMask = new wxBitmap(bitmap.GetWidth(), bitmap.GetHeight(), 1); + // use the light grey count as transparent: the trouble here is + // that the light grey might have been changed by Windows behind + // our back, so use the standard colour map to get its real value + wxCOLORMAP *cmap = wxGetStdColourMap(); + wxColour col; + wxRGBToColour(col, cmap[wxSTD_COL_BTNFACE].from); - wxMemoryDC dcMem; - dcMem.SelectObject(*bmpMask); - dcMem.Clear(); - dcMem.SelectObject(wxNullBitmap); + pMask = new wxMask(bitmap, col); - hbmpMask = GetHbitmapOf(*bmpMask); + deleteMask = TRUE; } + + hbmpMask = (HBITMAP)pMask->GetMaskBitmap(); } - // windows mask convention is opposite to the wxWindows one + // windows mask convention is opposite to the wxWidgets one HBITMAP hbmpMaskInv = wxInvertMask(hbmpMask); - delete bmpMask; + + if ( deleteMask ) + { + delete pMask; + } return hbmpMaskInv; }