]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/bitmap.cpp
*** empty log message ***
[wxWidgets.git] / src / msw / bitmap.cpp
index fe11b93585cb05c60348cdf7e907e986923ad159..8219aae62276871ee0260e441f3f931c6e6c834e 100644 (file)
 // macros
 // ----------------------------------------------------------------------------
 
 // macros
 // ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARIES
     IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
     IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
 
     IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject)
     IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
     IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
 
     IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject)
-#endif
 
 // ============================================================================
 // implementation
 
 // ============================================================================
 // implementation
@@ -71,6 +69,7 @@ wxBitmapRefData::wxBitmapRefData()
     m_selectedInto = NULL;
     m_numColors = 0;
     m_bitmapMask = NULL;
     m_selectedInto = NULL;
     m_numColors = 0;
     m_bitmapMask = NULL;
+    m_hBitmap = (WXHBITMAP) NULL;
 }
 
 void wxBitmapRefData::Free()
 }
 
 void wxBitmapRefData::Free()
@@ -121,12 +120,37 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
     wxBitmapRefData *refData = new wxBitmapRefData;
     m_refData = refData;
 
     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_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;
 
 #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;
     wxFAIL_MSG( _T("don't know how to convert cursor to bitmap") );
 
     return FALSE;
-#endif // Win16
-
+#else
     return CopyFromIconOrCursor(cursor);
     return CopyFromIconOrCursor(cursor);
+#endif // Win16
 }
 
 bool wxBitmap::CopyFromIcon(const wxIcon& icon)
 }
 
 bool wxBitmap::CopyFromIcon(const wxIcon& icon)