X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..0b7e6e7da208b6a95fb23cb50286a09dc90d96d2:/src/msw/icon.cpp diff --git a/src/msw/icon.cpp b/src/msw/icon.cpp index 00b0741ab7..30edc93816 100644 --- a/src/msw/icon.cpp +++ b/src/msw/icon.cpp @@ -34,6 +34,7 @@ #include "wx/utils.h" #include "wx/app.h" #include "wx/icon.h" + #include "wx/bitmap.h" #endif #include "wx/msw/private.h" @@ -47,7 +48,7 @@ // wxWin macros // ---------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxIconBase) +IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxIconBase) // ============================================================================ // implementation @@ -71,14 +72,10 @@ void wxIconRefData::Free() // wxIcon // ---------------------------------------------------------------------------- -wxIcon::wxIcon() -{ -} - -wxIcon::wxIcon(const char WXUNUSED(bits)[], - int WXUNUSED(width), - int WXUNUSED(height)) +wxIcon::wxIcon(const char bits[], int width, int height) { + wxBitmap bmp(bits, width, height); + CopyFromBitmap(bmp); } wxIcon::wxIcon(const wxString& iconfile, @@ -94,6 +91,67 @@ wxIcon::~wxIcon() { } +void wxIcon::CopyFromBitmap(const wxBitmap& bmp) +{ +#ifdef __WIN32__ + wxMask *mask = bmp.GetMask(); + if ( !mask ) + { + // we must have a mask for an icon, so even if it's probably incorrect, + // do create it (grey is the "standard" transparent colour) + mask = new wxMask(bmp, *wxLIGHT_GREY); + } + + ICONINFO iconInfo; + iconInfo.fIcon = TRUE; // we want an icon, not a cursor + 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"); + } + else + { + SetHICON((WXHICON)hicon); + SetSize(bmp.GetWidth(), bmp.GetHeight()); + } + + if ( !bmp.GetMask() ) + { + // we created the mask, now delete it + delete mask; + } +#else // Win16 + // there are some functions in curico.cpp which probably could be used + // here... + wxFAIL_MSG("not implemented"); +#endif // Win32/16 +} + +void wxIcon::CreateIconFromXpm(const char **data) +{ + wxBitmap bmp(data); + CopyFromBitmap(bmp); +} + bool wxIcon::LoadFile(const wxString& filename, long type, int desiredWidth, int desiredHeight)