]> git.saurik.com Git - wxWidgets.git/commitdiff
Removed dependence on wxClientDC and blitting from a window,
authorJulian Smart <julian@anthemion.co.uk>
Mon, 9 Oct 2006 15:15:13 +0000 (15:15 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Mon, 9 Oct 2006 15:15:13 +0000 (15:15 +0000)
for compatibility with Mac OS X in Core Graphics mode.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41803 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/dragimag/dragimag.cpp
samples/dragimag/dragimag.h

index 187c696f8ae4f12d8c74f26d2d2b8df101b2ad06..557f0a1ef952eb74353314ffafa3a1fddd4f8a60 100644 (file)
@@ -138,17 +138,13 @@ void MyCanvas::OnMouseEvent(wxMouseEvent& event)
         delete m_dragImage;
         m_dragImage = NULL;
 
-        wxClientDC dc(this);
-        if (m_currentlyHighlighted)
-        {
-            m_currentlyHighlighted->Draw(dc);
-        }
         m_draggedShape->SetShow(true);
-        m_draggedShape->Draw(dc);
 
         m_currentlyHighlighted = (DragShape*) NULL;
 
         m_draggedShape = (DragShape*) NULL;
+        
+        Refresh(true);
     }
     else if (event.Dragging() && m_dragMode != TEST_DRAG_NONE)
     {
@@ -170,25 +166,26 @@ void MyCanvas::OnMouseEvent(wxMouseEvent& event)
 
             // Erase the dragged shape from the canvas
             m_draggedShape->SetShow(false);
-            wxClientDC dc(this);
-            EraseShape(m_draggedShape, dc);
-            DrawShapes(dc);
+
+            // redraw immediately
+            Refresh(true);
+            Update();
 
             switch (m_draggedShape->GetDragMethod())
             {
                 case SHAPE_DRAG_BITMAP:
                 {
-                    m_dragImage = new wxDragImage(m_draggedShape->GetBitmap(), wxCursor(wxCURSOR_HAND));
+                    m_dragImage = new MyDragImage(this, m_draggedShape->GetBitmap(), wxCursor(wxCURSOR_HAND));
                     break;
                 }
                 case SHAPE_DRAG_TEXT:
                 {
-                    m_dragImage = new wxDragImage(wxString(_T("Dragging some test text")), wxCursor(wxCURSOR_HAND));
+                    m_dragImage = new MyDragImage(this, wxString(_T("Dragging some test text")), wxCursor(wxCURSOR_HAND));
                     break;
                 }
                 case SHAPE_DRAG_ICON:
                 {
-                    m_dragImage = new wxDragImage(wxICON(dragicon), wxCursor(wxCURSOR_HAND));
+                    m_dragImage = new MyDragImage(this, wxICON(dragicon), wxCursor(wxCURSOR_HAND));
                     break;
                 }
             }
@@ -235,20 +232,18 @@ void MyCanvas::OnMouseEvent(wxMouseEvent& event)
 
             if (mustUnhighlightOld || mustHighlightNew)
                 m_dragImage->Hide();
-
+            
             // Now with the drag image switched off, we can change the window contents.
-
             if (mustUnhighlightOld)
-            {
-                wxClientDC clientDC(this);
-                m_currentlyHighlighted->Draw(clientDC);
                 m_currentlyHighlighted = (DragShape*) NULL;
-            }
+
             if (mustHighlightNew)
-            {
-                wxClientDC clientDC(this);
                 m_currentlyHighlighted = onShape;
-                m_currentlyHighlighted->Draw(clientDC, wxINVERT);
+
+            if (mustUnhighlightOld || mustHighlightNew)
+            {
+                Refresh(mustUnhighlightOld);
+                Update();
             }
 
             // Move and show the image again
@@ -266,8 +261,10 @@ void MyCanvas::DrawShapes(wxDC& dc)
     while (node)
     {
         DragShape* shape = (DragShape*) node->GetData();
-        if (shape->IsShown())
-          shape->Draw(dc);
+        if (shape->IsShown() && m_draggedShape != shape)
+        {
+            shape->Draw(dc, (m_currentlyHighlighted == shape));
+        }
         node = node->GetNext();
     }
 }
@@ -471,7 +468,7 @@ bool DragShape::HitTest(const wxPoint& pt) const
     return rect.Contains(pt.x, pt.y);
 }
 
