]>
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 MyCanvas
: public wxPanel
57 MyCanvas( wxScrolledWindow
*parent
, wxWindowID id
, const wxPoint
&pos
, const wxSize
&size
);
59 void OnPaint( wxPaintEvent
&event
);
62 wxScrolledWindow
*m_owner
;
64 DECLARE_DYNAMIC_CLASS(MyCanvas
)
70 class MyFrame
: public wxFrame
75 void OnAbout( wxCommandEvent
&event
);
76 void OnQuit( wxCommandEvent
&event
);
78 wxScrolledWindow
*m_scrolled
;
82 DECLARE_DYNAMIC_CLASS(MyFrame
)
88 class MyApp
: public wxApp
91 virtual bool OnInit();
100 IMPLEMENT_DYNAMIC_CLASS(MyScrolledWindow
, wxScrolledWindow
)
102 BEGIN_EVENT_TABLE(MyScrolledWindow
, wxScrolledWindow
)
103 EVT_PAINT( MyScrolledWindow::OnPaint
)
106 MyScrolledWindow::MyScrolledWindow( wxWindow
*parent
, wxWindowID id
,
107 const wxPoint
&pos
, const wxSize
&size
)
108 : wxScrolledWindow( parent
, id
, pos
, size
, wxSUNKEN_BORDER
, "test canvas" )
110 m_canvas
= new MyCanvas( this, -1, wxDefaultPosition
, wxDefaultSize
);
112 SetTargetWindow( m_canvas
);
114 SetBackgroundColour( "WHEAT" );
116 SetCursor( wxCursor( wxCURSOR_HAND
) );
119 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
121 topsizer
->Add( m_canvas
, 1, wxEXPAND
|wxALL
, 30 );
123 SetAutoLayout( TRUE
);
124 SetSizer( topsizer
);
127 MyScrolledWindow::~MyScrolledWindow()
131 void MyScrolledWindow::OnPaint( wxPaintEvent
&WXUNUSED(event
) )
133 wxPaintDC
dc( this );
135 wxSize
size( GetClientSize() );
138 dc
.GetTextExtent( wxT("Headline"), &w
, &h
);
140 dc
.DrawText( wxT("Headline"), long (size
.x
/ 2 - w
/ 2), 10 );
145 IMPLEMENT_DYNAMIC_CLASS(MyCanvas
, wxPanel
)
147 BEGIN_EVENT_TABLE(MyCanvas
, wxPanel
)
148 EVT_PAINT( MyCanvas::OnPaint
)
151 MyCanvas::MyCanvas( wxScrolledWindow
*parent
, wxWindowID id
,
152 const wxPoint
&pos
, const wxSize
&size
)
153 : wxPanel( parent
, id
, pos
, size
, wxSUNKEN_BORDER
, "test canvas" )
157 (void)new wxButton( this, -1, "Hallo I", wxPoint(0,50), wxSize(100,25) );
158 (void)new wxButton( this, -1, "Hallo II", wxPoint(200,50), wxSize(100,25) );
160 SetBackgroundColour( *wxWHITE
);
162 SetCursor( wxCursor( wxCURSOR_IBEAM
) );
165 MyCanvas::~MyCanvas()
169 void MyCanvas::OnPaint( wxPaintEvent
&WXUNUSED(event
) )
171 wxPaintDC
dc( this );
172 m_owner
->PrepareDC( dc
);
174 dc
.SetPen( *wxBLACK_PEN
);
176 // OK, let's assume we are a grid control and we have two
177 // grid cells. Here in OnPaint we want to know which cell
178 // to redraw so that we prevent redrawing cells that don't
179 // need to get redrawn. We have one cell at (0,0) and one
180 // more at (200,0), both having a size of (100,25).
182 // We can query how much the window has been scrolled
183 // by calling CalcUnscrolledPosition()
187 m_owner
->CalcUnscrolledPosition( scroll_x
, scroll_y
, &scroll_x
, &scroll_y
);
189 // We also need to know the size of the window to see which
190 // cells are completely hidden and not get redrawn
194 GetClientSize( &size_x
, &size_y
);
196 // First cell: (0,0)(100,25)
198 if ((0+100-scroll_x
> 0) && (0+25-scroll_y
> 0) &&
199 (0-scroll_x
< size_x
) && (0-scroll_y
< size_y
))
201 // Has the region an screen been exposed?
202 if (IsExposed(0,0,100,25))
204 wxLogMessage( "Redraw first cell" );
205 dc
.DrawRectangle( 0, 0, 100, 25 );
206 dc
.DrawText( "First Cell", 5, 5 );
211 // Second cell: (0,200)(100,25)
213 if ((200+100-scroll_x
> 0) && (0+25-scroll_y
> 0) &&
214 (200-scroll_x
< size_x
) && (0-scroll_y
< size_y
))
216 // Has the region an screen been exposed?
217 if (IsExposed(200,0,100,25))
219 wxLogMessage( "Redraw second cell" );
220 dc
.DrawRectangle( 200, 0, 100, 25 );
221 dc
.DrawText( "Second Cell", 205, 5 );
230 const int ID_QUIT
= 108;
231 const int ID_ABOUT
= 109;
233 IMPLEMENT_DYNAMIC_CLASS( MyFrame
, wxFrame
)
235 BEGIN_EVENT_TABLE(MyFrame
,wxFrame
)
236 EVT_MENU (ID_ABOUT
, MyFrame::OnAbout
)
237 EVT_MENU (ID_QUIT
, MyFrame::OnQuit
)
241 : wxFrame( (wxFrame
*)NULL
, -1, "wxScrolledWindow sample",
242 wxPoint(20,20), wxSize(470,500) )
244 wxMenu
*file_menu
= new wxMenu();
245 file_menu
->Append( ID_ABOUT
, "&About..");
246 file_menu
->Append( ID_QUIT
, "E&xit\tAlt-X");
248 wxMenuBar
*menu_bar
= new wxMenuBar();
249 menu_bar
->Append(file_menu
, "&File");
251 SetMenuBar( menu_bar
);
254 int widths
[] = { -1, 100 };
255 SetStatusWidths( 2, widths
);
257 m_scrolled
= new MyScrolledWindow( this, -1, wxPoint(0,0), wxSize(100,100) );
258 m_scrolled
->SetScrollbars( 10, 10, 50, 100 );
260 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE
);
261 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
264 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
266 topsizer
->Add( m_scrolled
, 1, wxEXPAND
);
267 topsizer
->Add( m_log
, 0, wxEXPAND
);
269 SetAutoLayout( TRUE
);
270 SetSizer( topsizer
);
273 void MyFrame::OnQuit( wxCommandEvent
&WXUNUSED(event
) )
278 void MyFrame::OnAbout( wxCommandEvent
&WXUNUSED(event
) )
280 (void)wxMessageBox( "wxScroll demo II\n"
281 "Robert Roebling (c) 1998",
282 "About wxScroll II Demo", wxICON_INFORMATION
| wxOK
);
285 //-----------------------------------------------------------------------------
287 //-----------------------------------------------------------------------------
291 wxFrame
*frame
= new MyFrame();