]> git.saurik.com Git - wxWidgets.git/blame - samples/svg/svgtest.cpp
Show use use of both wxNativePixelData and wxAlphaPixelData
[wxWidgets.git] / samples / svg / svgtest.cpp
CommitLineData
cdf3a589
CE
1// biol75@york.ac.uk (Chris Elliott) March 2000
2
3#ifdef __BIDE__
4#define _NO_VCL
5#include "condefs.h"
6USERC("svg.rc");
7//---------------------------------------------------------------------------
8#define WinMain WinMain
9#endif
10/////////////////////////////////////////////////////////////////////////////
11// Name: svgtest.cpp
12// Purpose: SVG sample
13// Author: Chris Elliott
14// Modified by:
15// RCS-ID: $Id$
16// Licence: wxWindows license
17/////////////////////////////////////////////////////////////////////////////
18
19// ===========================================================================
20// declarations
21// ===========================================================================
22
23// ---------------------------------------------------------------------------
24// headers
25// ---------------------------------------------------------------------------
26
27// For compilers that support precompilation, includes "wx/wx.h".
28#include "wx/wxprec.h"
29
30#ifdef __BORLANDC__
31#pragma hdrstop
32#endif
33
34#ifndef WX_PRECOMP
35#include "wx/wx.h"
36#include "wx/mdi.h"
37#endif
38
ae0fbcee
WS
39#include "wx/toolbar.h"
40#include "wx/svg/dcsvg.h"
cdf3a589 41
a5e6cfa8 42#include "mondrian.xpm"
756d3e7f 43
cdf3a589
CE
44#include "bitmaps/new.xpm"
45#include "bitmaps/save.xpm"
46#include "bitmaps/help.xpm"
47#include "SVGlogo24.xpm"
a5e6cfa8 48
cdf3a589
CE
49class MyChild;
50
51// Define a new application
52class MyApp : public wxApp
53{
54 public:
55 bool OnInit();
56};
57
58// Define a new frame
59class MyFrame : public wxMDIParentFrame
60{
61 public:
62 int nWinCreated;
63
64 wxList m_children;
65
66 MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
67 const wxPoint& pos, const wxSize& size, const long style);
68
69 void InitToolBar(wxToolBar* toolBar);
70
71 void OnSize(wxSizeEvent& event);
72 void OnAbout(wxCommandEvent& event);
73 void OnNewWindow(wxCommandEvent& event);
74 void OnQuit(wxCommandEvent& event);
75 void OnClose(wxCloseEvent& event);
76 void FileSavePicture (wxCommandEvent & WXUNUSED(event) ) ;
77
78 DECLARE_EVENT_TABLE()
79};
80
81
82class MyCanvas : public wxScrolledWindow
83{
84 public:
85 int m_index ;
a5e6cfa8 86
cdf3a589
CE
87 MyChild * m_child ;
88 MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size);
89 virtual void OnDraw(wxDC& dc);
90
91 DECLARE_EVENT_TABLE()
92};
93
94class MyChild: public wxMDIChildFrame
95{
96 public:
97 MyCanvas *m_canvas;
98 MyFrame *m_frame ;
99
100 //////////////////// Methods
101
102 MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style);
103 ~MyChild();
104
105 void OnActivate(wxActivateEvent& event);
106 void OnQuit(wxCommandEvent& event);
107 void OnClose(wxCloseEvent& event);
108 bool OnSave(wxString filename) ;
109
110 DECLARE_EVENT_TABLE()
111};
112
113// menu items ids
114enum
115{
116 MDI_QUIT = 100,
117 MDI_NEW_WINDOW,
118 MDI_SAVE,
119 MDI_REFRESH,
120 MDI_CHILD_QUIT,
121 MDI_ABOUT
122};
123
124
125IMPLEMENT_APP(MyApp)
126
127// ---------------------------------------------------------------------------
128// global variables
129// ---------------------------------------------------------------------------
130
131MyFrame *frame = (MyFrame *) NULL;
132
133// ---------------------------------------------------------------------------
134// event tables
135// ---------------------------------------------------------------------------
136
137BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
138EVT_MENU(MDI_ABOUT, MyFrame::OnAbout)
139EVT_MENU(MDI_NEW_WINDOW, MyFrame::OnNewWindow)
140EVT_MENU(MDI_QUIT, MyFrame::OnQuit)
141EVT_MENU (MDI_SAVE, MyFrame::FileSavePicture)
142EVT_CLOSE(MyFrame::OnClose)
143
144EVT_SIZE(MyFrame::OnSize)
145END_EVENT_TABLE()
146
147// ===========================================================================
148// implementation
149// ===========================================================================
150
151// ---------------------------------------------------------------------------
152// MyApp
153// ---------------------------------------------------------------------------
154
155// Initialise this in OnInit, not statically
156bool MyApp::OnInit()
157{
158 // Create the main frame window
159
160 frame = new MyFrame((wxFrame *)NULL, -1, wxT("SVG Demo"),
161 wxPoint(-1, -1), wxSize(500, 400),
162 wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL);
a5e6cfa8 163
cdf3a589
CE
164
165 // Make a menubar
166 wxMenu *file_menu = new wxMenu;
167
168 file_menu->Append(MDI_NEW_WINDOW, wxT("&New test\tCtrl+N"));
169 file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
170
171 wxMenu *help_menu = new wxMenu;
172 help_menu->Append(MDI_ABOUT, wxT("&About"));
173
174 wxMenuBar *menu_bar = new wxMenuBar;
175
176 menu_bar->Append(file_menu, wxT("&File"));
177 menu_bar->Append(help_menu, wxT("&Help"));
178
179 // Associate the menu bar with the frame
180 frame->SetMenuBar(menu_bar);
181
d96cdd4a 182#if wxUSE_STATUSBAR
cdf3a589 183 frame->CreateStatusBar();
d96cdd4a 184#endif // wxUSE_STATUSBAR
cdf3a589 185
d96cdd4a 186 frame->Show(true);
cdf3a589
CE
187
188 SetTopWindow(frame);
189
c54e5eb0 190 return true;
cdf3a589
CE
191}
192
193
194// ---------------------------------------------------------------------------
195// MyFrame
196// ---------------------------------------------------------------------------
197
198// Define my frame constructor
199MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
200 const wxPoint& pos, const wxSize& size, const long style)
201 : wxMDIParentFrame(parent, id, title, pos, size, style)
202{
203 nWinCreated = 0 ;
204
205 // Give it an icon
206 SetIcon(wxICON(mondrian));
207
208 CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL);
209 InitToolBar(GetToolBar());
210
211}
212
213
214void MyFrame::OnClose(wxCloseEvent& event)
215{
216 if ( !event.CanVeto() )
217 {
218 event.Skip();
219 return ;
220 }
216db41f 221 if ( m_children.GetCount () < 1 )
cdf3a589
CE
222 {
223 event.Skip();
224 return ;
225 }
226 // now try the children
36ca94a2
WS
227 wxObjectList::compatibility_iterator pNode = m_children.GetFirst ();
228 wxObjectList::compatibility_iterator pNext ;
cdf3a589
CE
229 MyChild * pChild ;
230 while ( pNode )
231 {
232 pNext = pNode -> GetNext ();
216db41f 233 pChild = (MyChild*) pNode -> GetData ();
cdf3a589
CE
234 if (pChild -> Close ())
235 {
36ca94a2 236 m_children.Erase(pNode) ;
cdf3a589
CE
237 }
238 else
239 {
240 event.Veto();
241 return;
242 }
243 pNode = pNext ;
244 }
245 event.Skip();
246}
247
248
249void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
250{
251 Close();
252}
253
254
255void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
256{
be5a51fb 257 (void)wxMessageBox(wxT("wxWidgets 2.0 SVG 1.0 Test\n")
756d3e7f
CE
258 wxT("Author: Chris Elliott (c) 2002\n")
259 wxT("Usage: svg.exe \nClick File | New to show tests\n\n"), wxT("About SVG Test"));
cdf3a589
CE
260}
261
262
263void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event) )
264{
265 // Make another frame, containing a canvas
266 MyChild *subframe ;
267
268 m_children.Append (new MyChild(frame, wxT("SVG Frame"),
269 wxPoint(-1, -1), wxSize(-1, -1),
270 wxDEFAULT_FRAME_STYLE ) ) ;
271
216db41f 272 subframe = (MyChild *) m_children.GetLast() -> GetData ();
cdf3a589
CE
273 wxString title;
274 title.Printf(wxT("SVG Test Window %d"), nWinCreated );
275 // counts number of children previously, even if now closed
276 nWinCreated ++ ;
277
278 // Give it a title and icon
279 subframe->SetTitle(title);
280 subframe->SetIcon(wxICON(mondrian));
281
282 // Make a menubar
283 wxMenu *file_menu = new wxMenu;
284
285 file_menu->Append(MDI_NEW_WINDOW, wxT("&Another test\tCtrl+N"));
286 file_menu->Append(MDI_SAVE, wxT("&Save\tCtrl+S"), wxT("Save in SVG format"));
287 file_menu->Append(MDI_CHILD_QUIT, wxT("&Close child\tCtrl+F4"));
288 file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
289
290 wxMenu *help_menu = new wxMenu;
291 help_menu->Append(MDI_ABOUT, wxT("&About"));
292
293 wxMenuBar *menu_bar = new wxMenuBar;
294
295 menu_bar->Append(file_menu, wxT("&File"));
296 menu_bar->Append(help_menu, wxT("&Help"));
297
298 // Associate the menu bar with the frame
299 subframe->SetMenuBar(menu_bar);
300
c54e5eb0 301 subframe->Show(true);
cdf3a589
CE
302}
303
304
756d3e7f 305void MyFrame::OnSize(wxSizeEvent& event)
cdf3a589
CE
306{
307 int w, h;
308 GetClientSize(&w, &h);
309
310 GetClientWindow()->SetSize(0, 0, w, h);
756d3e7f 311 event.Skip();
cdf3a589
CE
312}
313
314
315void MyFrame::InitToolBar(wxToolBar* toolBar)
316{
317 const int maxBitmaps = 3 ;
318 wxBitmap* bitmaps[maxBitmaps];
319
320 bitmaps[0] = new wxBitmap( new_xpm );
321 bitmaps[1] = new wxBitmap( save_xpm );
322 bitmaps[2] = new wxBitmap( help_xpm );
323
324 int width = 16;
325 int currentX = 5;
326
c54e5eb0 327 toolBar->AddTool( MDI_NEW_WINDOW, *(bitmaps[0]), wxNullBitmap, false, currentX, wxDefaultCoord, (wxObject *) NULL, wxT("New SVG test window"));
cdf3a589 328 currentX += width + 5;
c54e5eb0 329 toolBar->AddTool( MDI_SAVE, *bitmaps[1], wxNullBitmap, false, currentX, wxDefaultCoord, (wxObject *) NULL, wxT("Save test in SVG format"));
cdf3a589 330 currentX += width + 5;
a5e6cfa8 331 toolBar->AddSeparator();
c54e5eb0 332 toolBar->AddTool(MDI_ABOUT, *bitmaps[2], wxNullBitmap, false, currentX, wxDefaultCoord, (wxObject *) NULL, wxT("Help"));
cdf3a589
CE
333
334 toolBar->Realize();
335
336 int i;
337 for (i = 0; i < maxBitmaps; i++)
338 delete bitmaps[i];
339}
340
341
342void MyFrame::FileSavePicture (wxCommandEvent & WXUNUSED(event) )
343{
c54e5eb0 344#if wxUSE_FILEDLG
cdf3a589 345 MyChild * pChild = (MyChild *)GetActiveChild ();
a5e6cfa8 346 if (pChild == NULL)
cdf3a589
CE
347 {
348 return ;
349 }
350
351 wxFileDialog dialog(this, wxT("Save Picture as"), wxEmptyString, pChild->GetTitle(),
352 wxT("SVG vector picture files (*.svg)|*.svg"),
ff3e84ff 353 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
cdf3a589
CE
354
355 if (dialog.ShowModal() == wxID_OK)
356 {
357 if (!pChild -> OnSave ( dialog.GetPath() ))
358 {
359 return ;
360 }
361 }
362 return ;
c54e5eb0 363#endif // wxUSE_FILEDLG
cdf3a589
CE
364}
365
366
367// Note that MDI_NEW_WINDOW and MDI_ABOUT commands get passed
368// to the parent window for processing, so no need to
369// duplicate event handlers here.
370BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame)
371 EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
372 EVT_CLOSE(MyChild::OnClose)
373END_EVENT_TABLE()
374
375BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
376
377END_EVENT_TABLE()
378
379// ---------------------------------------------------------------------------
380// MyCanvas
381// ---------------------------------------------------------------------------
382
383// Define a constructor for my canvas
384MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
385: wxScrolledWindow(parent, -1, pos, size,
386wxSUNKEN_BORDER|wxVSCROLL|wxHSCROLL)
387{
388 m_child = (MyChild *) parent ;
87728739 389 SetBackgroundColour(wxColour(_T("WHITE")));
cdf3a589
CE
390 m_index = m_child->m_frame->nWinCreated % 7 ;
391}
392
393
394// Define the repainting behaviour
395void MyCanvas::OnDraw(wxDC& dc)
396{
397 // vars to use ...
d96cdd4a 398#if wxUSE_STATUSBAR
cdf3a589 399 wxString s ;
d96cdd4a 400#endif // wxUSE_STATUSBAR
cdf3a589
CE
401 wxPen wP ;
402 wxBrush wB ;
403 wxPoint points[6];
404 wxColour wC;
405 wxFont wF ;
406
407 dc.SetFont(*wxSWISS_FONT);
408 dc.SetPen(*wxGREEN_PEN);
409
a5e6cfa8 410
cdf3a589
CE
411 switch (m_index)
412 {
413 default:
414 case 0:
415 // draw lines to make a cross
416 dc.DrawLine(0, 0, 200, 200);
417 dc.DrawLine(200, 0, 0, 200);
418 // draw point colored line and spline
419 wP = *wxCYAN_PEN ;
420 wP.SetWidth(3);
421 dc.SetPen(wP);
422
423 dc.DrawPoint (25,15) ;
424 dc.DrawLine(50, 30, 200, 30);
425 dc.DrawSpline(50, 200, 50, 100, 200, 10);
d96cdd4a 426#if wxUSE_STATUSBAR
cdf3a589 427 s = wxT("Green Cross, Cyan Line and spline");
d96cdd4a 428#endif // wxUSE_STATUSBAR
cdf3a589
CE
429 break ;
430
431 case 1:
432 // draw standard shapes
433 dc.SetBrush(*wxCYAN_BRUSH);
434 dc.SetPen(*wxRED_PEN);
435 dc.DrawRectangle(10, 10, 100, 70);
87728739 436 wB = wxBrush (_T("DARK ORCHID"), wxTRANSPARENT);
cdf3a589
CE
437 dc.SetBrush (wB);
438 dc.DrawRoundedRectangle(50, 50, 100, 70, 20);
87728739 439 dc.SetBrush (wxBrush(_T("GOLDENROD"), wxSOLID) );
cdf3a589
CE
440 dc.DrawEllipse(100, 100, 100, 50);
441
442 points[0].x = 100; points[0].y = 200;
443 points[1].x = 70; points[1].y = 260;
444 points[2].x = 160; points[2].y = 230;
445 points[3].x = 40; points[3].y = 230;
446 points[4].x = 130; points[4].y = 260;
447 points[5].x = 100; points[5].y = 200;
448
449 dc.DrawPolygon(5, points);
450 dc.DrawLines (6, points, 160);
d96cdd4a 451#if wxUSE_STATUSBAR
cdf3a589 452 s = wxT("Blue rectangle, red edge, clear rounded rectangle, gold ellipse, gold and clear stars");
d96cdd4a 453#endif // wxUSE_STATUSBAR
cdf3a589
CE
454 break ;
455
456 case 2:
457 // draw text in Arial or similar font
458 dc.DrawLine(50,25,50,35);
459 dc.DrawLine(45,30,55,30);
460 dc.DrawText(wxT("This is a Swiss-style string"), 50, 30);
461 wC = dc.GetTextForeground() ;
87728739 462 dc.SetTextForeground (_T("FIREBRICK"));
a5e6cfa8 463
cdf3a589 464 // no effect in msw ??
87728739 465 dc.SetTextBackground (_T("WHEAT"));
cdf3a589
CE
466 dc.DrawText(wxT("This is a Red string"), 50, 200);
467 dc.DrawRotatedText(wxT("This is a 45 deg string"), 50, 200, 45);
468 dc.DrawRotatedText(wxT("This is a 90 deg string"), 50, 200, 90);
c54e5eb0 469 wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, false, wxT("Times New Roman"));
cdf3a589
CE
470 dc.SetFont(wF);
471 dc.SetTextForeground (wC) ;
472 dc.DrawText(wxT("This is a Times-style string"), 50, 60);
d96cdd4a 473#if wxUSE_STATUSBAR
cdf3a589 474 s = wxT("Swiss, Times text; red text, rotated and colored orange");
d96cdd4a 475#endif // wxUSE_STATUSBAR
cdf3a589
CE
476 break ;
477
478 case 3 :
479 // four arcs start and end points, center
480 dc.SetBrush(*wxGREEN_BRUSH);
216db41f 481 dc.DrawArc ( 200,300, 370,230, 300,300 );
cdf3a589 482 dc.SetBrush(*wxBLUE_BRUSH);
216db41f 483 dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270,270 );
cdf3a589 484 dc.SetDeviceOrigin(-10,-10);
216db41f 485 dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270,270 );
cdf3a589
CE
486 dc.SetDeviceOrigin(0,0);
487
87728739 488 wP.SetColour (_T("CADET BLUE"));
cdf3a589 489 dc.SetPen(wP);
216db41f 490 dc.DrawArc ( 75,125, 110, 40, 75, 75 );
cdf3a589 491
87728739 492 wP.SetColour (_T("SALMON"));
cdf3a589
CE
493 dc.SetPen(wP);
494 dc.SetBrush(*wxRED_BRUSH);
495 //top left corner, width and height, start and end angle
496 // 315 same center and x-radius as last pie-arc, half Y radius
497 dc.DrawEllipticArc(25,50,100,50,180.0,45.0) ;
498
499 wP = *wxCYAN_PEN ;
500 wP.SetWidth(3);
501 dc.SetPen(wP);
502 //wxTRANSPARENT));
87728739 503 dc.SetBrush (wxBrush (_T("SALMON"),wxSOLID)) ;
cdf3a589
CE
504 dc.DrawEllipticArc(300, 0,200,100, 0.0,145.0) ;
505 //same end point
506 dc.DrawEllipticArc(300, 50,200,100,90.0,145.0) ;
507 dc.DrawEllipticArc(300,100,200,100,90.0,345.0) ;
508
d96cdd4a 509#if wxUSE_STATUSBAR
cdf3a589 510 s = wxT("This is an arc test page");
d96cdd4a 511#endif // wxUSE_STATUSBAR
cdf3a589
CE
512 break ;
513
514 case 4:
515 dc.DrawCheckMark ( 30,30,25,25);
87728739 516 dc.SetBrush (wxBrush (_T("SALMON"),wxTRANSPARENT));
cdf3a589
CE
517 dc.DrawCheckMark ( 80,50,75,75);
518 dc.DrawRectangle ( 80,50,75,75);
d96cdd4a 519#if wxUSE_STATUSBAR
cdf3a589 520 s = wxT("Two check marks");
d96cdd4a 521#endif // wxUSE_STATUSBAR
cdf3a589
CE
522 break ;
523
524 case 5:
c54e5eb0 525 wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, false, wxT("Times New Roman"));
cdf3a589
CE
526 dc.SetFont(wF);
527 dc.DrawLine(0, 0, 200, 200);
528 dc.DrawLine(200, 0, 0, 200);
529 dc.DrawText(wxT("This is an 18pt string"), 50, 60);
530
531 // rescale and draw in blue
532 wP = *wxCYAN_PEN ;
533 dc.SetPen(wP);
534 dc.SetUserScale (2.0,0.5);
535 dc.SetDeviceOrigin(200,0);
536 dc.DrawLine(0, 0, 200, 200);
537 dc.DrawLine(200, 0, 0, 200);
538 dc.DrawText(wxT("This is an 18pt string 2 x 0.5 UserScaled"), 50, 60);
539 dc.SetUserScale (2.0,2.0);
540 dc.SetDeviceOrigin(200,200);
541 dc.DrawText(wxT("This is an 18pt string 2 x 2 UserScaled"), 50, 60);
542
543 wP = *wxRED_PEN ;
544 dc.SetPen(wP);
545 dc.SetUserScale (1.0,1.0);
546 dc.SetDeviceOrigin(0,10);
547 dc.SetMapMode (wxMM_METRIC) ; //svg ignores this
548 dc.DrawLine(0, 0, 200, 200);
549 dc.DrawLine(200, 0, 0, 200);
a5e6cfa8 550 dc.DrawText(wxT("This is an 18pt string in MapMode"), 50, 60);
d96cdd4a 551#if wxUSE_STATUSBAR
cdf3a589 552 s = wxT("Scaling test page");
d96cdd4a 553#endif // wxUSE_STATUSBAR
cdf3a589
CE
554 break ;
555
556 case 6:
756d3e7f
CE
557 dc.DrawIcon( wxIcon(mondrian_xpm), 10, 10 );
558 dc.DrawBitmap ( wxBitmap(svgbitmap_xpm), 50,15);
d96cdd4a 559#if wxUSE_STATUSBAR
cdf3a589 560 s = wxT("Icon and Bitmap ");
d96cdd4a 561#endif // wxUSE_STATUSBAR
cdf3a589
CE
562 break ;
563
564 }
d96cdd4a 565#if wxUSE_STATUSBAR
cdf3a589 566 m_child->SetStatusText(s);
d96cdd4a 567#endif // wxUSE_STATUSBAR
cdf3a589
CE
568}
569
570
571
572
573// ---------------------------------------------------------------------------
574// MyChild
575// ---------------------------------------------------------------------------
576
577MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title,
578const wxPoint& pos, const wxSize& size,
579const long style)
580: wxMDIChildFrame(parent, -1, title, pos, size, style)
581{
582
583 m_frame = (MyFrame *) parent ;
d96cdd4a 584#if wxUSE_STATUSBAR
cdf3a589 585 CreateStatusBar();
a5e6cfa8 586 SetStatusText(title);
d96cdd4a 587#endif // wxUSE_STATUSBAR
cdf3a589
CE
588
589 int w, h ;
590 GetClientSize ( &w, &h );
591 m_canvas = new MyCanvas(this, wxPoint(0, 0), wxSize (w,h) );
592 // Give it scrollbars
593 m_canvas->SetScrollbars(20, 20, 50, 50);
594
595}
596
597
598MyChild::~MyChild()
599{
600 m_frame->m_children.DeleteObject(this);
601}
602
603
604void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
605{
c54e5eb0 606 Close(true);
cdf3a589
CE
607}
608
609
610bool MyChild::OnSave(wxString filename)
611{
612 wxSVGFileDC svgDC (filename, 600, 650) ;
613 m_canvas->OnDraw (svgDC);
614 return svgDC.Ok();
615}
616
617
618
619void MyChild::OnActivate(wxActivateEvent& event)
620{
621 if ( event.GetActive() && m_canvas )
622 m_canvas->SetFocus();
623}
624
625
626void MyChild::OnClose(wxCloseEvent& event)
627{
628 event.Skip();
629}