]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/scroll/scroll.cpp
RCS-IDs
[wxWidgets.git] / samples / scroll / scroll.cpp
index 098c34f1ea907ba10d69a19d7aa79c89549c5000..a22c23e2a907ec74568992ec2a2e64ba7b7811ef 100644 (file)
@@ -34,20 +34,22 @@ const long ID_INSERT_NEW = 101;
 // a trivial example
 // ----------------------------------------------------------------------
 
-class MySimpleFrame;
-class MySimpleCanvas;
-
-// MySimpleCanvas
-
+// MySimpleCanvas: a scrolled window which draws a simple rectangle
 class MySimpleCanvas: public wxScrolledWindow
 {
 public:
     MySimpleCanvas() { }
-    MySimpleCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size );
-
-    void OnPaint( wxPaintEvent &event );
+    MySimpleCanvas(wxWindow *parent);
 
 private:
+    void OnPaint(wxPaintEvent& event);
+
+    enum
+    {
+        CANVAS_WIDTH = 292,
+        CANVAS_HEIGHT = 297
+    };
+
     DECLARE_DYNAMIC_CLASS(MyCanvas)
     DECLARE_EVENT_TABLE()
 };
@@ -58,12 +60,14 @@ BEGIN_EVENT_TABLE(MySimpleCanvas, wxScrolledWindow)
   EVT_PAINT(      MySimpleCanvas::OnPaint)
 END_EVENT_TABLE()
 
-MySimpleCanvas::MySimpleCanvas( wxWindow *parent, wxWindowID id,
-                    const wxPoint &pos, const wxSize &size )
-    : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER, _T("test canvas") )
+MySimpleCanvas::MySimpleCanvas(wxWindow *parent)
+              : wxScrolledWindow(parent, wxID_ANY,
+                                 wxDefaultPosition,
+                                 wxDefaultSize,
+                                 wxSUNKEN_BORDER)
 {
     SetScrollRate( 10, 10 );
-    SetVirtualSize( 92, 97 );
+    SetVirtualSize( CANVAS_WIDTH, CANVAS_HEIGHT );
     SetBackgroundColour( *wxWHITE );
 }
 
@@ -74,21 +78,18 @@ void MySimpleCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
 
     dc.SetPen( *wxRED_PEN );
     dc.SetBrush( *wxTRANSPARENT_BRUSH );
-    dc.DrawRectangle( 0,0,92,97 );
+    dc.DrawRectangle( 0, 0, CANVAS_WIDTH, CANVAS_HEIGHT );
 }
 
-// MySimpleFrame
-
+// MySimpleFrame: a frame which contains a MySimpleCanvas
 class MySimpleFrame: public wxFrame
 {
 public:
     MySimpleFrame();
 
-    void OnQuit( wxCommandEvent &event );
-
-    MySimpleCanvas         *m_canvas;
-
 private:
+    void OnClose(wxCommandEvent& WXUNUSED(event)) { Close(true); }
+
     DECLARE_DYNAMIC_CLASS(MySimpleFrame)
     DECLARE_EVENT_TABLE()
 };
@@ -97,27 +98,22 @@ private:
 IMPLEMENT_DYNAMIC_CLASS( MySimpleFrame, wxFrame )
 
 BEGIN_EVENT_TABLE(MySimpleFrame,wxFrame)
-  EVT_MENU    (ID_QUIT,  MySimpleFrame::OnQuit)
+  EVT_MENU(wxID_CLOSE, MySimpleFrame::OnClose)
 END_EVENT_TABLE()
 
 MySimpleFrame::MySimpleFrame()
-       : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxScrolledWindow sample"),
-                  wxPoint(120,120), wxSize(150,150) )
+             : wxFrame(NULL, wxID_ANY, _T("wxScrolledWindow sample"),
+                       wxDefaultPosition, wxSize(200, 200))
 {
     wxMenu *file_menu = new wxMenu();
-    file_menu->Append( ID_QUIT,       _T("E&xit\tAlt-X"));
+    file_menu->Append(wxID_CLOSE);
 
     wxMenuBar *menu_bar = new wxMenuBar();
     menu_bar->Append(file_menu, _T("&File"));
 
     SetMenuBar( menu_bar );
 
-    m_canvas = new MySimpleCanvas( this, wxID_ANY, wxPoint(0,0), wxSize(100,100) );
-}
-
-void MySimpleFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
-{
-  Close( true );
+    new MySimpleCanvas(this);
 }
 
 // ----------------------------------------------------------------------
