]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
fixed TREE_ITEM_MENU generation from right mouse clicks: don't pass WM_RBUTTONDOWN...
[wxWidgets.git] / src / msw / dc.cpp
index 2139cee4cbfc80274bec942376643603fbf4cda8..df9046419a4cecf948aa8e72a295550f34948a12 100644 (file)
@@ -29,6 +29,7 @@
 #endif
 
 #ifndef WX_PRECOMP
+    #include "wx/image.h"
     #include "wx/window.h"
     #include "wx/dc.h"
     #include "wx/utils.h"
@@ -40,9 +41,6 @@
     #include "wx/icon.h"
 #endif
 
-#include "wx/msw/private.h" // needs to be before #include <commdlg.h>
-#include "wx/msw/missing.h" // needs to be before #include <commdlg.h>
-
 #include "wx/sysopt.h"
 #include "wx/dcprint.h"
 #include "wx/module.h"
 #endif
 
 #include <string.h>
-#include <math.h>
-
-#if wxUSE_COMMON_DIALOGS && !defined(__WXMICROWIN__)
-    #include <commdlg.h>
-#endif
 
+#include "wx/msw/wrapcdlg.h"
 #ifndef __WIN32__
     #include <print.h>
 #endif
@@ -93,11 +87,6 @@ static const int VIEWPORT_EXTENT = 1000;
 static const int MM_POINTS = 9;
 static const int MM_METRIC = 10;
 
-// usually this is defined in math.h
-#ifndef M_PI
-    static const double M_PI = 3.14159265358979323846;
-#endif // M_PI
-
 // ROPs which don't have standard names (see "Ternary Raster Operations" in the
 // MSDN docs for how this and other numbers in wxDC::Blit() are obtained)
 #define DSTCOPY 0x00AA0029      // a.k.a. NOP operation
@@ -188,6 +177,8 @@ public:
         m_modeOld = ::SetStretchBltMode(m_hdc, mode);
         if ( !m_modeOld )
             wxLogLastError(_T("SetStretchBltMode"));
+#else
+        wxUnusedVar(mode);
 #endif
     }
 
@@ -224,7 +215,7 @@ wxColourChanger::wxColourChanger(wxDC& dc) : m_dc(dc)
         m_colFgOld = ::GetTextColor(hdc);
         m_colBgOld = ::GetBkColor(hdc);
 
-        // note that Windows convention is opposite to wxWindows one, this is
+        // note that Windows convention is opposite to wxWidgets one, this is
         // why text colour becomes the background one and vice versa
         const wxColour& colFg = dc.GetTextForeground();
         if ( colFg.Ok() )
@@ -391,13 +382,14 @@ wxDC::DoGetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const
     // when we're associated with an existing HDC usign SetHDC(), see there
     if ( m_clipping && !m_clipX1 && !m_clipX2 )
     {
-        UpdateClipBox();
+        wxDC *self = wxConstCast(this, wxDC);
+        self->UpdateClipBox();
 
         if ( !m_clipX1 && !m_clipX2 )
-            m_clipping = false;
+            self->m_clipping = false;
     }
 
-    return wxDCBase::DoGetClippingBox(x, y, w, h);
+    wxDCBase::DoGetClippingBox(x, y, w, h);
 }
 
 // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion()
@@ -549,10 +541,10 @@ void wxDC::Clear()
     ::FillRect(GetHdc(), &rect, brush);
     ::DeleteObject(brush);
 
+#ifndef __WXWINCE__
     int width = DeviceToLogicalXRel(VIEWPORT_EXTENT)*m_signX,
         height = DeviceToLogicalYRel(VIEWPORT_EXTENT)*m_signY;
 
-#ifndef __WXWINCE__
     ::SetMapMode(GetHdc(), MM_ANISOTROPIC);
 
     ::SetViewportExtEx(GetHdc(), VIEWPORT_EXTENT, VIEWPORT_EXTENT, NULL);
@@ -565,6 +557,10 @@ void wxDC::Clear()
 bool wxDC::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style)
 {
 #ifdef __WXWINCE__
+    wxUnusedVar(x);
+    wxUnusedVar(y);
+    wxUnusedVar(col);
+    wxUnusedVar(style);
     return false;
 #else
 
@@ -776,6 +772,8 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffs
         }
 #ifndef __WXWINCE__
         int prev = SetPolyFillMode(GetHdc(),fillStyle==wxODDEVEN_RULE?ALTERNATE:WINDING);
+#else
+        wxUnusedVar(fillStyle);
 #endif
         (void)Polygon(GetHdc(), cpoints, n);
 #ifndef __WXWINCE__
@@ -809,7 +807,7 @@ wxDC::DoDrawPolyPolygon(int n,
 {
 #ifdef __WXWINCE__
     wxDCBase::DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle);
-#else    
+#else
     WXMICROWIN_CHECK_HDC
 
     wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling
@@ -830,11 +828,11 @@ wxDC::DoDrawPolyPolygon(int n,
         }
 #ifndef __WXWINCE__
         int prev = SetPolyFillMode(GetHdc(),fillStyle==wxODDEVEN_RULE?ALTERNATE:WINDING);
-#endif        
+#endif
         (void)PolyPolygon(GetHdc(), cpoints, count, n);
 #ifndef __WXWINCE__
         SetPolyFillMode(GetHdc(),prev);
-#endif        
+#endif
         delete[] cpoints;
     }
     else
