]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
missing event.Skip() added (it was impossible to use mouse without it...)
[wxWidgets.git] / src / msw / dc.cpp
index 683d74d73b0ea1d8ac4e5989a44e855042116d0c..c6bd96b07331b62f3699491f0649220735b5c04a 100644 (file)
@@ -48,9 +48,6 @@
 #include "wx/msw/private.h" // needs to be before #include <commdlg.h>
 
 #if wxUSE_COMMON_DIALOGS
-#if wxUSE_NORLANDER_HEADERS
-    #include <windows.h>
-#endif
     #include <commdlg.h>
 #endif
 
@@ -74,6 +71,10 @@ static const int MM_METRIC = 10;
     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
+
 // ---------------------------------------------------------------------------
 // private functions
 // ---------------------------------------------------------------------------
@@ -582,6 +583,15 @@ void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
     wxCoord x2 = (x+width);
     wxCoord y2 = (y+height);
 
+    // Windows draws the filled rectangles without outline (i.e. drawn with a
+    // transparent pen) one pixel smaller in both directions and we want them
+    // to have the same size regardless of which pen is used - adjust
+    if ( m_pen.GetStyle() == wxTRANSPARENT )
+    {
+        x2++;
+        y2++;
+    }
+
     (void)RoundRect(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2),
         YLOG2DEV(y2), (int) (2*XLOG2DEV(radius)), (int)( 2*YLOG2DEV(radius)));
 
@@ -679,27 +689,19 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
         HDC hdcMem = ::CreateCompatibleDC(GetHdc());
         ::SelectObject(hdcMem, GetHbitmapOf(bmp));
 
-        // this will only work if the transparent part of our bitmap is black
-        // because it is combined with the destination rectangle using OR, so
-        // it won't be really transparent otherwise - I don't know what to do
-        // about it, may be use MAKEROP4(SRCCOPY, DSTINVERT) twice? Or create a
-        // copy of the bitmap with the transparent part replaced with black
-        // pixels?
+        // use MaskBlt() with ROP which doesn't do anything to dst in the mask
+        // points
         bool ok = ::MaskBlt(GetHdc(), x, y, width, height,
                             hdcMem, 0, 0,
                             hbmpMask, 0, 0,
-                            MAKEROP4(SRCCOPY, 0x00AA0029)) != 0;
+                            MAKEROP4(SRCCOPY, DSTCOPY)) != 0;
         ::DeleteDC(hdcMem);
 
         if ( !ok )
 #endif // Win32
         {
-            // VZ: this is incorrect, Blit() doesn't (and can't) draw
-            //     transparently, but it's still better than nothing at all
-
-            // GRG: Blit() *should* draw transparently when there is a mask.
-
-            // Rather than reproduce wxDC::Blit, let's do it at the wxWin API level
+            // Rather than reproduce wxDC::Blit, let's do it at the wxWin API
+            // level
             wxMemoryDC memDC;
             memDC.SelectObject(bmp);
 
@@ -1045,22 +1047,23 @@ void wxDC::SetRop(WXHDC dc)
 
     switch (m_logicalFunction)
     {
+        case wxCLEAR:        rop = R2_BLACK;         break;
         case wxXOR:          rop = R2_XORPEN;        break;
         case wxINVERT:       rop = R2_NOT;           break;
         case wxOR_REVERSE:   rop = R2_MERGEPENNOT;   break;
         case wxAND_REVERSE:  rop = R2_MASKPENNOT;    break;
-        case wxCLEAR:        rop = R2_WHITE;         break;
-        case wxSET:          rop = R2_BLACK;         break;
-        case wxOR_INVERT:    rop = R2_MERGENOTPEN;   break;
+        case wxCOPY:         rop = R2_COPYPEN;       break;
         case wxAND:          rop = R2_MASKPEN;       break;
-        case wxOR:           rop = R2_MERGEPEN;      break;
-        case wxEQUIV:        rop = R2_NOTXORPEN;     break;
-        case wxNAND:         rop = R2_NOTMASKPEN;    break;
         case wxAND_INVERT:   rop = R2_MASKNOTPEN;    break;
-        case wxCOPY:         rop = R2_COPYPEN;       break;
         case wxNO_OP:        rop = R2_NOP;           break;
-        case wxSRC_INVERT:   rop = R2_NOTCOPYPEN;    break;
         case wxNOR:          rop = R2_NOTMERGEPEN;   break;
+        case wxEQUIV:        rop = R2_NOTXORPEN;     break;
+        case wxSRC_INVERT:   rop = R2_NOTCOPYPEN;    break;
+        case wxOR_INVERT:    rop = R2_MERGENOTPEN;   break;
+        case wxNAND:         rop = R2_NOTMASKPEN;    break;
+        case wxOR:           rop = R2_MERGEPEN;      break;
+        case wxSET:          rop = R2_WHITE;         break;
+
         default:
            wxFAIL_MSG( wxT("unsupported logical function") );
            return;
@@ -1331,7 +1334,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
         case wxNAND:         dwRop = 0x007700E6;       break;
         case wxAND_INVERT:   dwRop = 0x00220326;       break;
         case wxCOPY:         dwRop = SRCCOPY;          break;
-        case wxNO_OP:        dwRop = 0x00AA0029;       break;
+        case wxNO_OP:        dwRop = DSTCOPY;          break;
         case wxSRC_INVERT:   dwRop = NOTSRCCOPY;       break;
         case wxNOR:          dwRop = NOTSRCCOPY;       break;
         default:
@@ -1339,47 +1342,19 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
            return FALSE;
     }
 
-
     bool success;
 
     if (useMask)
     {
 #ifdef __WIN32__
-        // prepare the mask bitmap
-        HBITMAP hbmpMask = wxInvertMask((HBITMAP)mask->GetMaskBitmap());
-
-        // select the correct brush: the current one by default, background one
-        // if none
-        HBRUSH hbrNew;
-        if ( m_brush.Ok() )
-        {
-            hbrNew = (HBRUSH)m_brush.GetResourceHandle();
-        }
-        else if ( m_backgroundBrush.Ok() )
-        {
-            hbrNew = (HBRUSH)m_backgroundBrush.GetResourceHandle();
-        }
-        else
-        {
-            hbrNew = 0;
-        }
-
-        HGDIOBJ hbrOld = hbrNew ? ::SelectObject(GetHdc(), hbrNew) : 0;
-
         // we want the part of the image corresponding to the mask to be
-        // transparent, i.e. do PATCOPY there and apply dwRop elsewhere
-
+        // transparent, so use "DSTCOPY" ROP for the mask points (the usual
+        // meaning of fg and bg is inverted which corresponds to wxWin notion
+        // of the mask which is also contrary to the Windows one)
         success = ::MaskBlt(GetHdc(), xdest, ydest, width, height,
                             GetHdcOf(*source), xsrc, ysrc,
-                            hbmpMask, 0, 0,
-                            MAKEROP4(0x00AA0029, dwRop)) != 0;
-
-        if ( hbrNew )
-        {
-            (void)::SelectObject(GetHdc(), hbrOld);
-        }
-
-        ::DeleteObject(hbmpMask);
+                            (HBITMAP)mask->GetMaskBitmap(), 0, 0,
+                            MAKEROP4(dwRop, DSTCOPY)) != 0;
 
         if ( !success )
 #endif // Win32