]>
git.saurik.com Git - wxWidgets.git/blob - contrib/samples/canvas/test/test.cpp
4 * Author: Robert Roebling
6 * Copyright: (C) 1998, Robert Roebling
11 #pragma implementation "test.cpp"
14 // For compilers that support precompilation
15 #include "wx/wxprec.h"
24 //-----------------------------------------------------
25 // class MywxCanvasObjectRef
26 //-----------------------------------------------------
28 BEGIN_EVENT_TABLE(MywxCanvasObjectRef
,wxCanvasObjectRef
)
29 EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent
)
32 IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef
, wxCanvasObjectRef
)
34 MywxCanvasObjectRef::MywxCanvasObjectRef(double x
, double y
,wxCanvasObjectGroup
* group
)
35 :wxCanvasObjectRef(x
,y
,group
)
39 MywxCanvasObjectRef::MywxCanvasObjectRef()
40 :wxCanvasObjectRef(0,0,NULL
)
44 MywxCanvasObjectRef::~MywxCanvasObjectRef()
48 void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent
&event
)
59 //new position of the mouse relative within the object
60 double x
= m_admin
->DeviceToLogicalX(event
.GetX());
61 double y
= m_admin
->DeviceToLogicalY(event
.GetY());
66 if (m_dragmode
!= wxDRAG_REDRAW
)
69 else if (event
.LeftUp())
72 if (m_dragmode
!= wxDRAG_REDRAW
)
75 else if (IsCapturedMouse())
77 if (m_dragmode
!= wxDRAG_REDRAW
)
78 DragRelative(x
-xprev
,y
-yprev
);
80 MoveRelative(x
-xprev
,y
-yprev
);
85 //well do something extra
86 if (IsCapturedMouse())
87 m_admin
->GetActive()->SetCursor(*wxHOURGLASS_CURSOR
);
89 m_admin
->GetActive()->SetCursor(*wxSTANDARD_CURSOR
);
92 //---------------------------------------------------
93 // class MyEventHandler
94 //---------------------------------------------------
96 BEGIN_EVENT_TABLE(MyEventHandler
,wxEvtHandler
)
97 EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent
)
100 MyEventHandler::MyEventHandler()
104 void MyEventHandler::OnMouseEvent(wxMouseEvent
&event
)
106 wxCanvasObject
* obj
=(wxCanvasObject
*)event
.GetEventObject();
108 if (!obj
->GetDraggable())
114 wxCanvasAdmin
* adm
=obj
->GetAdmin();
116 //new position of the mouse relative within the object
117 double x
= adm
->DeviceToLogicalX(event
.GetX());
118 double y
= adm
->DeviceToLogicalY(event
.GetY());
120 if (event
.LeftDown())
123 if (obj
->GetDragMode() != wxDRAG_REDRAW
)
126 else if (event
.LeftUp())
129 if (obj
->GetDragMode() != wxDRAG_REDRAW
)
132 else if (obj
->IsCapturedMouse())
134 if (obj
->GetDragMode() != wxDRAG_REDRAW
)
135 obj
->DragRelative(x
-xprev
,y
-yprev
);
137 obj
->MoveRelative(x
-xprev
,y
-yprev
);
142 //well do something extra
143 if (obj
->IsCapturedMouse())
144 obj
->GetAdmin()->GetActive()->SetCursor(*wxHOURGLASS_CURSOR
);
146 obj
->GetAdmin()->GetActive()->SetCursor(*wxSTANDARD_CURSOR
);
149 //------------------------------------------------
151 //------------------------------------------------
156 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
157 EVT_MENU(SPLIT_VERTICAL
, MyFrame::SplitVertical
)
158 EVT_MENU(SPLIT_HORIZONTAL
, MyFrame::SplitHorizontal
)
159 EVT_MENU(SPLIT_UNSPLIT
, MyFrame::Unsplit
)
160 EVT_MENU(SPLIT_QUIT
, MyFrame::Quit
)
161 EVT_MENU(SPLIT_SETMINSIZE
, MyFrame::SetMinSize
)
163 EVT_UPDATE_UI(SPLIT_VERTICAL
, MyFrame::UpdateUIVertical
)
164 EVT_UPDATE_UI(SPLIT_HORIZONTAL
, MyFrame::UpdateUIHorizontal
)
165 EVT_UPDATE_UI(SPLIT_UNSPLIT
, MyFrame::UpdateUIUnsplit
)
167 EVT_MENU (ID_ABOUT
, MyFrame::OnAbout
)
168 EVT_TIMER (-1, MyFrame::OnTimer
)
171 // My frame constructor
172 MyFrame::MyFrame(wxFrame
* frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
173 wxFrame(frame
, SPLITTER_FRAME
, title
, pos
, size
)
175 m_eventhandler
=new MyEventHandler();
181 wxString path
= pathList
.FindValidPath("pat36.bmp");
182 gs_bmp36_mono
.LoadFile(path
, wxBITMAP_TYPE_BMP
);
183 wxMask
* mask36
= new wxMask(gs_bmp36_mono
, *wxBLACK
);
184 /* associate a monochrome mask with this bitmap */
185 gs_bmp36_mono
.SetMask(mask36
);
190 fileMenu
= new wxMenu
;
191 fileMenu
->Append(SPLIT_VERTICAL
, "Split &Vertically\tCtrl-V", "Split vertically");
192 fileMenu
->Append(SPLIT_HORIZONTAL
, "Split &Horizontally\tCtrl-H", "Split horizontally");
193 fileMenu
->Append(SPLIT_UNSPLIT
, "&Unsplit", "Unsplit");
194 // fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit\tCtrl-U", "Unsplit");
195 fileMenu
->AppendSeparator();
196 fileMenu
->Append(SPLIT_SETMINSIZE
, "Set &min size", "Set minimum pane size");
197 fileMenu
->AppendSeparator();
198 fileMenu
->Append(SPLIT_QUIT
, "E&xit\tAlt-X", "Exit");
199 fileMenu
->Append( ID_ABOUT
, "&About...");
202 menuBar
= new wxMenuBar
;
203 menuBar
->Append(fileMenu
, "&File");
207 m_splitter
= new MySplitterWindow(this, SPLITTER_WINDOW
);
209 m_canvas1
= new MyCanvas(&m_canvasadmin
, m_splitter
, CANVAS1
, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL
|wxVSCROLL
);
210 m_canvas1
->SetYaxis(FALSE
);
211 m_canvas1
->SetMappingScroll(-300,-300,500,500,false);
212 m_canvas1
->SetScroll(-400,-400,600,600);
213 m_canvas1
->SetColour(wxColour(255, 255, 255) );
214 m_canvas1
->SetCursor(wxCursor(wxCURSOR_MAGNIFIER
));
216 m_canvas2
= new MyCanvas(&m_canvasadmin
, m_splitter
, CANVAS2
, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL
|wxVSCROLL
);
217 m_canvas2
->SetMappingScroll(-100,-100,500,500,false);
218 m_canvas2
->SetScroll(-400,-400,600,600);
219 m_canvas2
->SetColour( wxColour(187, 215, 243) );
220 m_canvas2
->Show(FALSE
);
222 m_canvasadmin
.Append(m_canvas1
);
223 m_canvasadmin
.Append(m_canvas2
);
224 m_canvasadmin
.SetActive(m_canvas1
);
226 m_splitter
->Initialize(m_canvas1
);
227 SetStatusText("Min pane size = 0", 1);
229 int widths
[] = { -1, 100 };
230 SetStatusWidths( 2, widths
);
232 //root group always at 0,0
233 m_datatree
= new wxCanvasObjectGroup(0,0);
234 m_datatree
->DeleteContents( TRUE
);
235 m_datatree
->SetAdmin(&m_canvasadmin
);
237 wxBitmap
bitmap( smile_xpm
);
238 wxImage
image( bitmap
);
240 // m_sm1 = new wxCanvasImage( image, 0,70,32,32 );
241 // m_datatree->Append( m_sm1 );
244 for (i
= 10; i
< 300; i
+=10)
246 wxCanvasRect
*r
= new wxCanvasRect( i
,50,3,140 );
247 r
->SetBrush( *wxRED_BRUSH
);
248 m_datatree
->Append( r
);
252 // m_sm2 = new wxCanvasImage( image, 0,140,24,24 );
253 // m_datatree->Append( m_sm2 );
255 for (i
= 15; i
< 300; i
+=10)
257 wxCanvasRect
* rec
= new wxCanvasRect( i
,50,3,140 );
258 rec
->SetBrush(wxBrush(wxColour(0,10+i
,2+i
),wxSOLID
));
259 rec
->SetDraggable(FALSE
);
260 m_datatree
->Append( rec
);
264 wxButton *button = new wxButton( m_canvas1, -1, "Hello", wxPoint(80,50) );
265 m_datatree->Append( new wxCanvasControl( button ) );
267 m_datatree->Append( new wxCanvasText( "Hello", 180, 50,
268 wxGetApp().GetFontPath() + "/times.ttf", 20 ) );
270 m_datatree->Append( new wxCanvasText( "How are you?", 180, 10,
271 wxGetApp().GetFontPath() + "/times.ttf", 8 ) );
273 m_datatree->Append( new wxCanvasText( "How are you?", 180, 20,
274 wxGetApp().GetFontPath() + "/times.ttf", 10 ) );
276 m_datatree->Append( new wxCanvasText( "How are you?", 180, 30,
277 wxGetApp().GetFontPath() + "/times.ttf", 12 ) );
278 m_sm3 = new wxCanvasImage( image, 0,210,32,32 );
279 m_datatree->Append( m_sm3 );
281 for (i
= 10; i
< 300; i
+=10)
282 m_datatree
->Append( new wxCanvasLine( 10,-15,i
,300 ) );
284 m_sm4 = new wxCanvasImage( image, 0,270,64,32 );
285 m_sm4->SetDragMode(wxDRAG_RECTANGLE);
286 m_datatree->Append( m_sm4 );
289 // m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) );
290 // m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) );
293 //make a group of wxCanvasObjects
294 wxCanvasObjectGroup
* group1
= new wxCanvasObjectGroup(0,0);
296 wxCanvasLine
* line
= new wxCanvasLine( 10,-35,50,190);
297 line
->SetPen(wxPen(wxColour(255,161,5),5,wxDOT_DASH
));
298 group1
->Prepend( line
);
299 group1
->Prepend( new wxCanvasImage( image
, 4,38,32,32 ) );
300 wxCanvasRect
* rec3
= new wxCanvasRect(20,-20,50,170);
301 rec3
->SetBrush(wxBrush(wxColour(0,120,240),wxSOLID
));
302 rec3
->SetPen(wxPen(wxColour(252,54,252 ),3,wxSOLID
));
303 group1
->Prepend( rec3
);
305 wxCanvasRect
* rec2
= new wxCanvasRect(10,20,104,52);
306 rec2
->SetBrush(wxBrush(wxColour(0,240,240),wxSOLID
));
307 rec2
->SetPen(wxPen(wxColour(210,40,50 ),1,wxSOLID
));
308 group1
->Prepend( rec2
);
312 wxPoint2DDouble
* todraw2
= new wxPoint2DDouble
[3];
319 wxCanvasPolyline
* poly2
= new wxCanvasPolyline(3,todraw2
);
320 poly2
->SetPen(wxPen(wxColour(200,0,64 ),4,wxDOT
));
321 m_datatree
->Prepend( poly2
);
325 //make another group of wxCanvasObjects
326 wxCanvasObjectGroup
* group2
= new wxCanvasObjectGroup(0,0);
327 group2
->Prepend( new wxCanvasImage( image
, 60,38,52,32 ) );
328 wxCanvasRect
* rr
= new wxCanvasRect(10,20,104,52,30);
329 rr
->SetBrush(wxBrush(wxColour(10,17,255),wxHORIZONTAL_HATCH
));
330 rr
->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID
));
331 group2
->Prepend( rr
);
334 //this a reference to group2 put into group1
335 MywxCanvasObjectRef
* m_subref
= new MywxCanvasObjectRef(60,50, group2
);
336 m_subref
->SetRotation(35);
337 m_subref
->SetRotation(0);
338 group1
->Prepend( m_subref
);
341 wxPoint2DDouble
* todraw
= new wxPoint2DDouble
[5];
353 wxCanvasPolygon
* poly
= new wxCanvasPolygon(5,todraw
);
354 poly
->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH
));
355 poly
->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID
));
356 group1
->Prepend( poly
);
358 wxPoint2DDouble
* todraw4
= new wxPoint2DDouble
[4];
369 wxCanvasPolygon
* poly5
= new wxCanvasPolygon(4,todraw4
);
370 poly5
->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH
));
371 // poly5->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID ));
372 // poly5->SetPen(wxPen(wxColour(9,115,64 ),1,wxSOLID));
373 poly5
->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID
));
374 wxCanvasObjectGroup
* group3
= new wxCanvasObjectGroup(0,0);
375 group3
->Prepend( poly5
);
377 wxList
* pointlist
= new wxList();
378 wxPoint2DDouble
* point
= new wxPoint2DDouble(0,0);
379 pointlist
->Append((wxObject
*)point
);
380 point
= new wxPoint2DDouble(-300,100);
381 pointlist
->Append((wxObject
*)point
);
382 point
= new wxPoint2DDouble(-100,100);
383 pointlist
->Append((wxObject
*)point
);
384 point
= new wxPoint2DDouble(-100,0);
385 pointlist
->Append((wxObject
*)point
);
386 point
= new wxPoint2DDouble(-200,50);
387 pointlist
->Append((wxObject
*)point
);
389 wxCanvasPolygonL
* poly15
= new wxCanvasPolygonL(pointlist
,TRUE
);
390 poly15
->SetColour1(wxColour(250,78,216 ));
391 poly15
->SetColour2(*wxRED
);
392 poly15
->SetBrush(wxBrush(gs_bmp36_mono
));
393 poly15
->SetTransParent(TRUE
);
394 poly15
->SetPen(wxPen(*wxRED
,4,wxSOLID
));
395 group1
->Prepend( poly15
);
397 wxList
* pointlist2
= new wxList();
398 wxPoint2DDouble
* point2
= new wxPoint2DDouble(-400,100);
399 pointlist2
->Append((wxObject
*)point2
);
400 point2
= new wxPoint2DDouble(-400,200);
401 pointlist2
->Append((wxObject
*)point2
);
402 point2
= new wxPoint2DDouble(0,200);
403 pointlist2
->Append((wxObject
*)point2
);
404 point2
= new wxPoint2DDouble(0,100);
405 pointlist2
->Append((wxObject
*)point2
);
406 point2
= new wxPoint2DDouble(-200,175);
407 pointlist2
->Append((wxObject
*)point2
);
409 wxCanvasPolylineL
* poly16
= new wxCanvasPolylineL(pointlist2
,TRUE
);
410 poly16
->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID
));
411 m_datatree
->Prepend( poly16
);
414 wxPoint2DDouble
* todraw6
= new wxPoint2DDouble
[5];
426 wxCanvasPolygon
* poly17
= new wxCanvasPolygon(5,todraw6
,TRUE
);
427 poly17
->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID
));
428 poly17
->SetPen(wxPen(wxColour(10,17,25),16,wxLONG_DASH
));
429 poly17
->SetColour1(*wxGREEN
);
430 poly17
->SetColour2(*wxRED
);
431 poly17
->SetGradient(TRUE
,wxPen(wxColour(0,0,0),0,wxSOLID
),0);
432 wxCanvasObjectRef
* m_refc
= new wxCanvasObjectRef(0,-200, poly17
);
433 m_refc
->SetRotation(90);
434 m_datatree
->Prepend( m_refc
);
435 wxCanvasObjectRef
* m_refd
= new wxCanvasObjectRef(200,-50, poly17
);
436 m_refd
->SetRotation(0);
437 m_datatree
->Append( m_refd
);
439 //now make two references to group1 into root group of the canvas
440 m_ref
= new MywxCanvasObjectRef(350,-200, group1
);
441 m_ref
->SetRotation(25);
442 //TODO if rotation is 0 scaling is weird
443 // m_ref->SetScale(2,3.2);
444 m_datatree
->Append( m_ref
);
446 group3
->Prepend( m_ref
);
449 //this a reference to group2 put into group1
450 MywxCanvasObjectRef
* subref2
= new MywxCanvasObjectRef(20,130, group2
);
451 subref2
->SetRotation(15);
452 group3
->Prepend( subref2
);
453 m_datatree
->Prepend( subref2
);
455 m_ref2
= new MywxCanvasObjectRef(80,450, group1
);
456 m_ref2
->SetRotation(-35);
457 m_ref2
->SetDragMode(wxDRAG_RECTANGLE
);
458 m_datatree
->Prepend( m_ref2
);
460 wxCanvasCircle
* cir
= new wxCanvasCircle( -100, -150, 100 );
461 cir
->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH
));
462 cir
->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID
));
463 cir
->SetDragMode(wxDRAG_REDRAW
);
464 m_datatree
->Prepend( cir
);
466 wxCanvasEllipse
* elp
= new wxCanvasEllipse( -100, 250, 100,300 );
467 elp
->SetBrush(wxBrush(wxColour(100,17,55),wxVERTICAL_HATCH
));
468 elp
->SetPen(wxPen(wxColour(2,255,6 ),10,wxDOT
));
469 m_datatree
->Prepend( elp
);
471 wxCanvasEllipticArc
* aelp
= new wxCanvasEllipticArc( -230, 250, 100,300, 30,270 );
472 aelp
->SetBrush(wxBrush(wxColour(100,17,155),wxSOLID
));
473 aelp
->SetPen(wxPen(wxColour(1,215,6 ),10,wxSOLID
));
474 m_datatree
->Prepend( aelp
);
476 //HOW BAD DO THINGS GET
478 for (kk
=0;kk
<100;kk
++)
480 // MywxCanvasObjectRef* m_refx = new MywxCanvasObjectRef(180,50+kk*30, group1);
481 // m_refx->SetRotation(-35);
482 // m_datatree->Prepend( m_refx );
486 m_log = new wxTextCtrl( this, -1, "", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
487 wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
490 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
492 topsizer->Add( m_canvas, 1, wxEXPAND );
493 topsizer->Add( m_log, 0, wxEXPAND );
495 SetAutoLayout( TRUE );
496 SetSizer( topsizer );
500 wxPoint2DDouble
* todraw8
= new wxPoint2DDouble
[4];
510 wxCanvasPolygon
* poly18
= new wxCanvasPolygon(4,todraw8
);
511 poly18
->SetPen(wxPen(wxColour(10,17,25),16,wxTRANSPARENT
));
512 poly18
->SetColour1(wxColour(0,0,0));
513 poly18
->SetColour2(wxColour(0,255,255));
514 poly18
->SetGradient(TRUE
,wxPen(wxColour(0,0,0),0,wxSOLID
),0);
516 wxCanvasObjectRef
* m_refb
= new wxCanvasObjectRef(200,0, poly18
);
517 m_refb
->SetRotation(90);
519 m_datatree
->Prepend( m_refb
);
522 wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 );
523 cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH ));
524 cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID));
525 m_datatree->Prepend( cir );
527 m_datatree
->SetAdmin(&m_canvasadmin
);
528 m_datatree
->AppendEventHandler( m_eventhandler
);
529 m_canvas1
->SetRoot(m_datatree
);
531 //wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0);
532 // group3->Prepend( cir );
534 group3
->SetAdmin(&m_canvasadmin
);
535 m_canvas2
->SetRoot(group3
);
537 m_timer
= new wxTimer( this );
538 //m_timer->Start( 100, FALSE );
543 m_datatree
->RemoveLastEventHandler( FALSE
);
544 delete m_eventhandler
;
548 void MyFrame::Quit(wxCommandEvent
& WXUNUSED(event
) )
553 void MyFrame::SplitHorizontal(wxCommandEvent
& WXUNUSED(event
) )
555 if ( m_splitter
->IsSplit() )
556 m_splitter
->Unsplit();
557 m_canvas1
->Show(TRUE
);
558 m_canvas2
->Show(TRUE
);
559 m_splitter
->SplitHorizontally( m_canvas1
, m_canvas2
);
563 void MyFrame::SplitVertical(wxCommandEvent
& WXUNUSED(event
) )
565 if ( m_splitter
->IsSplit() )
566 m_splitter
->Unsplit();
567 m_canvas1
->Show(TRUE
);
568 m_canvas2
->Show(TRUE
);
569 m_splitter
->SplitVertically( m_canvas1
, m_canvas2
);
573 void MyFrame::Unsplit(wxCommandEvent
& WXUNUSED(event
) )
575 if ( m_splitter
->IsSplit() )
576 m_splitter
->Unsplit();
577 SetStatusText("No splitter");
580 void MyFrame::SetMinSize(wxCommandEvent
& WXUNUSED(event
) )
583 str
.Printf( _T("%d"), m_splitter
->GetMinimumPaneSize());
584 str
= wxGetTextFromUser("Enter minimal size for panes:", "", str
, this);
588 int minsize
= wxStrtol( str
, (wxChar
**)NULL
, 10 );
589 m_splitter
->SetMinimumPaneSize(minsize
);
590 str
.Printf( _T("Min pane size = %d"), minsize
);
591 SetStatusText(str
, 1);
594 void MyFrame::UpdateUIHorizontal(wxUpdateUIEvent
& event
)
596 event
.Enable( ( (!m_splitter
->IsSplit()) || (m_splitter
->GetSplitMode() != wxSPLIT_HORIZONTAL
) ) );
599 void MyFrame::UpdateUIVertical(wxUpdateUIEvent
& event
)
601 event
.Enable( ( (!m_splitter
->IsSplit()) || (m_splitter
->GetSplitMode() != wxSPLIT_VERTICAL
) ) );
604 void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent
& event
)
606 event
.Enable( m_splitter
->IsSplit() );
609 void MyFrame::UpdatePosition()
612 str
.Printf( "Sash position = %d", m_splitter
->GetSashPosition());
616 void MyFrame::OnQuit( wxCommandEvent
&WXUNUSED(event
) )
621 void MyFrame::OnTimer( wxTimerEvent
&WXUNUSED(event
) )
623 m_sm1
->MoveRelative( 1, 0);
624 m_sm2
->MoveRelative( 1, 0);
625 m_sm3
->MoveRelative( 1, 0);
626 m_sm4
->MoveRelative( 2, 0);
628 // m_ref->MoveRelative( 1, 0 );
629 m_ref2
->MoveRelative( 2, 0 );
630 m_canvas1
->UpdateNow();
636 void MyFrame::OnAbout( wxCommandEvent
&WXUNUSED(event
) )
638 (void)wxMessageBox( "wxCanvas demo\n"
639 "Robert Roebling (c) 1998,2000 \n Modified by Klaas Holwerda 2000",
640 "About wxCanvas Demo", wxICON_INFORMATION
| wxOK
);
644 //------------------------------------------------
646 //------------------------------------------------
648 // the event tables connect the wxWindows events with the functions (event
649 // handlers) which process them.
650 BEGIN_EVENT_TABLE(MyCanvas
,wxVectorCanvas
)
651 EVT_MOUSE_EVENTS (MyCanvas::OnMouseEvent
)
654 MyCanvas::MyCanvas(wxCanvasAdmin
* admin
, MySplitterWindow
*parent
, wxWindowID id
,
655 const wxPoint
&position
, const wxSize
& size
, long style
) :
656 wxVectorCanvas( admin
, parent
, id
, position
, size
, style
)
661 void MyCanvas::OnMouseEvent(wxMouseEvent
& event
)
666 wxPoint pos
= event
.GetPosition();
668 m_mouse_worldx
= DeviceToLogicalX( pos
.x
);
669 m_mouse_worldy
= DeviceToLogicalY( pos
.y
);
672 str
.Printf( "Current mouse position: %f,%f", m_mouse_worldx
, m_mouse_worldy
);
673 m_parent
->SetStatusText( str
);
675 if (!event
.m_controlDown
&& !GetCaptured())
677 if (event
.LeftDown())
679 m_zoom_x1
=m_zoom_x2
=pos
.x
;
680 m_zoom_y1
=m_zoom_y2
=pos
.y
;
682 if (event
.RightDown())
684 SetMappingScroll(m_virtm_minX
,m_virtm_minY
,m_virtm_maxX
,m_virtm_maxY
,0);
685 Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE
);
692 double x_virt_min
=DeviceToLogicalX(m_zoom_x1
);
693 double y_virt_min
=DeviceToLogicalY(m_zoom_y2
);
694 double x_virt_max
=DeviceToLogicalX(m_zoom_x2
);
695 double y_virt_max
=DeviceToLogicalY(m_zoom_y1
);
696 SetMappingScroll(x_virt_min
,y_virt_min
,x_virt_max
,y_virt_max
,0);
697 Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE
);
700 if (event
.Dragging()&& event
.m_leftDown
)
702 dc
.SetLogicalFunction(wxINVERT
);
703 dc
.DrawRectangle(m_zoom_x1
,m_zoom_y1
,m_zoom_x2
-m_zoom_x1
,m_zoom_y2
-m_zoom_y1
);
706 dc
.DrawRectangle(m_zoom_x1
,m_zoom_y1
,m_zoom_x2
-m_zoom_x1
,m_zoom_y2
-m_zoom_y1
);
711 wxVectorCanvas::OnMouse(event
);
716 //-----------------------------------------------------------------------------
718 //-----------------------------------------------------------------------------
726 m_fontpath
= getenv("TRUETYPE");
727 m_fontpath
= "c:/WINNT/Fonts/times.ttf";
730 wxLogError("Please set env var TRUETYPE to the path where times.ttf lives.");
737 wxImage::AddHandler( new wxPNGHandler
);
740 wxFrame
*frame
= new MyFrame((wxFrame
*) NULL
, "wxCanvas Example", wxPoint(0,0), wxSize(400,500));