X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8520f1374ceec64abae3802984c4f8654d8836ba..9e96e16fe0bc7af32d329c965ad110a3e5be5ad8:/samples/dragimag/dragimag.cpp diff --git a/samples/dragimag/dragimag.cpp b/samples/dragimag/dragimag.cpp index 031940c99f..fc0755b6ff 100644 --- a/samples/dragimag/dragimag.cpp +++ b/samples/dragimag/dragimag.cpp @@ -91,7 +91,7 @@ void MyCanvas::OnEraseBackground(wxEraseEvent& event) { wxSize sz = GetClientSize(); wxRect rect(0, 0, sz.x, sz.y); - + if (event.GetDC()) { wxGetApp().TileBitmap(rect, *(event.GetDC()), wxGetApp().GetBackgroundBitmap()); @@ -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,33 +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(wxT("Dragging some test text")), wxCursor(wxCURSOR_HAND)); break; } case SHAPE_DRAG_ICON: { - // Can anyone explain why this test is necessary, - // to prevent a gcc error? -#if defined(__WXMOTIF__) || defined(__WXX11__) - wxIcon icon(dragicon_xpm); -#else - wxIcon icon(wxICON(dragicon)); -#endif - - m_dragImage = new wxDragImage(icon, wxCursor(wxCURSOR_HAND)); + m_dragImage = new MyDragImage(this, wxICON(dragicon), wxCursor(wxCURSOR_HAND)); break; } } @@ -205,19 +194,19 @@ void MyCanvas::OnMouseEvent(wxMouseEvent& event) // The offset between the top-left of the shape image and the current shape position wxPoint beginDragHotSpot = m_dragStartPos - m_draggedShape->GetPosition(); - + // Now we do this inside the implementation: always assume // coordinates relative to the capture window (client coordinates) //if (fullScreen) // beginDragHotSpot -= ClientToScreen(wxPoint(0, 0)); - + if (!m_dragImage->BeginDrag(beginDragHotSpot, this, fullScreen)) { delete m_dragImage; m_dragImage = (wxDragImage*) NULL; m_dragMode = TEST_DRAG_NONE; - + } else { m_dragImage->Move(event.GetPosition()); @@ -243,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 @@ -274,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(); } } @@ -287,7 +276,7 @@ void MyCanvas::EraseShape(DragShape* shape, wxDC& dc) wxRect rect2(shape->GetRect()); dc.SetClippingRegion(rect2.x, rect2.y, rect2.width, rect2.height); - + wxGetApp().TileBitmap(rect, dc, wxGetApp().GetBackgroundBitmap()); dc.DestroyClippingRegion(); @@ -327,26 +316,26 @@ BEGIN_EVENT_TABLE(MyFrame,wxFrame) END_EVENT_TABLE() MyFrame::MyFrame() -: wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxDragImage sample"), +: wxFrame( (wxFrame *)NULL, wxID_ANY, wxT("wxDragImage sample"), wxPoint(20,20), wxSize(470,360) ) { wxMenu *file_menu = new wxMenu(); - file_menu->Append( wxID_ABOUT, _T("&About...")); - file_menu->AppendCheckItem( TEST_USE_SCREEN, _T("&Use whole screen for dragging"), _T("Use whole screen")); - file_menu->Append( wxID_EXIT, _T("E&xit")); - + file_menu->Append( wxID_ABOUT, wxT("&About...")); + file_menu->AppendCheckItem( TEST_USE_SCREEN, wxT("&Use whole screen for dragging"), wxT("Use whole screen")); + file_menu->Append( wxID_EXIT, wxT("E&xit")); + wxMenuBar *menu_bar = new wxMenuBar(); - menu_bar->Append(file_menu, _T("&File")); + menu_bar->Append(file_menu, wxT("&File")); SetIcon(wxICON(mondrian)); SetMenuBar( menu_bar ); - + #if wxUSE_STATUSBAR CreateStatusBar(2); int widths[] = { -1, 100 }; SetStatusWidths( 2, widths ); #endif // wxUSE_STATUSBAR - + m_canvas = new MyCanvas( this, wxID_ANY, wxPoint(0,0), wxSize(10,10) ); } @@ -357,9 +346,9 @@ void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) { - (void)wxMessageBox( _T("wxDragImage demo\n") - _T("Julian Smart (c) 2000"), - _T("About wxDragImage Demo"), + (void)wxMessageBox( wxT("wxDragImage demo\n") + wxT("Julian Smart (c) 2000"), + wxT("About wxDragImage Demo"), wxICON_INFORMATION | wxOK ); } @@ -379,29 +368,29 @@ MyApp::MyApp() bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + #if wxUSE_LIBPNG wxImage::AddHandler( new wxPNGHandler ); #endif wxImage image; - if (image.LoadFile(_T("backgrnd.png"), wxBITMAP_TYPE_PNG)) + if (image.LoadFile(wxT("backgrnd.png"), wxBITMAP_TYPE_PNG)) { m_background = wxBitmap(image); } MyFrame *frame = new MyFrame(); - wxString rootName(_T("shape0")); + wxString rootName(wxT("shape0")); - int i; - for (i = 1; i < 4; i++) + for (int i = 1; i < 4; i++) { - wxString filename; - filename.Printf(wxT("%s%d.png"), (const wxChar*)rootName, i); /* For some reason under wxX11, the 2nd LoadFile in this loop fails, with a BadMatch inside CreateFromImage (inside ConvertToBitmap). This happens even if you copy the first file over the second file. */ - if (image.LoadFile(filename, wxBITMAP_TYPE_PNG)) + if (image.LoadFile(wxString::Format("%s%d.png", rootName, i), wxBITMAP_TYPE_PNG)) { DragShape* newShape = new DragShape(wxBitmap(image)); newShape->SetPosition(wxPoint(i*50, i*50)); @@ -447,7 +436,7 @@ bool MyApp::TileBitmap(const wxRect& rect, wxDC& dc, wxBitmap& bitmap) { int w = bitmap.GetWidth(); int h = bitmap.GetHeight(); - + int i, j; for (i = rect.x; i < rect.x + rect.width; i += w) { @@ -473,25 +462,28 @@ DragShape::DragShape(const wxBitmap& bitmap) m_show = true; } -DragShape::~DragShape() -{ -} - 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()) { wxMemoryDC memDC; 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; } @@ -499,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; +} +