-bool DragShape::Draw(wxDC& dc, int op)
+bool DragShape::Draw(wxDC& dc, bool highlight)
 {
     if (m_bitmap.Ok())
     {
@@ -479,7 +476,14 @@ bool DragShape::Draw(wxDC& dc, int op)
         memDC.SelectObject(m_bitmap);
 
         dc.Blit(m_pos.x, m_pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight(),
-            & memDC, 0, 0, op, true);
+            & memDC, 0, 0, wxCOPY, true);
+            
+        if (highlight)
+        {
+            dc.SetPen(*wxWHITE_PEN);
+            dc.SetBrush(*wxTRANSPARENT_BRUSH);
+            dc.DrawRectangle(m_pos.x, m_pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight());
+        }
 
         return true;
     }
@@ -487,3 +491,19 @@ bool DragShape::Draw(wxDC& dc, int op)
         return false;
 }
 
+// MyDragImage
+
+// On some platforms, notably Mac OS X with Core Graphics, we can't blit from
+// a window, so we need to draw the background explicitly.
+bool MyDragImage::UpdateBackingFromWindow(wxDC& WXUNUSED(windowDC), wxMemoryDC& destDC, const wxRect& WXUNUSED(sourceRect),
+                    const wxRect& destRect) const
+{
+    destDC.SetClippingRegion(destRect);
+
+    if (wxGetApp().GetBackgroundBitmap().Ok())
+        wxGetApp().TileBitmap(destRect, destDC, wxGetApp().GetBackgroundBitmap());
+
+    m_canvas->DrawShapes(destDC);
+    return true;
+}
+
index cdc1baa9121a35471129cf656adb6132e5f2825b..e70fc5faf56e416ad1523c7f11b5c155a1711e4f 100644 (file)
@@ -128,7 +128,7 @@ public:
 //// Operations
 
     bool HitTest(const wxPoint& pt) const;
-    bool Draw(wxDC& dc, int op = wxCOPY);
+    bool Draw(wxDC& dc, bool highlight = false);
 
 //// Accessors
 
@@ -153,5 +153,39 @@ protected:
     bool        m_show;
 };
 
+// MyDragImage
+// A derived class is required since we're overriding UpdateBackingFromWindow,
+// for compatibility with Mac OS X (Core Graphics) which does not support blitting
+// from a window.
+
+class MyDragImage: public wxDragImage
+{
+public:
+    MyDragImage(MyCanvas* canvas): m_canvas(canvas) {}
+
+    MyDragImage(MyCanvas* canvas, const wxBitmap& image, const wxCursor& cursor = wxNullCursor):
+        wxDragImage(image, cursor), m_canvas(canvas)
+    {
+    }
+
+    MyDragImage(MyCanvas* canvas, const wxIcon& image, const wxCursor& cursor = wxNullCursor):
+        wxDragImage(image, cursor), m_canvas(canvas)
+    {
+    }
+
+    MyDragImage(MyCanvas* canvas, const wxString& str, const wxCursor& cursor = wxNullCursor):
+        wxDragImage(str, cursor), m_canvas(canvas)
+    {
+    }
+
+    // On some platforms, notably Mac OS X with Core Graphics, we can't blit from
+    // a window, so we need to draw the background explicitly.
+    virtual bool UpdateBackingFromWindow(wxDC& windowDC, wxMemoryDC& destDC, const wxRect& sourceRect,
+                    const wxRect& destRect) const;
+
+protected:
+    MyCanvas*   m_canvas;
+};
+
 #endif
     // _WX_DRAGIMAGSAMPLE_