]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
Added dummy OnIdle to wxWindow in wxGTK; doc tweaks
[wxWidgets.git] / src / msw / dc.cpp
index 5b4e8fddcda7ae1ee0d99d09bc154124c775c32c..970a074492b8f92ca23c2885a7dbd0395eeb7389 100644 (file)
@@ -26,6 +26,8 @@
 #include "wx/utils.h"
 #include "wx/dialog.h"
 #include "wx/app.h"
 #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"
 #endif
 
 #include "wx/dcprint.h"
@@ -90,7 +92,7 @@ wxDC::wxDC(void)
   m_signY = 1;
   m_systemScaleX = 1.0;
   m_systemScaleY = 1.0;
   m_signY = 1;
   m_systemScaleX = 1.0;
   m_systemScaleY = 1.0;
-  m_mappingMode = MM_TEXT;
+  m_mappingMode = wxMM_TEXT;
   m_bOwnsDC = FALSE;
   m_hDC = 0;
   m_clipping = FALSE;
   m_bOwnsDC = FALSE;
   m_hDC = 0;
   m_clipping = FALSE;
@@ -181,6 +183,26 @@ void wxDC::SetClippingRegion(long cx, long cy, long cw, long ch)
   DoClipping((WXHDC) m_hDC);
 }
 
   DoClipping((WXHDC) m_hDC);
 }
 
+void wxDC::SetClippingRegion(const wxRegion& region)
+{
+  if (!region.GetHRGN())
+    return;
+
+  wxRect box = region.GetBox();
+
+  m_clipping = TRUE;
+  m_clipX1 = box.x;
+  m_clipY1 = box.y;
+  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)
 {
   if (m_clipping && dc)
 void wxDC::DoClipping(WXHDC dc)
 {
   if (m_clipping && dc)
@@ -194,11 +216,14 @@ void wxDC::DestroyClippingRegion(void)
 {
   if (m_clipping && m_hDC)
   {
 {
   if (m_clipping && m_hDC)
   {
+    // TODO: this should restore the previous clipping region,
+    // so that OnPaint processing works correctly, and the update clipping region
+    // doesn't get destroyed after the first DestroyClippingRegion.
     HRGN rgn = CreateRectRgn(0, 0, 32000, 32000);
     SelectClipRgn((HDC) m_hDC, rgn);
     DeleteObject(rgn);
     HRGN rgn = CreateRectRgn(0, 0, 32000, 32000);
     SelectClipRgn((HDC) m_hDC, rgn);
     DeleteObject(rgn);
-   }
-   m_clipping = FALSE;
+  }
+  m_clipping = FALSE;
 }
 
 bool wxDC::CanDrawBitmap(void) const
 }
 
 bool wxDC::CanDrawBitmap(void) const
@@ -230,7 +255,7 @@ void wxDC::SetPalette(const wxPalette& palette)
     m_oldPalette = 0;
   }
 
     m_oldPalette = 0;
   }
 
-  m_palette = m_palette;
+  m_palette = palette;
 
   if (!m_palette.Ok())
   {
 
   if (!m_palette.Ok())
   {
@@ -355,7 +380,7 @@ void wxDC::DrawArc(long x1,long y1,long x2,long y2, long xc, long yc)
   double radius = (double)sqrt(dx*dx+dy*dy) ;;
   if (x1==x2 && x2==y2)
   {
   double radius = (double)sqrt(dx*dx+dy*dy) ;;
   if (x1==x2 && x2==y2)
   {
-    DrawEllipse(xc,yc,(double)(radius*2.0),(double)(radius*2)) ;
+    DrawEllipse(xc,yc,(long)(radius*2.0),(long)(radius*2.0)) ;
     return ;
   }
 
     return ;
   }
 
@@ -580,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)
 {
 
 void wxDC::DrawIcon(const wxIcon& icon, long x, long y)
 {
+#if defined(__WIN32__) && !defined(__SC__) && !defined(__TWIN32__)
+  ::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());
   ::DrawIcon((HDC) m_hDC, XLOG2DEV(x), YLOG2DEV(y), (HICON) icon.GetHICON());
+#endif
+
   CalcBoundingBox(x, y);
   CalcBoundingBox(x+icon.GetWidth(), y+icon.GetHeight());
 }
 
   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
 void wxDC::SetFont(const wxFont& the_font)
 {
   // Set the old object temporarily, in case the assignment deletes an object
@@ -607,7 +677,7 @@ void wxDC::SetFont(const wxFont& the_font)
   if (m_font.Ok() && m_font.GetResourceHandle())
   {
     HFONT f = (HFONT) ::SelectObject((HDC) m_hDC, (HFONT) m_font.GetResourceHandle());
   if (m_font.Ok() && m_font.GetResourceHandle())
   {
     HFONT f = (HFONT) ::SelectObject((HDC) m_hDC, (HFONT) m_font.GetResourceHandle());
-    if (f == NULL)
+    if (f == (HFONT) NULL)
     {
         wxDebugMsg("::SelectObject failed in wxDC::SetFont.");
     }
     {
         wxDebugMsg("::SelectObject failed in wxDC::SetFont.");
     }
@@ -738,7 +808,14 @@ void wxDC::SetBackground(const wxBrush& brush)
       }
       else
       {
       }
       else
       {
-        m_canvas->SetBackgroundColour(m_backgroundBrush.GetColour());
+        // New behaviour, 10/2/99: setting the background brush of a DC
+        // doesn't affect the window background colour. However,
+        // I'm leaving in the transparency setting because it's needed by
+        // various controls (e.g. wxStaticText) to determine whether to draw
+        // transparently or not. TODO: maybe this should be a new function
+        // wxWindow::SetTransparency(). Should that apply to the child itself, or the
+        // parent?
+//        m_canvas->SetBackgroundColour(m_backgroundBrush.GetColour());
         m_canvas->m_backgroundTransparent = FALSE;
       }
     }
         m_canvas->m_backgroundTransparent = FALSE;
       }
     }
