home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / contrib / samples / canvas / test / test.cpp < prev    next >
C/C++ Source or Header  |  2002-04-08  |  23KB  |  748 lines

  1. /*
  2.  * Program: canvas
  3.  *
  4.  * Author: Robert Roebling
  5.  *
  6.  * Copyright: (C) 1998, Robert Roebling
  7.  *
  8.  */
  9.  
  10. #ifdef __GNUG__
  11.     #pragma implementation "test.cpp"
  12. #endif
  13.  
  14. // For compilers that support precompilation
  15. #include "wx/wxprec.h"
  16.  
  17. #ifdef __BORLANDC__
  18.     #pragma hdrstop
  19. #endif
  20.  
  21. #include "test.h"
  22. #include "smile.xpm"
  23.  
  24. //-----------------------------------------------------
  25. // class MywxCanvasObjectRef
  26. //-----------------------------------------------------
  27.  
  28. BEGIN_EVENT_TABLE(MywxCanvasObjectRef,wxCanvasObjectRef)
  29.   EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent )
  30. END_EVENT_TABLE()
  31.  
  32. IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef)
  33.  
  34. MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group)
  35.     :wxCanvasObjectRef(x,y,group)
  36. {
  37. }
  38.  
  39. MywxCanvasObjectRef::MywxCanvasObjectRef()
  40.     :wxCanvasObjectRef(0,0,NULL)
  41. {
  42. }
  43.  
  44. MywxCanvasObjectRef::~MywxCanvasObjectRef()
  45. {
  46. }
  47.  
  48. void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent &event)
  49. {
  50.     if (!m_dragable)
  51.     {
  52.         event.Skip();
  53.         return;
  54.     }
  55.  
  56.     static double xprev;
  57.     static double yprev;
  58.  
  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());
  62.  
  63.     if (event.LeftDown())
  64.     {
  65.         CaptureMouse();
  66.         if (m_dragmode != wxDRAG_REDRAW)
  67.             DragStart();
  68.     }
  69.     else if (event.LeftUp())
  70.     {
  71.         ReleaseMouse();
  72.         if (m_dragmode != wxDRAG_REDRAW)
  73.             DragEnd();
  74.     }
  75.     else if (IsCapturedMouse())
  76.     {
  77.         if (m_dragmode != wxDRAG_REDRAW)
  78.             DragRelative(x-xprev,y-yprev);
  79.         else
  80.             MoveRelative(x-xprev,y-yprev);
  81.         m_admin->UpdateNow();
  82.     }
  83.     xprev=x;
  84.     yprev=y;
  85.     //well do something extra
  86.     if (IsCapturedMouse())
  87.         m_admin->GetActive()->SetCursor(*wxHOURGLASS_CURSOR);
  88.     else
  89.         m_admin->GetActive()->SetCursor(*wxSTANDARD_CURSOR);
  90. }
  91.  
  92. //---------------------------------------------------
  93. // class MyEventHandler
  94. //---------------------------------------------------
  95.  
  96. BEGIN_EVENT_TABLE(MyEventHandler,wxEvtHandler)
  97.   EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent )
  98. END_EVENT_TABLE()
  99.  
  100. MyEventHandler::MyEventHandler()
  101. {
  102. }
  103.  
  104. void MyEventHandler::OnMouseEvent(wxMouseEvent &event)
  105. {
  106.     wxCanvasObject* obj=(wxCanvasObject*)event.GetEventObject();
  107.  
  108.     if (!obj->GetDraggable())
  109.         return;
  110.  
  111.     static double xprev;
  112.     static double yprev;
  113.  
  114.     wxCanvasAdmin* adm=obj->GetAdmin();
  115.  
  116.     //new position of the mouse relative within the object
  117.     double x = adm->DeviceToLogicalX(event.GetX());
  118.     double y = adm->DeviceToLogicalY(event.GetY());
  119.  
  120.     if (event.LeftDown())
  121.     {
  122.         obj->CaptureMouse();
  123.         if (obj->GetDragMode() != wxDRAG_REDRAW)
  124.             obj->DragStart();
  125.     }
  126.     else if (event.LeftUp())
  127.     {
  128.         obj->ReleaseMouse();
  129.         if (obj->GetDragMode() != wxDRAG_REDRAW)
  130.             obj->DragEnd();
  131.     }
  132.     else if (obj->IsCapturedMouse())
  133.     {
  134.         if (obj->GetDragMode() != wxDRAG_REDRAW)
  135.             obj->DragRelative(x-xprev,y-yprev);
  136.         else
  137.             obj->MoveRelative(x-xprev,y-yprev);
  138.         adm->UpdateNow();
  139.     }
  140.     xprev=x;
  141.     yprev=y;
  142.     //well do something extra
  143.     if (obj->IsCapturedMouse())
  144.         obj->GetAdmin()->GetActive()->SetCursor(*wxHOURGLASS_CURSOR);
  145.     else
  146.         obj->GetAdmin()->GetActive()->SetCursor(*wxSTANDARD_CURSOR);
  147. }
  148.  
  149. //------------------------------------------------
  150. // class MyFrame
  151. //------------------------------------------------
  152.  
  153. class MyApp;
  154. class MyCanvas;
  155.  
  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)
  162.  
  163.   EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical)
  164.   EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal)
  165.   EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit)
  166.  
  167.   EVT_MENU    (ID_ABOUT, MyFrame::OnAbout)
  168.   EVT_TIMER   (-1,       MyFrame::OnTimer)
  169. END_EVENT_TABLE()
  170.  
  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)
  174. {
  175.     m_eventhandler =new MyEventHandler();
  176.  
  177.     wxPathList pathList;
  178.     pathList.Add(".");
  179.     pathList.Add("..");
  180.  
  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);
  186.  
  187.     CreateStatusBar(2);
  188.  
  189.     // Make a menubar
  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...");
  200.  
  201.  
  202.     menuBar = new wxMenuBar;
  203.     menuBar->Append(fileMenu, "&File");
  204.  
  205.     SetMenuBar(menuBar);
  206.  
  207.     m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW);
  208.  
  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));
  215.  
  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);
  221.  
  222.     m_canvasadmin.Append(m_canvas1);
  223.     m_canvasadmin.Append(m_canvas2);
  224.     m_canvasadmin.SetActive(m_canvas1);
  225.  
  226.     m_splitter->Initialize(m_canvas1);
  227.     SetStatusText("Min pane size = 0", 1);
  228.  
  229.     int widths[] = { -1, 100 };
  230.     SetStatusWidths( 2, widths );
  231.  
  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);
  236.  
  237.     wxBitmap bitmap( smile_xpm );
  238.     wxImage image( bitmap.ConvertToImage() );
  239.  
  240. //    m_sm1 = new wxCanvasImage( image, 0,70,32,32 );
  241. //    m_datatree->Append( m_sm1 );
  242.  
  243.     int i;
  244.     for (i = 10; i < 300; i+=10)
  245.     {
  246.         wxCanvasRect *r = new wxCanvasRect( i,50,3,140 );
  247.         r->SetBrush( *wxRED_BRUSH );
  248.         m_datatree->Append( r );
  249.     }
  250.  
  251.  
  252. //    m_sm2 = new wxCanvasImage( image, 0,140,24,24 );
  253. //    m_datatree->Append( m_sm2 );
  254.  
  255.     for (i = 15; i < 300; i+=10)
  256.     {
  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 );
  261.     }
  262.  
  263. /*
  264.     wxButton *button = new wxButton( m_canvas1, -1, "Hello", wxPoint(80,50) );
  265.     m_datatree->Append( new wxCanvasControl( button ) );
  266.  
  267.     m_datatree->Append( new wxCanvasText( "Hello", 180, 50,
  268.                       wxGetApp().GetFontPath() + "/times.ttf", 20 ) );
  269.  
  270.     m_datatree->Append( new wxCanvasText( "How are you?", 180, 10,
  271.                       wxGetApp().GetFontPath() + "/times.ttf", 8 ) );
  272.  
  273.     m_datatree->Append( new wxCanvasText( "How are you?", 180, 20,
  274.                       wxGetApp().GetFontPath() + "/times.ttf", 10 ) );
  275.  
  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 );
  280. */
  281.     for (i = 10; i < 300; i+=10)
  282.         m_datatree->Append( new wxCanvasLine( 10,-15,i,300 ) );
  283. /*
  284.     m_sm4 = new wxCanvasImage( image, 0,270,64,32 );
  285.     m_sm4->SetDragMode(wxDRAG_RECTANGLE);
  286.     m_datatree->Append( m_sm4 );
  287. */
  288.  
  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 ) );
  291.  
  292.  
  293.     //make a group of wxCanvasObjects
  294.     wxCanvasObjectGroup* group1 = new wxCanvasObjectGroup(0,0);
  295.  
  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 );
  304.  
  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 );
  309.  
  310.  
  311.  
  312.     wxPoint2DDouble* todraw2 = new wxPoint2DDouble[3];
  313.     todraw2[0].m_x=230;
  314.     todraw2[0].m_y=220;
  315.     todraw2[1].m_x=300;
  316.     todraw2[1].m_y=200;
  317.     todraw2[2].m_x=300;
  318.     todraw2[2].m_y=300;
  319.     wxCanvasPolyline* poly2= new wxCanvasPolyline(3,todraw2);
  320.     poly2->SetPen(wxPen(wxColour(200,0,64 ),4,wxDOT));
  321.     m_datatree->Prepend( poly2 );
  322.  
  323.  
  324.  
  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 );
  332.  
  333.  
  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 );
  339.  
  340.  
  341.     wxPoint2DDouble* todraw = new wxPoint2DDouble[5];
  342.     todraw[0].m_x=-30;
  343.     todraw[0].m_y=-20;
  344.     todraw[1].m_x=100;
  345.     todraw[1].m_y=0;
  346.     todraw[2].m_x=100;
  347.     todraw[2].m_y=100;
  348.     todraw[3].m_x=50;
  349.     todraw[3].m_y=150;
  350.     todraw[4].m_x=0;
  351.     todraw[4].m_y=100;
  352.  
  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 );
  357.  
  358.     wxPoint2DDouble* todraw4 = new wxPoint2DDouble[4];
  359.  
  360.     todraw4[0].m_x=-50;
  361.     todraw4[0].m_y=-30;
  362.     todraw4[1].m_x=-50;
  363.     todraw4[1].m_y=70;
  364.     todraw4[2].m_x=150;
  365.     todraw4[2].m_y=70;
  366.     todraw4[3].m_x=150;
  367.     todraw4[3].m_y=-30;
  368.  
  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 );
  376.  
  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);
  388.  
  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 );
  396.  
  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);
  408.  
  409.     wxCanvasPolylineL* poly16= new wxCanvasPolylineL(pointlist2,TRUE);
  410.     poly16->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID));
  411.     m_datatree->Prepend( poly16 );
  412.  
  413.  
  414.     wxPoint2DDouble* todraw6 = new wxPoint2DDouble[5];
  415.     todraw6[0].m_x=50;
  416.     todraw6[0].m_y=305;
  417.     todraw6[1].m_x=-200;
  418.     todraw6[1].m_y=200;
  419.     todraw6[2].m_x=0;
  420.     todraw6[2].m_y=500;
  421.     todraw6[3].m_x=300;
  422.     todraw6[3].m_y=200;
  423.     todraw6[4].m_x=-300;
  424.     todraw6[4].m_y=-300;
  425.  
  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 );
  438.  
  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 );
  445.  
  446.     group3->Prepend( m_ref );
  447.  
  448.  
  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 );
  454.  
  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 );
  459.  
  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 );
  465.  
  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 );
  470.  
  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 );
  475.  
  476.     //HOW BAD DO THINGS GET
  477.     int kk;
  478.     for (kk=0;kk<100;kk++)
  479.     {
  480. //        MywxCanvasObjectRef* m_refx = new MywxCanvasObjectRef(180,50+kk*30, group1);
  481. //        m_refx->SetRotation(-35);
  482. //        m_datatree->Prepend( m_refx );
  483.     }
  484.  
  485. /*
  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 ) );
  488.     delete old_log;
  489.  
  490.     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
  491.  
  492.     topsizer->Add( m_canvas, 1, wxEXPAND );
  493.     topsizer->Add( m_log, 0, wxEXPAND );
  494.  
  495.     SetAutoLayout( TRUE );
  496.     SetSizer( topsizer );
  497. */
  498.  
  499.     //fancy background
  500.     wxPoint2DDouble* todraw8 = new wxPoint2DDouble[4];
  501.     todraw8[0].m_x=-350;
  502.     todraw8[0].m_y=-350;
  503.     todraw8[1].m_x=-350;
  504.     todraw8[1].m_y=550;
  505.     todraw8[2].m_x=550;
  506.     todraw8[2].m_y=550;
  507.     todraw8[3].m_x=550;
  508.     todraw8[3].m_y=-350;
  509.  
  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);
  515.  
  516.     wxCanvasObjectRef* m_refb = new wxCanvasObjectRef(200,0, poly18);
  517.     m_refb->SetRotation(90);
  518.  
  519.     m_datatree->Prepend( m_refb );
  520.  
  521. /*
  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 );
  526. */
  527.     m_datatree->SetAdmin(&m_canvasadmin);
  528.     m_datatree->AppendEventHandler( m_eventhandler );
  529.     m_canvas1->SetRoot(m_datatree);
  530.  
  531.     //wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0);
  532.    // group3->Prepend( cir );
  533.  
  534.     group3->SetAdmin(&m_canvasadmin);
  535.     m_canvas2->SetRoot(group3);
  536.  
  537.     m_timer = new wxTimer( this );
  538.     //m_timer->Start( 100, FALSE );
  539. }
  540.  
  541. MyFrame::~MyFrame()
  542. {
  543.    m_datatree->RemoveLastEventHandler( FALSE );
  544.    delete m_eventhandler;
  545.    delete m_timer;
  546. }
  547.  
  548. void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) )
  549. {
  550.   Close(TRUE);
  551. }
  552.  
  553. void MyFrame::SplitHorizontal(wxCommandEvent& WXUNUSED(event) )
  554. {
  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 );
  560.   UpdatePosition();
  561. }
  562.  
  563. void MyFrame::SplitVertical(wxCommandEvent& WXUNUSED(event) )
  564. {
  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 );
  570.   UpdatePosition();
  571. }
  572.  
  573. void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event) )
  574. {
  575.   if ( m_splitter->IsSplit() )
  576.     m_splitter->Unsplit();
  577.   SetStatusText("No splitter");
  578. }
  579.  
  580. void MyFrame::SetMinSize(wxCommandEvent& WXUNUSED(event) )
  581. {
  582.   wxString str;
  583.   str.Printf( _T("%d"), m_splitter->GetMinimumPaneSize());
  584.   str = wxGetTextFromUser("Enter minimal size for panes:", "", str, this);
  585.   if ( str.IsEmpty() )
  586.     return;
  587.  
  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);
  592. }
  593.  
  594. void MyFrame::UpdateUIHorizontal(wxUpdateUIEvent& event)
  595. {
  596.   event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) );
  597. }
  598.  
  599. void MyFrame::UpdateUIVertical(wxUpdateUIEvent& event)
  600. {
  601.   event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) );
  602. }
  603.  
  604. void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent& event)
  605. {
  606.   event.Enable( m_splitter->IsSplit() );
  607. }
  608.  
  609. void MyFrame::UpdatePosition()
  610. {
  611.   wxString str;
  612.   str.Printf( "Sash position = %d", m_splitter->GetSashPosition());
  613.   SetStatusText(str);
  614. }
  615.  
  616. void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
  617. {
  618.     Close( TRUE );
  619. }
  620.  
  621. void MyFrame::OnTimer( wxTimerEvent &WXUNUSED(event) )
  622. {
  623.     m_sm1->MoveRelative( 1, 0);
  624.     m_sm2->MoveRelative( 1, 0);
  625.     m_sm3->MoveRelative( 1, 0);
  626.     m_sm4->MoveRelative( 2, 0);
  627.  
  628. //    m_ref->MoveRelative( 1, 0 );
  629.     m_ref2->MoveRelative( 2, 0 );
  630.     m_canvas1->UpdateNow();
  631.  
  632.  
  633.     wxWakeUpIdle();
  634. }
  635.  
  636. void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
  637. {
  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 );
  641. }
  642.  
  643.  
  644. //------------------------------------------------
  645. // class MyCanvas
  646. //------------------------------------------------
  647.  
  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)
  652. END_EVENT_TABLE()
  653.  
  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 )
  657. {
  658.     m_parent=parent;
  659. }
  660.  
  661. void MyCanvas::OnMouseEvent(wxMouseEvent& event)
  662. {
  663.     wxClientDC dc(this);
  664.     PrepareDC(dc);
  665.  
  666.     wxPoint pos = event.GetPosition();
  667.  
  668.     m_mouse_worldx = DeviceToLogicalX( pos.x );
  669.     m_mouse_worldy = DeviceToLogicalY( pos.y );
  670.  
  671.     wxString str;
  672.     str.Printf( "Current mouse position: %f,%f", m_mouse_worldx, m_mouse_worldy );
  673.     m_parent->SetStatusText( str );
  674.  
  675.     if (!event.m_controlDown && !GetCaptured())
  676.     {
  677.         if (event.LeftDown())
  678.         {
  679.             m_zoom_x1=m_zoom_x2=pos.x;
  680.             m_zoom_y1=m_zoom_y2=pos.y;
  681.         }
  682.         if (event.RightDown())
  683.         {
  684.             SetMappingScroll(m_virtm_minX,m_virtm_minY,m_virtm_maxX,m_virtm_maxY,0);
  685.             Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE );
  686.             UpdateNow();
  687.         }
  688.         if (event.LeftUp())
  689.         {
  690.             m_zoom_x2=pos.x;
  691.             m_zoom_y2=pos.y;
  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 );
  698.             UpdateNow();
  699.         }
  700.         if (event.Dragging()&& event.m_leftDown)
  701.         {
  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 );
  704.             m_zoom_x2=pos.x;
  705.             m_zoom_y2=pos.y;
  706.             dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 );
  707.         }
  708.     }
  709.     else
  710.     {
  711.         wxVectorCanvas::OnMouse(event);
  712.     }
  713. }
  714.  
  715.  
  716. //-----------------------------------------------------------------------------
  717. // MyApp
  718. //-----------------------------------------------------------------------------
  719.  
  720. // main program
  721.  
  722. IMPLEMENT_APP(MyApp)
  723.  
  724. bool MyApp::OnInit()
  725. {
  726.   m_fontpath = getenv("TRUETYPE");
  727.   m_fontpath = "c:/WINNT/Fonts/times.ttf";
  728.   if ( !m_fontpath )
  729.   {
  730.       wxLogError("Please set env var TRUETYPE to the path where times.ttf lives.");
  731.  
  732.       return FALSE;
  733.  
  734.   }
  735.  
  736. #if wxUSE_LIBPNG
  737.   wxImage::AddHandler( new wxPNGHandler );
  738. #endif
  739.  
  740.   wxFrame *frame = new MyFrame((wxFrame *) NULL, "wxCanvas Example", wxPoint(0,0), wxSize(400,500));
  741.   frame->Show( TRUE );
  742.  
  743.   SetTopWindow(frame);
  744.  
  745.   return TRUE;
  746. }
  747.  
  748.