X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/04ef50df3a0fa3c343800c554e609f98fc7575cc..4b2424bcadbc87babd3367d243b957e49333eeae:/src/msw/icon.cpp diff --git a/src/msw/icon.cpp b/src/msw/icon.cpp index 8f27b61324..75be5af852 100644 --- a/src/msw/icon.cpp +++ b/src/msw/icon.cpp @@ -49,7 +49,7 @@ // wxWin macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxIconBase) +IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxGDIObject) // ============================================================================ // implementation @@ -111,21 +111,20 @@ void wxIcon::CopyFromBitmap(const wxBitmap& bmp) iconInfo.hbmMask = wxInvertMask((HBITMAP)mask->GetMaskBitmap()); iconInfo.hbmColor = GetHbitmapOf(bmp); - /* GRG: black out the transparent area to preserve background - * colour, because Windows blits the original bitmap using - * SRCINVERT (XOR) after applying the mask to the dest rect. - */ - HDC dcSrc = ::CreateCompatibleDC(NULL); - HDC dcDst = ::CreateCompatibleDC(NULL); - SelectObject(dcSrc, (HBITMAP)mask->GetMaskBitmap()); - SelectObject(dcDst, iconInfo.hbmColor); - - BitBlt(dcDst, 0, 0, bmp.GetWidth(), bmp.GetHeight(), dcSrc, 0, 0, SRCAND); - - SelectObject(dcDst, NULL); - SelectObject(dcSrc, NULL); - DeleteDC(dcDst); - DeleteDC(dcSrc); + // black out the transparent area to preserve background colour, because + // Windows blits the original bitmap using SRCINVERT (XOR) after applying + // the mask to the dest rect. + { + MemoryHDC dcSrc, dcDst; + SelectInHDC selectMask(dcSrc, (HBITMAP)mask->GetMaskBitmap()), + selectBitmap(dcDst, iconInfo.hbmColor); + + if ( !::BitBlt(dcDst, 0, 0, bmp.GetWidth(), bmp.GetHeight(), + dcSrc, 0, 0, SRCAND) ) + { + wxLogLastError(_T("BitBlt")); + } + } HICON hicon = ::CreateIconIndirect(&iconInfo); if ( !hicon ) @@ -143,6 +142,9 @@ void wxIcon::CopyFromBitmap(const wxBitmap& bmp) // we created the mask, now delete it delete mask; } + + // delete the inverted mask bitmap we created as well + ::DeleteObject(iconInfo.hbmMask); #else // Win16 // there are some functions in curico.cpp which probably could be used // here...