X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b7f2165565bb33b149baf1272e28f9a61d579d3..87df17a11b0017d31c09f767bd921abb27193bee:/src/msw/icon.cpp?ds=sidebyside diff --git a/src/msw/icon.cpp b/src/msw/icon.cpp index 5d615ffa30..fa2c11ffaf 100644 --- a/src/msw/icon.cpp +++ b/src/msw/icon.cpp @@ -34,6 +34,8 @@ #include "wx/utils.h" #include "wx/app.h" #include "wx/icon.h" + #include "wx/bitmap.h" + #include "wx/log.h" #endif #include "wx/msw/private.h" @@ -106,10 +108,26 @@ 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); + HICON hicon = ::CreateIconIndirect(&iconInfo); if ( !hicon ) { - wxLogLastError("CreateIconIndirect"); + wxLogLastError(wxT("CreateIconIndirect")); } else { @@ -125,7 +143,16 @@ void wxIcon::CopyFromBitmap(const wxBitmap& bmp) #else // Win16 // there are some functions in curico.cpp which probably could be used // here... - wxFAIL_MSG("not implemented"); + // This probably doesn't work. + HBITMAP hBitmap = (HBITMAP) bmp.GetHBITMAP(); + HICON hIcon = MakeIconFromBitmap((HINSTANCE) wxGetInstance(), hBitmap); + if (hIcon) + { + SetHICON((WXHICON)hIcon); + SetSize(bmp.GetWidth(), bmp.GetHeight()); + } + +// wxFAIL_MSG("Bitmap to icon conversion (including use of XPMs for icons) not implemented"); #endif // Win32/16 }