]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
VC++ compilation correction; doc file corrections
[wxWidgets.git] / src / msw / dc.cpp
index 9375860e758a995a9eb58f11f1b198e3ff4e723c..1df225556d04164231e8c463b14e2b848266d5da 100644 (file)
@@ -26,6 +26,8 @@
 #include "wx/utils.h"
 #include "wx/dialog.h"
 #include "wx/app.h"
+#include "wx/bitmap.h"
+#include "wx/dcmemory.h"
 #endif
 
 #include "wx/dcprint.h"
@@ -194,7 +196,11 @@ void wxDC::SetClippingRegion(const wxRegion& region)
   m_clipX2 = box.x + box.width;
   m_clipY2 = box.y + box.height;
 
+#ifdef __WIN16__
+  SelectClipRgn((HDC) m_hDC, (HRGN) region.GetHRGN());
+#else
   ExtSelectClipRgn((HDC) m_hDC, (HRGN) region.GetHRGN(), RGN_AND);
+#endif
 }
 
 void wxDC::DoClipping(WXHDC dc)
@@ -599,11 +605,56 @@ void wxDC::DrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
 
 void wxDC::DrawIcon(const wxIcon& icon, long x, long y)
 {
+#if defined(__WIN32__) && !defined(__SC__)
+  ::DrawIconEx((HDC) m_hDC, XLOG2DEV(x), YLOG2DEV(y), (HICON) icon.GetHICON(),
+      icon.GetWidth(), icon.GetHeight(), 0, 0, DI_NORMAL);
+#else
   ::DrawIcon((HDC) m_hDC, XLOG2DEV(x), YLOG2DEV(y), (HICON) icon.GetHICON());
+#endif
+
   CalcBoundingBox(x, y);
   CalcBoundingBox(x+icon.GetWidth(), y+icon.GetHeight());
 }
 
+void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask )
+{
+    if (!bmp.Ok())
+        return;
+
+    // If we're not drawing transparently, and not drawing to a printer,
+    // optimize this function to use Windows functions.
+    if (!useMask && !IsKindOf(CLASSINFO(wxPrinterDC)))
+    {
+        HDC cdc = (HDC)m_hDC;
+        HDC memdc = ::CreateCompatibleDC( cdc );
+        HBITMAP hbitmap = (HBITMAP) bmp.GetHBITMAP( );
+        ::SelectObject( memdc, hbitmap );
+        ::BitBlt( cdc, x, y, bmp.GetWidth(), bmp.GetHeight(), memdc, 0, 0, SRCCOPY);
+        ::SelectObject( memdc, 0 );
+        ::DeleteDC( memdc );
+    }
+    else
+    {
+        // Rather than reproduce wxDC::Blit, let's do it at the wxWin API level
+        wxMemoryDC memDC;
+        memDC.SelectObject(bmp);
+
+        /* Not sure if we need this. The mask should leave the
+         * masked areas as per the original background of this DC.
+         */
+/*
+        // There might be transparent areas, so make these
+        // the same colour as this DC
+        memDC.SetBackground(* GetBackground());
+        memDC.Clear();
+*/
+
+        Blit(x, y, bmp.GetWidth(), bmp.GetHeight(), & memDC, 0, 0, wxCOPY, useMask);
+
+        memDC.SelectObject(wxNullBitmap);
+    }
+}
+
 void wxDC::SetFont(const wxFont& the_font)
 {
   // Set the old object temporarily, in case the assignment deletes an object
@@ -848,11 +899,14 @@ bool wxDC::StartDoc(const wxString& message)
 #endif
 #endif
 
+#ifndef __WIN16__
   if (ret <= 0)
   {
     DWORD lastError = GetLastError();
     wxDebugMsg("wxDC::StartDoc failed with error: %d\n", lastError);
   }
+#endif
+
   return (ret > 0);
 }
 
@@ -1256,7 +1310,7 @@ bool wxDC::Blit(long xdest, long ydest, long width, long height,
   {
     if (IsKindOf(CLASSINFO(wxPrinterDC)))
     {
-      // If we are printing source colours are screen colours
+      // If we are printing, source colours are screen colours
       // not printer colours and so we need copy the bitmap
       // pixel by pixel.
       HDC dc_src = (HDC) source->m_hDC;