X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/78d93bf65a28b61e1c9ffb02613c2d0e44da631a..f068697b463e8ee2787e867597ab74c68e94aba6:/samples/dragimag/dragimag.cpp diff --git a/samples/dragimag/dragimag.cpp b/samples/dragimag/dragimag.cpp index 8b5be97a0f..557f0a1ef9 100644 --- a/samples/dragimag/dragimag.cpp +++ b/samples/dragimag/dragimag.cpp @@ -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(); } } @@ -468,10 +465,10 @@ DragShape::DragShape(const wxBitmap& bitmap) bool DragShape::HitTest(const wxPoint& pt) const { wxRect rect(GetRect()); - return rect.Inside(pt.x, pt.y); + 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; +} +