X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6d167489bdf17d55d9bd11be834bc17277661063..5ebdc86afc95a60fbeb0b2a71c38dd26c8a1b0b4:/src/msw/bitmap.cpp diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index fe11b93585..8219aae622 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -50,12 +50,10 @@ // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARIES IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject) IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject) -#endif // ============================================================================ // implementation @@ -71,6 +69,7 @@ wxBitmapRefData::wxBitmapRefData() m_selectedInto = NULL; m_numColors = 0; m_bitmapMask = NULL; + m_hBitmap = (WXHBITMAP) NULL; } void wxBitmapRefData::Free() @@ -121,12 +120,37 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon) wxBitmapRefData *refData = new wxBitmapRefData; m_refData = refData; - refData->m_width = icon.GetWidth(); - refData->m_height = icon.GetHeight(); + int w = icon.GetWidth(), + h = icon.GetHeight(); + + refData->m_width = w; + refData->m_height = h; refData->m_depth = wxDisplayDepth(); refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor; - refData->m_bitmapMask = new wxMask((WXHBITMAP)iconInfo.hbmMask); + + // the mask returned by GetIconInfo() is inversed compared to the usual + // wxWin convention + HBITMAP hbmpMask = ::CreateBitmap(w, h, 1, 1, 0); + + // the icons mask is opposite to the usual wxWin convention + HDC dcSrc = ::CreateCompatibleDC(NULL); + HDC dcDst = ::CreateCompatibleDC(NULL); + (void)SelectObject(dcSrc, iconInfo.hbmMask); + (void)SelectObject(dcDst, hbmpMask); + + HBRUSH brush = ::CreateSolidBrush(RGB(255, 255, 255)); + RECT rect = { 0, 0, w, h }; + FillRect(dcDst, &rect, brush); + + BitBlt(dcDst, 0, 0, w, h, dcSrc, 0, 0, SRCINVERT); + + SelectObject(dcDst, NULL); + SelectObject(dcSrc, NULL); + DeleteDC(dcDst); + DeleteDC(dcSrc); + + refData->m_bitmapMask = new wxMask((WXHBITMAP)hbmpMask); #if WXWIN_COMPATIBILITY_2 refData->m_ok = TRUE; @@ -148,9 +172,9 @@ bool wxBitmap::CopyFromCursor(const wxCursor& cursor) wxFAIL_MSG( _T("don't know how to convert cursor to bitmap") ); return FALSE; -#endif // Win16 - +#else return CopyFromIconOrCursor(cursor); +#endif // Win16 } bool wxBitmap::CopyFromIcon(const wxIcon& icon)