X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/888dde65f43d5f57e8fb2028b27191cca1741403..05e0b047d879cdbfade7f2ab346c0acdf3e29f96:/samples/drawing/drawing.cpp diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp index 9de12ad7af..8a41242bd5 100644 --- a/samples/drawing/drawing.cpp +++ b/samples/drawing/drawing.cpp @@ -34,22 +34,14 @@ #include "wx/image.h" #include "wx/artprov.h" #include "wx/dcgraph.h" - -#define wxTEST_GRAPHICS 1 - -#if wxTEST_GRAPHICS +#include "wx/overlay.h" #include "wx/graphics.h" -#if wxUSE_GRAPHICS_CONTEXT == 0 -#undef wxTEST_GRAPHICS -#define wxTEST_GRAPHICS 0 -#endif -#else -#undef wxUSE_GRAPHICS_CONTEXT -#define wxUSE_GRAPHICS_CONTEXT 0 -#endif +#include "wx/filename.h" + +#define TEST_CAIRO_EVERYWHERE 0 // ---------------------------------------------------------------------------- -// ressources +// resources // ---------------------------------------------------------------------------- // the application icon @@ -171,6 +163,8 @@ public: void OnPaint(wxPaintEvent &event); void OnMouseMove(wxMouseEvent &event); + void OnMouseDown(wxMouseEvent &event); + void OnMouseUp(wxMouseEvent &event); void ToShow(ScreenToShow show) { m_show = show; Refresh(); } @@ -212,6 +206,10 @@ private: wxBitmap m_smile_bmp; wxIcon m_std_icon; bool m_clip; + wxOverlay m_overlay; + bool m_rubberBand; + wxPoint m_anchorpoint; + wxPoint m_currentpoint; #if wxUSE_GRAPHICS_CONTEXT bool m_useContext ; #endif @@ -320,6 +318,9 @@ bool MyApp::LoadImages() gs_bmp36 = new wxBitmap; wxPathList pathList; + // special hack for Unix in-tree sample build, don't do this in real + // programs, use wxStandardPaths instead + pathList.Add(wxFileName(argv[0]).GetPath()); pathList.Add(_T(".")); pathList.Add(_T("..")); pathList.Add(_T("../..")); @@ -383,10 +384,8 @@ bool MyApp::OnInit() wxT("for this sample from the current or parent ") wxT("directory, please copy them there.")); - // stop here - DeleteBitmaps(); - - return false; + // still continue, the sample can be used without images too if they're + // missing for whatever reason } // ok, continue @@ -421,6 +420,8 @@ void MyApp::DeleteBitmaps() BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_PAINT (MyCanvas::OnPaint) EVT_MOTION (MyCanvas::OnMouseMove) + EVT_LEFT_DOWN (MyCanvas::OnMouseDown) + EVT_LEFT_UP (MyCanvas::OnMouseUp) END_EVENT_TABLE() #include "smile.xpm" @@ -434,6 +435,7 @@ MyCanvas::MyCanvas(MyFrame *parent) m_smile_bmp = wxBitmap(smile_xpm); m_std_icon = wxArtProvider::GetIcon(wxART_INFORMATION); m_clip = false; + m_rubberBand = false; #if wxUSE_GRAPHICS_CONTEXT m_useContext = false; #endif @@ -809,20 +811,20 @@ void MyCanvas::DrawText(wxDC& dc) // test the logical function effect wxCoord y = 150; dc.SetLogicalFunction(wxINVERT); - dc.DrawText( _T("There should be no text below"), 110, 150 ); + // text drawing should ignore logical function + dc.DrawText( _T("There should be a text below"), 110, 150 ); dc.DrawRectangle( 110, y, 100, height ); - // twice drawn inverted should result in invisible y += height; - dc.DrawText( _T("Invisible text"), 110, y ); + dc.DrawText( _T("Visible text"), 110, y ); dc.DrawRectangle( 110, y, 100, height ); - dc.DrawText( _T("Invisible text"), 110, y ); + dc.DrawText( _T("Visible text"), 110, y ); dc.DrawRectangle( 110, y, 100, height ); dc.SetLogicalFunction(wxCOPY); y += height; dc.DrawRectangle( 110, y, 100, height ); - dc.DrawText( _T("Visible text"), 110, y ); + dc.DrawText( _T("Another visible text"), 110, y ); } static const struct @@ -1351,7 +1353,7 @@ void MyCanvas::DrawRegionsHelper(wxDC& dc, wxCoord x, bool firstTime) if ( !firstTime ) region.Offset(10, 10); #endif - dc.SetClippingRegion(region); + dc.SetDeviceClippingRegion(region); dc.SetBrush( *wxGREY_BRUSH ); dc.DrawRectangle( x, y, 310, 310 ); @@ -1366,12 +1368,21 @@ void MyCanvas::DrawRegionsHelper(wxDC& dc, wxCoord x, bool firstTime) } } +#if TEST_CAIRO_EVERYWHERE +extern wxGraphicsRenderer* gCairoRenderer; +#endif + void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC pdc(this); #if wxUSE_GRAPHICS_CONTEXT +#if TEST_CAIRO_EVERYWHERE + wxGCDC gdc; + gdc.SetGraphicsContext( gCairoRenderer->CreateContext( pdc ) ); +#else wxGCDC gdc( pdc ) ; +#endif wxDC &dc = m_useContext ? (wxDC&) gdc : (wxDC&) pdc ; #else wxDC &dc = pdc ; @@ -1479,21 +1490,83 @@ void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) void MyCanvas::OnMouseMove(wxMouseEvent &event) { #if wxUSE_STATUSBAR - wxClientDC dc(this); - PrepareDC(dc); - m_owner->PrepareDC(dc); - - wxPoint pos = event.GetPosition(); - long x = dc.DeviceToLogicalX( pos.x ); - long y = dc.DeviceToLogicalY( pos.y ); - wxString str; - str.Printf( wxT("Current mouse position: %d,%d"), (int)x, (int)y ); - m_owner->SetStatusText( str ); + { + wxClientDC dc(this); + PrepareDC(dc); + m_owner->PrepareDC(dc); + + wxPoint pos = event.GetPosition(); + long x = dc.DeviceToLogicalX( pos.x ); + long y = dc.DeviceToLogicalY( pos.y ); + wxString str; + str.Printf( wxT("Current mouse position: %d,%d"), (int)x, (int)y ); + m_owner->SetStatusText( str ); + } + + if ( m_rubberBand ) + { + int x,y, xx, yy ; + event.GetPosition(&x,&y); + CalcUnscrolledPosition( x, y, &xx, &yy ); + m_currentpoint = wxPoint( xx , yy ) ; + wxRect newrect ( m_anchorpoint , m_currentpoint ) ; + + wxClientDC dc( this ) ; + PrepareDC( dc ) ; + + wxDCOverlay overlaydc( m_overlay, &dc ); + overlaydc.Clear(); +#ifdef __WXMAC__ + dc.SetPen( *wxGREY_PEN ); + dc.SetBrush( wxColour( 192,192,192,64 ) ); +#else + dc.SetPen( wxPen( *wxLIGHT_GREY, 2, wxSOLID ) ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); +#endif + dc.DrawRectangle( newrect ); + } #else wxUnusedVar(event); #endif // wxUSE_STATUSBAR } +void MyCanvas::OnMouseDown(wxMouseEvent &event) +{ + int x,y,xx,yy ; + event.GetPosition(&x,&y); + CalcUnscrolledPosition( x, y, &xx, &yy ); + m_anchorpoint = wxPoint( xx , yy ) ; + m_currentpoint = m_anchorpoint ; + m_rubberBand = true ; + CaptureMouse() ; +} + +void MyCanvas::OnMouseUp(wxMouseEvent &event) +{ + if ( m_rubberBand ) + { + ReleaseMouse(); + { + wxClientDC dc( this ); + PrepareDC( dc ); + wxDCOverlay overlaydc( m_overlay, &dc ); + overlaydc.Clear(); + } + m_overlay.Reset(); + m_rubberBand = false; + + int x,y,xx,yy ; + event.GetPosition(&x,&y); + CalcUnscrolledPosition( x, y, &xx, &yy ); + + wxString str; + str.Printf( wxT("Rectangle selection from %d,%d to %d,%d"), + m_anchorpoint.x, m_anchorpoint.y , (int)xx, (int)yy ); + wxMessageBox( str , wxT("Rubber-Banding") ); + + } +} + // ---------------------------------------------------------------------------- // MyFrame // ---------------------------------------------------------------------------- @@ -1530,7 +1603,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFile->Append(File_ShowPolygons, _T("&Polygons screen\tF5")); menuFile->Append(File_ShowMask, _T("&Mask screen\tF6")); menuFile->Append(File_ShowMaskStretch, _T("1/&2 scaled mask\tShift-F6")); - menuFile->Append(File_ShowOps, _T("&ROP screen\tF7")); + menuFile->Append(File_ShowOps, _T("&Raster operations screen\tF7")); menuFile->Append(File_ShowRegions, _T("Re&gions screen\tF8")); menuFile->Append(File_ShowCircles, _T("&Circles screen\tF9")); #if wxUSE_GRAPHICS_CONTEXT @@ -1539,7 +1612,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFile->Append(File_ShowSplines, _T("&Splines screen\tF11")); menuFile->Append(File_ShowGradients, _T("&Gradients screen\tF12")); #if wxUSE_GRAPHICS_CONTEXT - menuFile->Append(File_ShowGraphics, _T("&Graphics screen\tF13")); + menuFile->Append(File_ShowGraphics, _T("&Graphics screen")); #endif menuFile->AppendSeparator(); menuFile->AppendCheckItem(File_Clip, _T("&Clip\tCtrl-C"), _T("Clip/unclip drawing"));