Removed dependence on wxClientDC and blitting from a window,
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user