@@ -844,11 +842,11 @@ wxDC::DoDrawPolyPolygon(int n,
 
 #ifndef __WXWINCE__
         int prev = SetPolyFillMode(GetHdc(),fillStyle==wxODDEVEN_RULE?ALTERNATE:WINDING);
-#endif        
+#endif
         (void)PolyPolygon(GetHdc(), (POINT*) points, count, n);
 #ifndef __WXWINCE__
         SetPolyFillMode(GetHdc(),prev);
-#endif        
+#endif
     }
 #endif
   // __WXWINCE__
@@ -1081,7 +1079,7 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
         // use MaskBlt() with ROP which doesn't do anything to dst in the mask
         // points
         // On some systems, MaskBlt succeeds yet is much much slower
-        // than the wxWindows fall-back implementation. So we need
+        // than the wxWidgets fall-back implementation. So we need
         // to be able to switch this on and off at runtime.
         bool ok = false;
 #if wxUSE_SYSTEM_OPTIONS
@@ -1283,13 +1281,13 @@ void wxDC::DoDrawRotatedText(const wxString& text,
 
         // "upper left" and "upper right"
         CalcBoundingBox(x, y);
-        CalcBoundingBox(x + wxCoord(w*cos(rad)), y - wxCoord(h*sin(rad)));
+        CalcBoundingBox(x + wxCoord(w*cos(rad)), y - wxCoord(w*sin(rad)));
 
         // "bottom left" and "bottom right"
         x += (wxCoord)(h*sin(rad));
         y += (wxCoord)(h*cos(rad));
         CalcBoundingBox(x, y);
-        CalcBoundingBox(x + wxCoord(h*sin(rad)), y + wxCoord(h*cos(rad)));
+        CalcBoundingBox(x + wxCoord(w*cos(rad)), y - wxCoord(w*sin(rad)));
     }
 #endif
 }
@@ -1764,15 +1762,13 @@ void wxDC::SetUserScale(double x, double y)
 {
     WXMICROWIN_CHECK_HDC
 
-#ifndef __WXWINCE__
     if ( x == m_userScaleX && y == m_userScaleY )
         return;
 
     m_userScaleX = x;
     m_userScaleY = y;
 
-    SetMapMode(m_mappingMode);
-#endif
+    this->SetMapMode(m_mappingMode);
 }
 
 void wxDC::SetAxisOrientation(bool xLeftRight, bool yBottomUp)
@@ -1790,6 +1786,9 @@ void wxDC::SetAxisOrientation(bool xLeftRight, bool yBottomUp)
 
         SetMapMode(m_mappingMode);
     }
+#else
+    wxUnusedVar(xLeftRight);
+    wxUnusedVar(yBottomUp);
 #endif
 }
 
@@ -1900,8 +1899,11 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
 
     WXMICROWIN_CHECK_HDC_RET(false)
 
+    // if either the source or destination has alpha channel, we must use
+    // AlphaBlt() as other function don't handle it correctly
     const wxBitmap& bmpSrc = source->m_selectedBitmap;
-    if ( bmpSrc.Ok() && bmpSrc.HasAlpha() )
+    if ( bmpSrc.Ok() && (bmpSrc.HasAlpha() ||
+            (m_selectedBitmap.Ok() && m_selectedBitmap.HasAlpha())) )
     {
         if ( AlphaBlt(GetHdc(), xdest, ydest, width, height,
                       GetHdcOf(*source), bmpSrc) )
@@ -1972,7 +1974,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
         // of the mask which is also contrary to the Windows one)
 
         // On some systems, MaskBlt succeeds yet is much much slower
-        // than the wxWindows fall-back implementation. So we need
+        // than the wxWidgets fall-back implementation. So we need
         // to be able to switch this on and off at runtime.
 #if wxUSE_SYSTEM_OPTIONS
         if (wxSystemOptions::GetOptionInt(wxT("no-maskblt")) == 0)
@@ -2117,7 +2119,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
                     // On Win9x this API fails most (all?) of the time, so
                     // logging it becomes quite distracting.  Since it falls
                     // back to the code below this is not really serious, so
-                    // don't log it.                     
+                    // don't log it.
                     //wxLogLastError(wxT("StretchDIBits"));
                 }
                 else
@@ -2219,7 +2221,7 @@ void wxDC::DoGetSizeMM(int *w, int *h) const
 
 wxSize wxDC::GetPPI() const
 {
-    WXMICROWIN_CHECK_HDC_RET(wxSize())
+    WXMICROWIN_CHECK_HDC_RET(wxSize(0,0))
 
     int x = ::GetDeviceCaps(GetHdc(), LOGPIXELSX);
     int y = ::GetDeviceCaps(GetHdc(), LOGPIXELSY);
@@ -2227,7 +2229,7 @@ wxSize wxDC::GetPPI() const
     return wxSize(x, y);
 }
 
-// For use by wxWindows only, unless custom units are required.
+// For use by wxWidgets only, unless custom units are required.
 void wxDC::SetLogicalScale(double x, double y)
 {
     WXMICROWIN_CHECK_HDC
@@ -2447,6 +2449,7 @@ static bool AlphaBlt(HDC hdcDst,
 #else // !wxHAVE_RAW_BITMAP
     // no wxAlphaBlend() neither, fall back to using simple BitBlt() (we lose
     // alpha but at least something will be shown like this)
+    wxUnusedVar(bmp);
     return false;
 #endif // wxHAVE_RAW_BITMAP
 }