@@ -824,16 +901,23 @@ bool wxDC::StartDoc(const wxString& message)
 #else
 #ifdef UNICODE
      ::StartDocW((HDC) m_hDC, &docinfo);
 #else
 #ifdef UNICODE
      ::StartDocW((HDC) m_hDC, &docinfo);
+#else
+#ifdef __TWIN32__
+     ::StartDoc((HDC) m_hDC, &docinfo);
 #else
      ::StartDocA((HDC) m_hDC, &docinfo);
 #endif
 #endif
 #else
      ::StartDocA((HDC) m_hDC, &docinfo);
 #endif
 #endif
+#endif
 
 
+#ifndef __WIN16__
   if (ret <= 0)
   {
     DWORD lastError = GetLastError();
     wxDebugMsg("wxDC::StartDoc failed with error: %d\n", lastError);
   }
   if (ret <= 0)
   {
     DWORD lastError = GetLastError();
     wxDebugMsg("wxDC::StartDoc failed with error: %d\n", lastError);
   }
+#endif
+
   return (ret > 0);
 }
 
   return (ret > 0);
 }
 
@@ -921,32 +1005,32 @@ void wxDC::SetMapMode(int mode)
 
   switch (mode)
   {
 
   switch (mode)
   {
-    case MM_TWIPS:
+    case wxMM_TWIPS:
     {
       m_logicalScaleX = (twips2mm * mm2pixelsX);
       m_logicalScaleY = (twips2mm * mm2pixelsY);
       break;
     }
     {
       m_logicalScaleX = (twips2mm * mm2pixelsX);
       m_logicalScaleY = (twips2mm * mm2pixelsY);
       break;
     }
-    case MM_POINTS:
+    case wxMM_POINTS:
     {
       m_logicalScaleX = (pt2mm * mm2pixelsX);
       m_logicalScaleY = (pt2mm * mm2pixelsY);
       break;
     }
     {
       m_logicalScaleX = (pt2mm * mm2pixelsX);
       m_logicalScaleY = (pt2mm * mm2pixelsY);
       break;
     }
-    case MM_METRIC:
+    case wxMM_METRIC:
     {
       m_logicalScaleX = mm2pixelsX;
       m_logicalScaleY = mm2pixelsY;
       break;
     }
     {
       m_logicalScaleX = mm2pixelsX;
       m_logicalScaleY = mm2pixelsY;
       break;
     }
-    case MM_LOMETRIC:
+    case wxMM_LOMETRIC:
     {
       m_logicalScaleX = (mm2pixelsX/10.0);
       m_logicalScaleY = (mm2pixelsY/10.0);
       break;
     }
     default:
     {
       m_logicalScaleX = (mm2pixelsX/10.0);
       m_logicalScaleY = (mm2pixelsY/10.0);
       break;
     }
     default:
-    case MM_TEXT:
+    case wxMM_TEXT:
     {
       m_logicalScaleX = 1.0;
       m_logicalScaleY = 1.0;
     {
       m_logicalScaleX = 1.0;
       m_logicalScaleY = 1.0;
@@ -1237,7 +1321,7 @@ bool wxDC::Blit(long xdest, long ydest, long width, long height,
   {
     if (IsKindOf(CLASSINFO(wxPrinterDC)))
     {
   {
     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;
       // not printer colours and so we need copy the bitmap
       // pixel by pixel.
       HDC dc_src = (HDC) source->m_hDC;
@@ -1607,7 +1691,7 @@ static bool wx_spline_add_point(double x, double y)
 
 static void wx_spline_draw_point_array(wxDC *dc)
 {
 
 static void wx_spline_draw_point_array(wxDC *dc)
 {
-  dc->DrawLines(&wx_spline_point_list, (double)0.0, (double)0.0);
+  dc->DrawLines(&wx_spline_point_list, 0, 0);
   wxNode *node = wx_spline_point_list.First();
   while (node)
   {
   wxNode *node = wx_spline_point_list.First();
   while (node)
   {