X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/428db2ea5a8b92f0f0dce5538779e31711b06c28..ce6d2511f82aafc78aba320018c868f826ab172b:/samples/drawing/drawing.cpp diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp index 012646186d..76af6243ef 100644 --- a/samples/drawing/drawing.cpp +++ b/samples/drawing/drawing.cpp @@ -61,6 +61,8 @@ public: virtual bool OnInit(); }; +class MyCanvas; + // Define a new frame type: this is going to be our main frame class MyFrame : public wxFrame { @@ -71,31 +73,46 @@ public: // event handlers (these functions should _not_ be virtual) void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); - void OnPaint(wxPaintEvent &event); void OnOption(wxCommandEvent &event); - void OnMouseMove(wxMouseEvent &event); wxColour SelectColour(); void PrepareDC(wxDC& dc); -protected: - int m_backgroundMode; - int m_mapMode; - double m_xUserScale; - double m_yUserScale; - int m_xLogicalOrigin; - int m_yLogicalOrigin; - bool m_xAxisReversed, - m_yAxisReversed; - wxColour m_colourForeground, // these are _text_ colours - m_colourBackground; - wxBrush m_backgroundBrush; + int m_backgroundMode; + int m_mapMode; + double m_xUserScale; + double m_yUserScale; + int m_xLogicalOrigin; + int m_yLogicalOrigin; + bool m_xAxisReversed, + m_yAxisReversed; + wxColour m_colourForeground, // these are _text_ colours + m_colourBackground; + wxBrush m_backgroundBrush; + MyCanvas *m_canvas; private: // any class wishing to process wxWindows events must use this macro DECLARE_EVENT_TABLE() }; +// define a scrollable canvas for drawing onto +class MyCanvas: public wxScrolledWindow +{ +public: + MyCanvas( MyFrame *parent ); + + void DrawTestLines( int x, int y, int width, wxDC &dc ); + void OnPaint(wxPaintEvent &event); + void OnMouseMove(wxMouseEvent &event); + +protected: + MyFrame *m_owner; + +private: + DECLARE_EVENT_TABLE() +}; + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -141,19 +158,6 @@ enum // event tables and other macros for wxWindows // ---------------------------------------------------------------------------- -// the event tables connect the wxWindows events with the functions (event -// handlers) which process them. It can be also done at run-time, but for the -// simple menu events like this the static method is much simpler. -BEGIN_EVENT_TABLE(MyFrame, wxFrame) - - EVT_MOTION (MyFrame::OnMouseMove) - EVT_PAINT (MyFrame::OnPaint) - - EVT_MENU(Minimal_Quit, MyFrame::OnQuit) - EVT_MENU(Minimal_About, MyFrame::OnAbout) - - EVT_MENU_RANGE(MenuOption_First, MenuOption_Last, MyFrame::OnOption) -END_EVENT_TABLE() // Create a new application object: this macro will allow wxWindows to create // the application object during program execution (it's better than using a @@ -175,7 +179,7 @@ bool MyApp::OnInit() { // Create the main application window MyFrame *frame = new MyFrame("Drawing sample", - wxPoint(50, 50), wxSize(450, 340)); + wxPoint(50, 50), wxSize(550, 340)); // Show it and tell the application that it's our main window frame->Show(TRUE); @@ -188,9 +192,162 @@ bool MyApp::OnInit() } // ---------------------------------------------------------------------------- -// main frame +// MyCanvas // ---------------------------------------------------------------------------- +// the event tables connect the wxWindows events with the functions (event +// handlers) which process them. +BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) + EVT_PAINT (MyCanvas::OnPaint) + EVT_MOTION (MyCanvas::OnMouseMove) +END_EVENT_TABLE() + +MyCanvas::MyCanvas( MyFrame *parent ) + : wxScrolledWindow( parent ) +{ + m_owner = parent; +} + +void MyCanvas::DrawTestLines( int x, int y, int width, wxDC &dc ) +{ + dc.SetPen( wxPen( "black", width, wxSOLID) ); + dc.SetBrush( *wxRED_BRUSH ); + dc.DrawRectangle( x+10, y+10, 100, 190 ); + + dc.SetPen( wxPen( "black", width, wxSOLID) ); + dc.DrawLine( x+20, y+20, 100, y+20 ); + dc.SetPen( wxPen( "black", width, wxDOT) ); + dc.DrawLine( x+20, y+30, 100, y+30 ); + dc.SetPen( wxPen( "black", width, wxSHORT_DASH) ); + dc.DrawLine( x+20, y+40, 100, y+40 ); + dc.SetPen( wxPen( "black", width, wxLONG_DASH) ); + dc.DrawLine( x+20, y+50, 100, y+50 ); + dc.SetPen( wxPen( "black", width, wxDOT_DASH) ); + dc.DrawLine( x+20, y+60, 100, y+60 ); + + dc.SetPen( wxPen( "black", width, wxBDIAGONAL_HATCH) ); + dc.DrawLine( x+20, y+70, 100, y+70 ); + dc.SetPen( wxPen( "black", width, wxCROSSDIAG_HATCH) ); + dc.DrawLine( x+20, y+80, 100, y+80 ); + dc.SetPen( wxPen( "black", width, wxFDIAGONAL_HATCH) ); + dc.DrawLine( x+20, y+90, 100, y+90 ); + dc.SetPen( wxPen( "black", width, wxCROSS_HATCH) ); + dc.DrawLine( x+20, y+100, 100, y+100 ); + dc.SetPen( wxPen( "black", width, wxHORIZONTAL_HATCH) ); + dc.DrawLine( x+20, y+110, 100, y+110 ); + dc.SetPen( wxPen( "black", width, wxVERTICAL_HATCH) ); + dc.DrawLine( x+20, y+120, 100, y+120 ); + + wxPen ud( "black", width, wxUSER_DASH ); + wxDash dash1[1]; + dash1[0] = 0; + ud.SetDashes( 1, dash1 ); + dc.DrawLine( x+20, y+140, 100, y+140 ); + dash1[0] = 1; + ud.SetDashes( 1, dash1 ); + dc.DrawLine( x+20, y+150, 100, y+150 ); + dash1[0] = 2; + ud.SetDashes( 1, dash1 ); + dc.DrawLine( x+20, y+160, 100, y+160 ); + dash1[0] = 0xFF; + ud.SetDashes( 1, dash1 ); + dc.DrawLine( x+20, y+170, 100, y+170 ); + +} + +void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) +{ + wxPaintDC dc(this); + PrepareDC(dc); + m_owner->PrepareDC(dc); + + dc.SetBackgroundMode( m_owner->m_backgroundMode ); + if ( m_owner->m_backgroundBrush.Ok() ) + dc.SetBackground( m_owner->m_backgroundBrush ); + if ( m_owner->m_colourForeground.Ok() ) + dc.SetTextForeground( m_owner->m_colourForeground ); + if ( m_owner->m_colourBackground.Ok() ) + dc.SetTextBackground( m_owner->m_colourBackground ); + + // mark the origin + dc.DrawCircle(0, 0, 10); +#if !(defined __WXGTK__) && !(defined __WXMOTIF__) + // not implemented in wxGTK or wxMOTIF :-( + dc.FloodFill(0, 0, wxColour(255, 0, 0)); +#endif // + + // set underlined font for testing + dc.SetFont( wxFont(12, wxMODERN, wxNORMAL, wxNORMAL, TRUE) ); + dc.DrawText( "This is text", 110, 10 ); + dc.DrawRotatedText( "That is text", 60, 30, -45 ); + + dc.SetFont( *wxNORMAL_FONT ); + + wxString text; + dc. SetBackgroundMode(wxTRANSPARENT); + + for ( int n = -180; n < 180; n += 30 ) + { + text.Printf(" %d rotated text", n); + dc.DrawRotatedText(text , 400, 400, n); + } + + dc.SetFont( wxFont( 18, wxSWISS, wxNORMAL, wxNORMAL ) ); + + dc.DrawText( "This is Swiss 18pt text.", 110, 40 ); + + long length; + long height; + long descent; + dc.GetTextExtent( "This is Swiss 18pt text.", &length, &height, &descent ); + text.Printf( "Dimensions are length %ld, height %ld, descent %ld", length, height, descent ); + dc.DrawText( text, 110, 80 ); + + dc.DrawRectangle( 100, 40, 4, height ); + + text.Printf( "CharHeight() returns: %d", dc.GetCharHeight() ); + dc.DrawText( text, 110, 120 ); + + + dc.DrawIcon( wxICON(mondrian), 310, 40 ); + + DrawTestLines( 0, 200, 0, dc ); + + DrawTestLines( 0, 400, 1, dc ); + + DrawTestLines( 0, 600, 2, dc ); + + DrawTestLines( 0, 800, 6, dc ); + +} + +void MyCanvas::OnMouseMove(wxMouseEvent &event) +{ + 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( "Current mouse position: %d,%d", (int)x, (int)y ); + m_owner->SetStatusText( str ); +} + +// ---------------------------------------------------------------------------- +// MyFrame +// ---------------------------------------------------------------------------- + +// the event tables connect the wxWindows events with the functions (event +// handlers) which process them. It can be also done at run-time, but for the +// simple menu events like this the static method is much simpler. +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU (Minimal_Quit, MyFrame::OnQuit) + EVT_MENU (Minimal_About, MyFrame::OnAbout) + EVT_MENU_RANGE(MenuOption_First, MenuOption_Last, MyFrame::OnOption) +END_EVENT_TABLE() + // frame constructor MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame *)NULL, -1, title, pos, size) @@ -258,8 +415,10 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) m_xAxisReversed = m_yAxisReversed = FALSE; m_backgroundMode = wxSOLID; -} + m_canvas = new MyCanvas( this ); + m_canvas->SetScrollbars( 10, 10, 100, 200 ); +} // event handlers @@ -361,7 +520,7 @@ void MyFrame::OnOption(wxCommandEvent &event) return; } - Refresh(); + m_canvas->Refresh(); } void MyFrame::PrepareDC(wxDC& dc) @@ -372,46 +531,6 @@ void MyFrame::PrepareDC(wxDC& dc) dc.SetAxisOrientation( !m_xAxisReversed, m_yAxisReversed ); } -void MyFrame::OnPaint(wxPaintEvent &WXUNUSED(event) ) -{ - wxPaintDC dc(this); - PrepareDC(dc); - - dc.SetBackgroundMode( m_backgroundMode ); - if ( m_backgroundBrush.Ok() ) - dc.SetBackground( m_backgroundBrush ); - if ( m_colourForeground.Ok() ) - dc.SetTextForeground( m_colourForeground ); - if ( m_colourBackground.Ok() ) - dc.SetTextBackground( m_colourBackground ); - - // mark the origin - dc.DrawCircle(0, 0, 10); -#ifndef __WXGTK__ // not implemented in wxGTK :-( - dc.FloodFill(0, 0, wxColour(255, 0, 0)); -#endif // __WXGTK__ - - dc.DrawRectangle( 10, 10, 90, 90 ); - dc.DrawRoundedRectangle( 10, 110, 90, 90, 5 ); - - dc.DrawText( "This is text\n(on multiple lines)", 110, 10 ); - - dc.DrawIcon( wxICON(mondrian), 110, 40 ); -} - -void MyFrame::OnMouseMove(wxMouseEvent &event) -{ - wxClientDC dc(this); - PrepareDC(dc); - - wxPoint pos = event.GetPosition(); - long x = dc.DeviceToLogicalX( pos.x ); - long y = dc.DeviceToLogicalY( pos.y ); - wxString str; - str.Printf( "Current mouse position: %d,%d", (int)x, (int)y ); - SetStatusText( str ); -} - wxColour MyFrame::SelectColour() { wxColour col;