@@ -273,6 +269,7 @@ protected: // event stuff
     void OnMouseLeftDown(wxMouseEvent& event);
     void OnMouseLeftUp(wxMouseEvent& event);
     void OnMouseMove(wxMouseEvent& event);
+    void OnMouseCaptureLost(wxMouseCaptureLostEvent& event);
     void OnScroll(wxScrollWinEvent& event);
 
     DECLARE_EVENT_TABLE()
@@ -534,16 +531,11 @@ MyAutoScrollWindow::MyAutoScrollWindow( wxWindow *parent )
                              wxDefaultPosition,
                              SMALL_BUTTON );
 
-    // We need to do this here, because wxADJUST_MINSIZE below
-    // will cause the initial size to be ignored for Best/Min size.
-    // It would be nice to fix the sizers to handle this a little
-    // more cleanly.
-
     m_button->SetSizeHints( SMALL_BUTTON.GetWidth(), SMALL_BUTTON.GetHeight() );
 
     innersizer->Add( m_button,
                      0,
-                     wxALIGN_CENTER | wxALL | wxADJUST_MINSIZE,
+                     wxALIGN_CENTER | wxALL,
                      20 );
 
     innersizer->Add( new wxStaticText( this, wxID_ANY, _T("This is just") ),
@@ -672,6 +664,9 @@ void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
 
 bool MyApp::OnInit()
 {
+    if ( !wxApp::OnInit() )
+        return false;
+
     wxFrame *frame = new MyFrame();
     frame->Show( true );
 
@@ -740,6 +735,7 @@ BEGIN_EVENT_TABLE(MyAutoTimedScrollingWindow, wxScrolledWindow)
     EVT_LEFT_DOWN(MyAutoTimedScrollingWindow::OnMouseLeftDown)
     EVT_LEFT_UP(MyAutoTimedScrollingWindow::OnMouseLeftUp)
     EVT_MOTION(MyAutoTimedScrollingWindow::OnMouseMove)
+    EVT_MOUSE_CAPTURE_LOST(MyAutoTimedScrollingWindow::OnMouseCaptureLost)
     EVT_SCROLLWIN(MyAutoTimedScrollingWindow::OnScroll)
 END_EVENT_TABLE()
 
@@ -934,7 +930,9 @@ void MyAutoTimedScrollingWindow::OnDraw(wxDC& dc)
     wxBrush selBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT)
             , wxSOLID);
     dc.SetPen(*wxTRANSPARENT_PEN);
-    wxString str = sm_testData;
+    const wxString str = sm_testData;
+    size_t strLength = str.length();
+    wxString::const_iterator str_i;
 
     // draw the characters
     // 1. for each update region
@@ -945,6 +943,7 @@ void MyAutoTimedScrollingWindow::OnDraw(wxDC& dc)
         for (int chY = updRectInGChars.y
                 ; chY <= updRectInGChars.y + updRectInGChars.height; ++chY) {
             // 3. for each character in the row
+            bool isFirstX = true;
             for (int chX = updRectInGChars.x
                     ; chX <= updRectInGChars.x + updRectInGChars.width
                     ; ++chX) {
@@ -966,10 +965,15 @@ void MyAutoTimedScrollingWindow::OnDraw(wxDC& dc)
                 size_t charIndex = chY * sm_lineLen + chX;
                 if (chY < sm_lineCnt &&
                     chX < sm_lineLen &&
-                    charIndex < str.Length())
+                    charIndex < strLength)
                 {
-                    dc.DrawText(str.Mid(charIndex,1),
-                                charPos.x, charPos.y);
+                    if (isFirstX)
+                    {
+                        str_i = str.begin() + charIndex;
+                        isFirstX = false;
+                    }
+                    dc.DrawText(*str_i, charPos.x, charPos.y);
+                    ++str_i;
                 }
             }
         }
@@ -1010,6 +1014,12 @@ void MyAutoTimedScrollingWindow::OnMouseMove(wxMouseEvent& event)
     }
 }
 
+void MyAutoTimedScrollingWindow::OnMouseCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event))
+{
+    // we only capture mouse for timed scrolling, so nothing is needed here
+    // other than making sure to not call event.Skip()
+}
+
 void MyAutoTimedScrollingWindow::OnScroll(wxScrollWinEvent& event)
 {
     // need to move the cursor when autoscrolling