]>
git.saurik.com Git - wxWidgets.git/blob - samples/scrollsub/scrollsub.cpp
4 * Author: Robert Roebling
6 * Copyright: (C) 1999, Robert Roebling
10 // For compilers that support precompilation, includes "wx/wx.h".
11 #include "wx/wxprec.h"
22 #include "wx/listctrl.h"
30 class MyScrolledWindow
;
36 class MyScrolledWindow
: public wxScrolledWindow
40 MyScrolledWindow( wxWindow
*parent
, wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
);
42 void OnPaint( wxPaintEvent
&event
);
47 DECLARE_DYNAMIC_CLASS(MyScrolledWindow
)
53 class MyTopLabels
: public wxWindow
57 MyTopLabels( wxScrolledWindow
*parent
, wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
);
59 void OnPaint( wxPaintEvent
&event
);
62 wxScrolledWindow
*m_owner
;
64 DECLARE_DYNAMIC_CLASS(MyTopLabels
)
70 class MyRightLabels
: public wxWindow
74 MyRightLabels( wxScrolledWindow
*parent
, wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
);
76 void OnPaint( wxPaintEvent
&event
);
79 wxScrolledWindow
*m_owner
;
81 DECLARE_DYNAMIC_CLASS(MyRightLabels
)
87 class MyCanvas
: public wxPanel
91 MyCanvas( wxScrolledWindow
*parent
, MyTopLabels
*top
, MyRightLabels
*right
,
92 wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
);
94 void OnPaint( wxPaintEvent
&event
);
95 void ScrollWindow( int dx
, int dy
, const wxRect
*rect
);
98 wxScrolledWindow
*m_owner
;
99 MyTopLabels
*m_topLabels
;
100 MyRightLabels
*m_rightLabels
;
102 DECLARE_DYNAMIC_CLASS(MyCanvas
)
103 DECLARE_EVENT_TABLE()
108 class MyFrame
: public wxFrame
113 void OnAbout( wxCommandEvent
&event
);
114 void OnQuit( wxCommandEvent
&event
);
116 wxScrolledWindow
*m_scrolled
;
120 DECLARE_DYNAMIC_CLASS(MyFrame
)
121 DECLARE_EVENT_TABLE()
126 class MyApp
: public wxApp
129 virtual bool OnInit();
138 IMPLEMENT_DYNAMIC_CLASS(MyScrolledWindow
, wxScrolledWindow
)
140 BEGIN_EVENT_TABLE(MyScrolledWindow
, wxScrolledWindow
)
141 EVT_PAINT( MyScrolledWindow::OnPaint
)
144 MyScrolledWindow::MyScrolledWindow( wxWindow
*parent
, wxWindowID id
,
145 const wxPoint
&pos
, const wxSize
&size
)
146 : wxScrolledWindow( parent
, id
, pos
, size
, wxSUNKEN_BORDER
, "test canvas" )
148 MyTopLabels
*top
= new MyTopLabels( this, -1, wxDefaultPosition
, wxSize(-1,25) );
149 MyRightLabels
*right
= new MyRightLabels( this, -1, wxDefaultPosition
, wxSize(60,-1) );
151 m_canvas
= new MyCanvas( this, top
, right
, -1, wxDefaultPosition
, wxDefaultSize
);
153 SetTargetWindow( m_canvas
);
155 SetBackgroundColour( "WHEAT" );
157 SetCursor( wxCursor( wxCURSOR_HAND
) );
159 wxBoxSizer
*mainsizer
= new wxBoxSizer( wxVERTICAL
);
161 wxBoxSizer
*topsizer
= new wxBoxSizer( wxHORIZONTAL
);
162 topsizer
->Add( 60,25 );
163 topsizer
->Add( top
, 1 );
165 mainsizer
->Add( topsizer
, 0, wxEXPAND
);
167 wxBoxSizer
*middlesizer
= new wxBoxSizer( wxHORIZONTAL
);
168 middlesizer
->Add( right
, 0, wxEXPAND
);
169 middlesizer
->Add( m_canvas
, 1, wxEXPAND
);
171 mainsizer
->Add( middlesizer
, 1, wxEXPAND
);
173 SetAutoLayout( TRUE
);
174 SetSizer( mainsizer
);
177 MyScrolledWindow::~MyScrolledWindow()
181 void MyScrolledWindow::OnPaint( wxPaintEvent
&WXUNUSED(event
) )
183 wxPaintDC
dc( this );
186 wxSize size( GetClientSize() );
189 dc.GetTextExtent( wxT("Headline"), &w, &h );
191 dc.DrawText( wxT("Headline"), long (size.x / 2 - w / 2), 10 );
197 IMPLEMENT_DYNAMIC_CLASS(MyTopLabels
,wxWindow
)
199 BEGIN_EVENT_TABLE(MyTopLabels
, wxWindow
)
200 EVT_PAINT( MyTopLabels::OnPaint
)
203 MyTopLabels::MyTopLabels( wxScrolledWindow
*parent
, wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
)
204 : wxWindow( parent
, id
, pos
, size
)
209 void MyTopLabels::OnPaint( wxPaintEvent
&event
)
212 m_owner
->PrepareDC( dc
);
213 dc
.DrawText( "Column 1", 5, 5 );
214 dc
.DrawText( "Column 2", 105, 5 );
215 dc
.DrawText( "Column 3", 205, 5 );
220 IMPLEMENT_DYNAMIC_CLASS(MyRightLabels
,wxWindow
)
222 BEGIN_EVENT_TABLE(MyRightLabels
, wxWindow
)
223 EVT_PAINT( MyRightLabels::OnPaint
)
226 MyRightLabels::MyRightLabels( wxScrolledWindow
*parent
, wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
)
227 : wxWindow( parent
, id
, pos
, size
)
232 void MyRightLabels::OnPaint( wxPaintEvent
&event
)
235 m_owner
->PrepareDC( dc
);
236 dc
.DrawText( "Row 1", 5, 5 );
237 dc
.DrawText( "Row 2", 5, 30 );
238 dc
.DrawText( "Row 3", 5, 55 );
239 dc
.DrawText( "Row 4", 5, 80 );
240 dc
.DrawText( "Row 5", 5, 105 );
241 dc
.DrawText( "Row 6", 5, 130 );
246 IMPLEMENT_DYNAMIC_CLASS(MyCanvas
, wxPanel
)
248 BEGIN_EVENT_TABLE(MyCanvas
, wxPanel
)
249 EVT_PAINT( MyCanvas::OnPaint
)
252 MyCanvas::MyCanvas( wxScrolledWindow
*parent
, MyTopLabels
*top
, MyRightLabels
*right
,
253 wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
)
254 : wxPanel( parent
, id
, pos
, size
, wxSUNKEN_BORDER
, "test canvas" )
258 m_rightLabels
= right
;
260 (void)new wxButton( this, -1, "Hallo I", wxPoint(0,50), wxSize(100,25) );
261 (void)new wxButton( this, -1, "Hallo II", wxPoint(200,50), wxSize(100,25) );
263 (void)new wxTextCtrl( this, -1, "Text I", wxPoint(0,100), wxSize(100,25) );
264 (void)new wxTextCtrl( this, -1, "Text II", wxPoint(200,100), wxSize(100,25) );
266 SetBackgroundColour( "WHEAT" );
268 SetCursor( wxCursor( wxCURSOR_IBEAM
) );
271 MyCanvas::~MyCanvas()
275 void MyCanvas::OnPaint( wxPaintEvent
&WXUNUSED(event
) )
277 wxPaintDC
dc( this );
278 m_owner
->PrepareDC( dc
);
280 dc
.SetPen( *wxBLACK_PEN
);
282 // OK, let's assume we are a grid control and we have two
283 // grid cells. Here in OnPaint we want to know which cell
284 // to redraw so that we prevent redrawing cells that don't
285 // need to get redrawn. We have one cell at (0,0) and one
286 // more at (200,0), both having a size of (100,25).
288 // We can query how much the window has been scrolled
289 // by calling CalcUnscrolledPosition()
293 m_owner
->CalcUnscrolledPosition( scroll_x
, scroll_y
, &scroll_x
, &scroll_y
);
295 // We also need to know the size of the window to see which
296 // cells are completely hidden and not get redrawn
300 GetClientSize( &size_x
, &size_y
);
302 // First cell: (0,0)(100,25)
304 if ((0+100-scroll_x
> 0) && (0+25-scroll_y
> 0) &&
305 (0-scroll_x
< size_x
) && (0-scroll_y
< size_y
))
307 // Has the region on screen been exposed?
308 if (IsExposed(0,0,100,25))
310 wxLogMessage( "Redraw first cell" );
311 dc
.DrawRectangle( 0, 0, 100, 25 );
312 dc
.DrawText( "First Cell", 5, 5 );
317 // Second cell: (0,200)(100,25)
319 if ((200+100-scroll_x
> 0) && (0+25-scroll_y
> 0) &&
320 (200-scroll_x
< size_x
) && (0-scroll_y
< size_y
))
322 // Has the region on screen been exposed?
323 if (IsExposed(200,0,100,25))
325 wxLogMessage( "Redraw second cell" );
326 dc
.DrawRectangle( 200, 0, 100, 25 );
327 dc
.DrawText( "Second Cell", 205, 5 );
333 void MyCanvas::ScrollWindow( int dx
, int dy
, const wxRect
*rect
)
335 wxPanel::ScrollWindow( dx
, dy
, rect
);
336 m_topLabels
->ScrollWindow( dx
, 0, rect
);
337 m_rightLabels
->ScrollWindow( 0, dy
, rect
);
342 const int ID_QUIT
= 108;
343 const int ID_ABOUT
= 109;
345 IMPLEMENT_DYNAMIC_CLASS( MyFrame
, wxFrame
)
347 BEGIN_EVENT_TABLE(MyFrame
,wxFrame
)
348 EVT_MENU (ID_ABOUT
, MyFrame::OnAbout
)
349 EVT_MENU (ID_QUIT
, MyFrame::OnQuit
)
353 : wxFrame( (wxFrame
*)NULL
, -1, "wxScrolledWindow sample",
354 wxPoint(20,20), wxSize(470,500) )
356 wxMenu
*file_menu
= new wxMenu();
357 file_menu
->Append( ID_ABOUT
, "&About..");
358 file_menu
->Append( ID_QUIT
, "E&xit\tAlt-X");
360 wxMenuBar
*menu_bar
= new wxMenuBar();
361 menu_bar
->Append(file_menu
, "&File");
363 SetMenuBar( menu_bar
);
366 int widths
[] = { -1, 100 };
367 SetStatusWidths( 2, widths
);
369 m_scrolled
= new MyScrolledWindow( this, -1, wxDefaultPosition
, wxSize(100,100) );
370 m_scrolled
->SetScrollbars( 10, 10, 50, 100 );
372 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE
);
373 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
376 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
377 topsizer
->Add( m_scrolled
, 1, wxEXPAND
);
378 topsizer
->Add( m_log
, 0, wxEXPAND
);
380 SetAutoLayout( TRUE
);
381 SetSizer( topsizer
);
384 void MyFrame::OnQuit( wxCommandEvent
&WXUNUSED(event
) )
389 void MyFrame::OnAbout( wxCommandEvent
&WXUNUSED(event
) )
391 (void)wxMessageBox( "wxScroll demo II\n"
392 "Robert Roebling (c) 1998",
393 "About wxScroll II Demo", wxICON_INFORMATION
| wxOK
);
396 //-----------------------------------------------------------------------------
398 //-----------------------------------------------------------------------------
402 wxFrame
*frame
= new MyFrame();