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;
|
delete m_dragImage;
|
||||||
m_dragImage = NULL;
|
m_dragImage = NULL;
|
||||||
|
|
||||||
wxClientDC dc(this);
|
|
||||||
if (m_currentlyHighlighted)
|
|
||||||
{
|
|
||||||
m_currentlyHighlighted->Draw(dc);
|
|
||||||
}
|
|
||||||
m_draggedShape->SetShow(true);
|
m_draggedShape->SetShow(true);
|
||||||
m_draggedShape->Draw(dc);
|
|
||||||
|
|
||||||
m_currentlyHighlighted = (DragShape*) NULL;
|
m_currentlyHighlighted = (DragShape*) NULL;
|
||||||
|
|
||||||
m_draggedShape = (DragShape*) NULL;
|
m_draggedShape = (DragShape*) NULL;
|
||||||
|
|
||||||
|
Refresh(true);
|
||||||
}
|
}
|
||||||
else if (event.Dragging() && m_dragMode != TEST_DRAG_NONE)
|
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
|
// Erase the dragged shape from the canvas
|
||||||
m_draggedShape->SetShow(false);
|
m_draggedShape->SetShow(false);
|
||||||
wxClientDC dc(this);
|
|
||||||
EraseShape(m_draggedShape, dc);
|
// redraw immediately
|
||||||
DrawShapes(dc);
|
Refresh(true);
|
||||||
|
Update();
|
||||||
|
|
||||||
switch (m_draggedShape->GetDragMethod())
|
switch (m_draggedShape->GetDragMethod())
|
||||||
{
|
{
|
||||||
case SHAPE_DRAG_BITMAP:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case SHAPE_DRAG_TEXT:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case SHAPE_DRAG_ICON:
|
case SHAPE_DRAG_ICON:
|
||||||
{
|
{
|
||||||
m_dragImage = new wxDragImage(wxICON(dragicon), wxCursor(wxCURSOR_HAND));
|
m_dragImage = new MyDragImage(this, wxICON(dragicon), wxCursor(wxCURSOR_HAND));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,20 +232,18 @@ void MyCanvas::OnMouseEvent(wxMouseEvent& event)
|
|||||||
|
|
||||||
if (mustUnhighlightOld || mustHighlightNew)
|
if (mustUnhighlightOld || mustHighlightNew)
|
||||||
m_dragImage->Hide();
|
m_dragImage->Hide();
|
||||||
|
|
||||||
// Now with the drag image switched off, we can change the window contents.
|
// Now with the drag image switched off, we can change the window contents.
|
||||||
|
|
||||||
if (mustUnhighlightOld)
|
if (mustUnhighlightOld)
|
||||||
{
|
|
||||||
wxClientDC clientDC(this);
|
|
||||||
m_currentlyHighlighted->Draw(clientDC);
|
|
||||||
m_currentlyHighlighted = (DragShape*) NULL;
|
m_currentlyHighlighted = (DragShape*) NULL;
|
||||||
}
|
|
||||||
if (mustHighlightNew)
|
if (mustHighlightNew)
|
||||||
{
|
|
||||||
wxClientDC clientDC(this);
|
|
||||||
m_currentlyHighlighted = onShape;
|
m_currentlyHighlighted = onShape;
|
||||||
m_currentlyHighlighted->Draw(clientDC, wxINVERT);
|
|
||||||
|
if (mustUnhighlightOld || mustHighlightNew)
|
||||||
|
{
|
||||||
|
Refresh(mustUnhighlightOld);
|
||||||
|
Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move and show the image again
|
// Move and show the image again
|
||||||
@@ -266,8 +261,10 @@ void MyCanvas::DrawShapes(wxDC& dc)
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
DragShape* shape = (DragShape*) node->GetData();
|
DragShape* shape = (DragShape*) node->GetData();
|
||||||
if (shape->IsShown())
|
if (shape->IsShown() && m_draggedShape != shape)
|
||||||
shape->Draw(dc);
|
{
|
||||||
|
shape->Draw(dc, (m_currentlyHighlighted == shape));
|
||||||
|
}
|
||||||
node = node->GetNext();
|
node = node->GetNext();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -471,7 +468,7 @@ bool DragShape::HitTest(const wxPoint& pt) const
|
|||||||
return rect.Contains(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())
|
if (m_bitmap.Ok())
|
||||||
{
|
{
|
||||||
@@ -479,7 +476,14 @@ bool DragShape::Draw(wxDC& dc, int op)
|
|||||||
memDC.SelectObject(m_bitmap);
|
memDC.SelectObject(m_bitmap);
|
||||||
|
|
||||||
dc.Blit(m_pos.x, m_pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight(),
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -487,3 +491,19 @@ bool DragShape::Draw(wxDC& dc, int op)
|
|||||||
return false;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -128,7 +128,7 @@ public:
|
|||||||
//// Operations
|
//// Operations
|
||||||
|
|
||||||
bool HitTest(const wxPoint& pt) const;
|
bool HitTest(const wxPoint& pt) const;
|
||||||
bool Draw(wxDC& dc, int op = wxCOPY);
|
bool Draw(wxDC& dc, bool highlight = false);
|
||||||
|
|
||||||
//// Accessors
|
//// Accessors
|
||||||
|
|
||||||
@@ -153,5 +153,39 @@ protected:
|
|||||||
bool m_show;
|
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
|
#endif
|
||||||
// _WX_DRAGIMAGSAMPLE_
|
// _WX_DRAGIMAGSAMPLE_
|
||||||
|
Reference in New Issue
Block a user