home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / scrollsub / scrollsub.cpp < prev    next >
C/C++ Source or Header  |  2002-12-16  |  12KB  |  442 lines

  1. /*
  2.  * Program: scrollsub
  3.  *
  4.  * Author: Robert Roebling
  5.  *
  6.  * Copyright: (C) 1999, Robert Roebling
  7.  *
  8.  */
  9.  
  10. // For compilers that support precompilation, includes "wx/wx.h".
  11. #include "wx/wxprec.h"
  12.  
  13. #ifdef __BORLANDC__
  14. #pragma hdrstop
  15. #endif
  16.  
  17. #ifndef WX_PRECOMP
  18. #include "wx/wx.h"
  19. #endif
  20.  
  21. #include "wx/image.h"
  22. #include "wx/listctrl.h"
  23. #include "wx/sizer.h"
  24. #include "wx/log.h"
  25.  
  26.  
  27. // derived classes
  28.  
  29. class MyFrame;
  30. class MyScrolledWindow;
  31. class MyCanvas;
  32. class MyApp;
  33.  
  34. // MyScrolledWindow
  35.  
  36. class MyScrolledWindow: public wxScrolledWindow
  37. {
  38. public:
  39.     MyScrolledWindow() {}
  40.     MyScrolledWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
  41.     ~MyScrolledWindow();
  42.     void OnPaint( wxPaintEvent &event );
  43.  
  44. private:
  45.     MyCanvas    *m_canvas;
  46.  
  47.     DECLARE_DYNAMIC_CLASS(MyScrolledWindow)
  48.     DECLARE_EVENT_TABLE()
  49. };
  50.  
  51. // MyTopLabels
  52.  
  53. class MyTopLabels: public wxWindow
  54. {
  55. public:
  56.     MyTopLabels() {}
  57.     MyTopLabels( wxScrolledWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
  58.  
  59.     void OnPaint( wxPaintEvent &event );
  60.  
  61. private:
  62.     wxScrolledWindow   *m_owner;
  63.  
  64.     DECLARE_DYNAMIC_CLASS(MyTopLabels)
  65.     DECLARE_EVENT_TABLE()
  66. };
  67.  
  68. // MyRightLabels
  69.  
  70. class MyRightLabels: public wxWindow
  71. {
  72. public:
  73.     MyRightLabels() {}
  74.     MyRightLabels( wxScrolledWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
  75.  
  76.     void OnPaint( wxPaintEvent &event );
  77.  
  78. private:
  79.     wxScrolledWindow   *m_owner;
  80.  
  81.     DECLARE_DYNAMIC_CLASS(MyRightLabels)
  82.     DECLARE_EVENT_TABLE()
  83. };
  84.  
  85. // MyCanvas
  86.  
  87. class MyCanvas: public wxPanel
  88. {
  89. public:
  90.     MyCanvas() {}
  91.     MyCanvas( wxScrolledWindow *parent, MyTopLabels *top, MyRightLabels *right,
  92.               wxWindowID id, const wxPoint &pos, const wxSize &size );
  93.     ~MyCanvas();
  94.     void OnPaint( wxPaintEvent &event );
  95.     void ScrollWindow( int dx, int dy, const wxRect *rect );
  96.  
  97. private:
  98.     wxScrolledWindow   *m_owner;
  99.     MyTopLabels        *m_topLabels;
  100.     MyRightLabels      *m_rightLabels;
  101.  
  102.     DECLARE_DYNAMIC_CLASS(MyCanvas)
  103.     DECLARE_EVENT_TABLE()
  104. };
  105.  
  106. // MyFrame
  107.  
  108. class MyFrame: public wxFrame
  109. {
  110. public:
  111.     MyFrame();
  112.  
  113.     void OnAbout( wxCommandEvent &event );
  114.     void OnQuit( wxCommandEvent &event );
  115.     void OnFullScreen( wxCommandEvent &event );
  116.  
  117.     wxScrolledWindow   *m_scrolled;
  118.     wxTextCtrl         *m_log;
  119.  
  120. private:
  121.     DECLARE_DYNAMIC_CLASS(MyFrame)
  122.     DECLARE_EVENT_TABLE()
  123. };
  124.  
  125. // MyApp
  126.  
  127. class MyApp: public wxApp
  128. {
  129. public:
  130.     virtual bool OnInit();
  131. };
  132.  
  133. // main program
  134.  
  135. IMPLEMENT_APP(MyApp)
  136.  
  137. // MyScrolledWindow
  138.  
  139. IMPLEMENT_DYNAMIC_CLASS(MyScrolledWindow, wxScrolledWindow)
  140.  
  141. BEGIN_EVENT_TABLE(MyScrolledWindow, wxScrolledWindow)
  142.   EVT_PAINT(        MyScrolledWindow::OnPaint)
  143. END_EVENT_TABLE()
  144.  
  145. MyScrolledWindow::MyScrolledWindow( wxWindow *parent, wxWindowID id,
  146.                     const wxPoint &pos, const wxSize &size )
  147.         : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER, _T("test canvas") )
  148. {
  149.     MyTopLabels *top = new MyTopLabels( this, -1, wxDefaultPosition, wxSize(-1,25) );
  150.     MyRightLabels *right = new MyRightLabels( this, -1, wxDefaultPosition, wxSize(60,-1) );
  151.  
  152.     m_canvas = new MyCanvas( this, top, right, -1, wxDefaultPosition, wxDefaultSize );
  153.  
  154.     SetTargetWindow( m_canvas );
  155.  
  156.     SetBackgroundColour( wxT("WHEAT") );
  157.  
  158.     SetCursor( wxCursor( wxCURSOR_HAND ) );
  159.  
  160.     wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL );
  161.  
  162.     wxBoxSizer *topsizer = new wxBoxSizer( wxHORIZONTAL );
  163.     topsizer->Add( 60,25 );
  164.     topsizer->Add( top, 1, wxEXPAND );
  165.  
  166.     mainsizer->Add( topsizer, 0, wxEXPAND );
  167.  
  168.     wxBoxSizer *middlesizer = new wxBoxSizer( wxHORIZONTAL );
  169.     middlesizer->Add( right, 0, wxEXPAND );
  170.     middlesizer->Add( m_canvas, 1, wxEXPAND );
  171.  
  172.     mainsizer->Add( middlesizer, 1, wxEXPAND );
  173.  
  174.     SetAutoLayout( TRUE );
  175.     SetSizer( mainsizer );
  176. }
  177.  
  178. MyScrolledWindow::~MyScrolledWindow()
  179. {
  180. }
  181.  
  182. void MyScrolledWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
  183. {
  184.     wxPaintDC dc( this );
  185.  
  186. /*
  187.     wxSize size( GetClientSize() );
  188.  
  189.     long w,h;
  190.     dc.GetTextExtent( wxT("Headline"), &w, &h );
  191.  
  192.     dc.DrawText( wxT("Headline"), long (size.x / 2 - w / 2), 10 );
  193. */
  194. }
  195.  
  196. // MyTopLabels
  197.  
  198. IMPLEMENT_DYNAMIC_CLASS(MyTopLabels,wxWindow)
  199.  
  200. BEGIN_EVENT_TABLE(MyTopLabels, wxWindow)
  201.   EVT_PAINT(      MyTopLabels::OnPaint)
  202. END_EVENT_TABLE()
  203.  
  204. MyTopLabels::MyTopLabels( wxScrolledWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size )
  205.   : wxWindow( parent, id, pos, size )
  206. {
  207.     m_owner = parent;
  208. }
  209.  
  210. void MyTopLabels::OnPaint( wxPaintEvent &event )
  211. {
  212.     wxPaintDC dc(this);
  213.  
  214.     // This is wrong..  it will translate both x and y if the
  215.     // window is scrolled, the label windows are active in one
  216.     // direction only.  Do the action below instead -- RL.
  217.     //m_owner->PrepareDC( dc );
  218.  
  219.     int xScrollUnits, xOrigin;
  220.  
  221.     m_owner->GetViewStart( &xOrigin, 0 );
  222.     m_owner->GetScrollPixelsPerUnit( &xScrollUnits, 0 );
  223.     dc.SetDeviceOrigin( -xOrigin * xScrollUnits, 0 );
  224.  
  225.     dc.DrawText( _T("Column 1"), 5, 5 );
  226.     dc.DrawText( _T("Column 2"), 105, 5 );
  227.     dc.DrawText( _T("Column 3"), 205, 5 );
  228. }
  229.  
  230. // MyRightLabels
  231.  
  232. IMPLEMENT_DYNAMIC_CLASS(MyRightLabels,wxWindow)
  233.  
  234. BEGIN_EVENT_TABLE(MyRightLabels, wxWindow)
  235.   EVT_PAINT(      MyRightLabels::OnPaint)
  236. END_EVENT_TABLE()
  237.  
  238. MyRightLabels::MyRightLabels( wxScrolledWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size )
  239.   : wxWindow( parent, id, pos, size )
  240. {
  241.     m_owner = parent;
  242. }
  243.  
  244. void MyRightLabels::OnPaint( wxPaintEvent &event )
  245. {
  246.     wxPaintDC dc(this);
  247.  
  248.     // This is wrong..  it will translate both x and y if the
  249.     // window is scrolled, the label windows are active in one
  250.     // direction only.  Do the action below instead -- RL.
  251.     //m_owner->PrepareDC( dc );
  252.  
  253.     int yScrollUnits, yOrigin;
  254.  
  255.     m_owner->GetViewStart( 0, &yOrigin );
  256.     m_owner->GetScrollPixelsPerUnit( 0, &yScrollUnits );
  257.     dc.SetDeviceOrigin( 0, -yOrigin * yScrollUnits );
  258.  
  259.     dc.DrawText( _T("Row 1"), 5, 5 );
  260.     dc.DrawText( _T("Row 2"), 5, 30 );
  261.     dc.DrawText( _T("Row 3"), 5, 55 );
  262.     dc.DrawText( _T("Row 4"), 5, 80 );
  263.     dc.DrawText( _T("Row 5"), 5, 105 );
  264.     dc.DrawText( _T("Row 6"), 5, 130 );
  265. }
  266.  
  267. // MyCanvas
  268.  
  269. IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxPanel)
  270.  
  271. BEGIN_EVENT_TABLE(MyCanvas, wxPanel)
  272.   EVT_PAINT(      MyCanvas::OnPaint)
  273. END_EVENT_TABLE()
  274.  
  275. MyCanvas::MyCanvas( wxScrolledWindow *parent, MyTopLabels *top, MyRightLabels *right,
  276.     wxWindowID id, const wxPoint &pos, const wxSize &size )
  277.         : wxPanel( parent, id, pos, size, wxSUNKEN_BORDER, _T("test canvas") )
  278. {
  279.     m_owner = parent;
  280.     m_topLabels = top;
  281.     m_rightLabels = right;
  282.  
  283.     (void)new wxButton( this, -1, _T("Hallo I"), wxPoint(0,50), wxSize(100,25) );
  284.     (void)new wxButton( this, -1, _T("Hallo II"), wxPoint(200,50), wxSize(100,25) );
  285.  
  286.     (void)new wxTextCtrl( this, -1, _T("Text I"), wxPoint(0,100), wxSize(100,25) );
  287.     (void)new wxTextCtrl( this, -1, _T("Text II"), wxPoint(200,100), wxSize(100,25) );
  288.  
  289.     (void)new wxComboBox( this, -1, _T("ComboBox I"), wxPoint(0,150), wxSize(100,25), 0, NULL );
  290.     (void)new wxComboBox( this, -1, _T("ComboBox II"), wxPoint(200,150), wxSize(100,25), 0, NULL );
  291.  
  292.     SetBackgroundColour( wxT("WHEAT") );
  293.  
  294.     SetCursor( wxCursor( wxCURSOR_IBEAM ) );
  295. }
  296.  
  297. MyCanvas::~MyCanvas()
  298. {
  299. }
  300.  
  301. void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
  302. {
  303.     wxPaintDC dc( this );
  304.     m_owner->PrepareDC( dc );
  305.  
  306.     dc.SetPen( *wxBLACK_PEN );
  307.  
  308.     // OK, let's assume we are a grid control and we have two
  309.     // grid cells. Here in OnPaint we want to know which cell
  310.     // to redraw so that we prevent redrawing cells that don't
  311.     // need to get redrawn. We have one cell at (0,0) and one
  312.     // more at (200,0), both having a size of (100,25).
  313.  
  314.     // We can query how much the window has been scrolled
  315.     // by calling CalcUnscrolledPosition()
  316.  
  317.     int scroll_x = 0;
  318.     int scroll_y = 0;
  319.     m_owner->CalcUnscrolledPosition( scroll_x, scroll_y, &scroll_x, &scroll_y );
  320.  
  321.     // We also need to know the size of the window to see which
  322.     // cells are completely hidden and not get redrawn
  323.  
  324.     int size_x = 0;
  325.     int size_y = 0;
  326.     GetClientSize( &size_x, &size_y );
  327.  
  328.     // First cell: (0,0)(100,25)
  329.     // It it on screen?
  330.     if ((0+100-scroll_x > 0) && (0+25-scroll_y > 0) &&
  331.         (0-scroll_x < size_x) && (0-scroll_y < size_y))
  332.     {
  333.         // Has the region on screen been exposed?
  334.         if (IsExposed(0,0,100,25))
  335.         {
  336.             wxLogMessage( wxT("Redraw first cell") );
  337.             dc.DrawRectangle( 0, 0, 100, 25 );
  338.             dc.DrawText( _T("First Cell"), 5, 5 );
  339.         }
  340.     }
  341.  
  342.  
  343.     // Second cell: (0,200)(100,25)
  344.     // It it on screen?
  345.     if ((200+100-scroll_x > 0) && (0+25-scroll_y > 0) &&
  346.         (200-scroll_x < size_x) && (0-scroll_y < size_y))
  347.     {
  348.         // Has the region on screen been exposed?
  349.         if (IsExposed(200,0,100,25))
  350.         {
  351.             wxLogMessage( wxT("Redraw second cell") );
  352.             dc.DrawRectangle( 200, 0, 100, 25 );
  353.             dc.DrawText( _T("Second Cell"), 205, 5 );
  354.         }
  355.     }
  356.  
  357. }
  358.  
  359. void MyCanvas::ScrollWindow( int dx, int dy, const wxRect *rect )
  360. {
  361.     wxPanel::ScrollWindow( dx, dy, rect );
  362.     m_topLabels->ScrollWindow( dx, 0, rect );
  363.     m_rightLabels->ScrollWindow( 0, dy, rect );
  364. }
  365.  
  366. // MyFrame
  367.  
  368. const int ID_QUIT  = 108;
  369. const int ID_FULL  = 109;
  370. const int ID_ABOUT = 110;
  371.  
  372. IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
  373.  
  374. BEGIN_EVENT_TABLE(MyFrame,wxFrame)
  375.   EVT_MENU    (ID_ABOUT, MyFrame::OnAbout)
  376.   EVT_MENU    (ID_QUIT,  MyFrame::OnQuit)
  377.   EVT_MENU    (ID_FULL,  MyFrame::OnFullScreen)
  378. END_EVENT_TABLE()
  379.  
  380. MyFrame::MyFrame()
  381.        : wxFrame( (wxFrame *)NULL, -1, _T("wxScrolledWindow sample"),
  382.                   wxPoint(20,20), wxSize(470,500) )
  383. {
  384.     wxMenu *file_menu = new wxMenu();
  385.     file_menu->Append( ID_ABOUT, _T("&About..."));
  386.     file_menu->Append( ID_FULL, _T("&Full screen on/off"));
  387.     file_menu->Append( ID_QUIT, _T("E&xit\tAlt-X"));
  388.  
  389.     wxMenuBar *menu_bar = new wxMenuBar();
  390.     menu_bar->Append(file_menu, _T("&File"));
  391.  
  392.     SetMenuBar( menu_bar );
  393.  
  394.     CreateStatusBar(2);
  395.     int widths[] = { -1, 100 };
  396.     SetStatusWidths( 2, widths );
  397.  
  398.     m_scrolled = new MyScrolledWindow( this, -1, wxDefaultPosition, wxSize(100,100) );
  399.     m_scrolled->SetScrollbars( 10, 10, 50, 100 );
  400.  
  401.     m_log = new wxTextCtrl( this, -1, _T("This is the log window.\n"), wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
  402.     wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
  403.     delete old_log;
  404.  
  405.     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
  406.     topsizer->Add( m_scrolled, 1, wxEXPAND );
  407.     topsizer->Add( m_log, 0, wxEXPAND );
  408.  
  409.     SetAutoLayout( TRUE );
  410.     SetSizer( topsizer );
  411. }
  412.  
  413. void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
  414. {
  415.   Close( TRUE );
  416. }
  417.  
  418. void MyFrame::OnFullScreen( wxCommandEvent &WXUNUSED(event) )
  419. {
  420.    ShowFullScreen( !IsFullScreen(), wxFULLSCREEN_NOBORDER|wxFULLSCREEN_NOCAPTION );
  421. }
  422.  
  423. void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
  424. {
  425.   (void)wxMessageBox( _T("wxScroll demo II\n")
  426.                       _T("Robert Roebling (c) 1998"),
  427.                       _T("About wxScroll II Demo"), wxICON_INFORMATION | wxOK );
  428. }
  429.  
  430. //-----------------------------------------------------------------------------
  431. // MyApp
  432. //-----------------------------------------------------------------------------
  433.  
  434. bool MyApp::OnInit()
  435. {
  436.     wxFrame *frame = new MyFrame();
  437.     frame->Show( TRUE );
  438.  
  439.     return TRUE;
  440. }
  441.  
  442.