📄 plot.cpp
字号:
/* if (m_owner->m_current) { dc.SetPen( *wxLIGHT_GREY_PEN ); int base_line = client_height - m_owner->m_current->GetOffsetY(); dc.DrawLine( update_x-1, base_line-1, update_x+update_width+2, base_line-1 ); }*/ wxList::compatibility_iterator node = m_owner->m_curves.GetFirst(); while (node) { wxPlotCurve *curve = (wxPlotCurve*) node->GetData(); if (curve == m_owner->GetCurrentCurve()) dc.SetPen( curve->GetPenSelected() ); else dc.SetPen( curve->GetPenNormal() ); DrawCurve( &dc, curve, update_x-1, update_x+update_width+2 ); node = node->GetNext(); } dc.SetPen( *wxRED_PEN ); node = m_owner->m_onOffCurves.GetFirst(); while (node) { wxPlotOnOffCurve *curve = (wxPlotOnOffCurve*) node->GetData(); DrawOnOffCurve( &dc, curve, update_x-1, update_x+update_width+2 ); node = node->GetNext(); } upd ++; }}void wxPlotArea::ScrollWindow( int dx, int dy, const wxRect *rect ){ wxWindow::ScrollWindow( dx, dy, rect );// m_owner->m_xaxis->ScrollWindow( dx, 0 );}//-----------------------------------------------------------------------------// wxPlotXAxisArea//-----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS(wxPlotXAxisArea, wxWindow)BEGIN_EVENT_TABLE(wxPlotXAxisArea, wxWindow) EVT_PAINT( wxPlotXAxisArea::OnPaint) EVT_LEFT_DOWN( wxPlotXAxisArea::OnMouse)END_EVENT_TABLE()wxPlotXAxisArea::wxPlotXAxisArea( wxPlotWindow *parent ) : wxWindow( parent, wxID_ANY, wxDefaultPosition, wxSize(wxDefaultCoord,40), 0, _T("plotxaxisarea") ){ m_owner = parent; SetBackgroundColour( *wxWHITE ); SetFont( *wxSMALL_FONT );}void wxPlotXAxisArea::OnMouse( wxMouseEvent &event ){ int client_width; int client_height; GetClientSize( &client_width, &client_height); int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); view_x *= wxPLOT_SCROLL_STEP; view_y *= wxPLOT_SCROLL_STEP; wxCoord x = event.GetX() + view_x; wxCoord y = event.GetY() + view_y; /* TO DO: do something here */ wxUnusedVar(x); wxUnusedVar(y);}void wxPlotXAxisArea::OnPaint( wxPaintEvent &WXUNUSED(event) ){ int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); view_x *= wxPLOT_SCROLL_STEP; view_y *= wxPLOT_SCROLL_STEP; wxPaintDC dc( this ); int client_width; int client_height; GetClientSize( &client_width, &client_height); double zoom = m_owner->GetZoom(); double ups = m_owner->GetUnitsPerValue() / zoom; double start = view_x * ups; double end = (view_x + client_width) * ups; double range = end - start; int int_log_range = (int)floor( log10( range ) ); double step = 1.0; if (int_log_range > 0) { for (int i = 0; i < int_log_range; i++) step *= 10; } if (int_log_range < 0) { for (int i = 0; i < -int_log_range; i++) step /= 10; } double lower = ceil(start / step) * step; double upper = floor(end / step) * step; // if too few values, shrink size if ((range/step) < 4) { step /= 2; if (lower-step > start) lower -= step; if (upper+step < end) upper += step; } // if still too few, again if ((range/step) < 4) { step /= 2; if (lower-step > start) lower -= step; if (upper+step < end) upper += step; } dc.SetBrush( *wxWHITE_BRUSH ); dc.SetPen( *wxTRANSPARENT_PEN ); dc.DrawRectangle( 4, 5, client_width-14, 10 ); dc.DrawRectangle( 0, 20, client_width, 20 ); dc.SetPen( *wxBLACK_PEN ); double current = lower; while (current < upper+(step/2)) { int x = (int)ceil((current-start) / range * (double)client_width) - 1; if ((x > 4) && (x < client_width-25)) { dc.DrawLine( x, 5, x, 15 ); wxString label; if (range < 50) { label.Printf( _T("%f"), current ); while (label.Last() == _T('0')) label.RemoveLast(); if ((label.Last() == _T('.')) || (label.Last() == _T(','))) label.Append( _T('0') ); } else label.Printf( _T("%d"), (int)floor(current) ); dc.DrawText( label, x-4, 20 ); } current += step; } dc.DrawLine( 0, 15, client_width-8, 15 ); dc.DrawLine( client_width-4, 15, client_width-10, 10 ); dc.DrawLine( client_width-4, 15, client_width-10, 20 );}//-----------------------------------------------------------------------------// wxPlotYAxisArea//-----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS(wxPlotYAxisArea, wxWindow)BEGIN_EVENT_TABLE(wxPlotYAxisArea, wxWindow) EVT_PAINT( wxPlotYAxisArea::OnPaint) EVT_LEFT_DOWN( wxPlotYAxisArea::OnMouse)END_EVENT_TABLE()wxPlotYAxisArea::wxPlotYAxisArea( wxPlotWindow *parent ) : wxWindow( parent, wxID_ANY, wxDefaultPosition, wxSize(60,wxDefaultCoord), 0, _T("plotyaxisarea") ){ m_owner = parent; SetBackgroundColour( *wxWHITE ); SetFont( *wxSMALL_FONT );}void wxPlotYAxisArea::OnMouse( wxMouseEvent &WXUNUSED(event) ){ /* do something here */}void wxPlotYAxisArea::OnPaint( wxPaintEvent &WXUNUSED(event) ){ wxPaintDC dc( this ); wxPlotCurve *curve = m_owner->GetCurrentCurve(); if (!curve) return; int client_width; int client_height; GetClientSize( &client_width, &client_height); double range = curve->GetEndY() - curve->GetStartY(); double offset = ((double) curve->GetOffsetY() / (double)client_height ) * range; double start = curve->GetStartY() - offset; double end = curve->GetEndY() - offset; int int_log_range = (int)floor( log10( range ) ); double step = 1.0; if (int_log_range > 0) { for (int i = 0; i < int_log_range; i++) step *= 10; } if (int_log_range < 0) { for (int i = 0; i < -int_log_range; i++) step /= 10; } double lower = ceil(start / step) * step; double upper = floor(end / step) * step; // if too few values, shrink size if ((range/step) < 4) { step /= 2; if (lower-step > start) lower -= step; if (upper+step < end) upper += step; } // if still too few, again if ((range/step) < 4) { step /= 2; if (lower-step > start) lower -= step; if (upper+step < end) upper += step; } dc.SetPen( *wxBLACK_PEN ); double current = lower; while (current < upper+(step/2)) { int y = (int)((curve->GetEndY()-current) / range * (double)client_height) - 1; y -= curve->GetOffsetY(); if ((y > 10) && (y < client_height-7)) { dc.DrawLine( client_width-15, y, client_width-7, y ); wxString label; if (range < 50) { label.Printf( _T("%f"), current ); while (label.Last() == _T('0')) label.RemoveLast(); if ((label.Last() == _T('.')) || (label.Last() == _T(','))) label.Append( _T('0') ); } else label.Printf( _T("%d"), (int)floor(current) ); dc.DrawText( label, 5, y-7 ); } current += step; } dc.DrawLine( client_width-15, 6, client_width-15, client_height ); dc.DrawLine( client_width-15, 2, client_width-20, 8 ); dc.DrawLine( client_width-15, 2, client_width-10, 8 );}//-----------------------------------------------------------------------------// wxPlotWindow//-----------------------------------------------------------------------------#define ID_ENLARGE 1000#define ID_SHRINK 1002#define ID_MOVE_UP 1006#define ID_MOVE_DOWN 1007#define ID_ZOOM_IN 1010#define ID_ZOOM_OUT 1011IMPLEMENT_DYNAMIC_CLASS(wxPlotWindow, wxScrolledWindow)BEGIN_EVENT_TABLE(wxPlotWindow, wxScrolledWindow) EVT_BUTTON( ID_MOVE_UP, wxPlotWindow::OnMoveUp) EVT_BUTTON( ID_MOVE_DOWN, wxPlotWindow::OnMoveDown) EVT_BUTTON( ID_ENLARGE, wxPlotWindow::OnEnlarge) EVT_BUTTON( ID_SHRINK, wxPlotWindow::OnShrink) EVT_BUTTON( ID_ZOOM_IN, wxPlotWindow::OnZoomIn) EVT_BUTTON( ID_ZOOM_OUT, wxPlotWindow::OnZoomOut) EVT_SCROLLWIN( wxPlotWindow::OnScroll2)END_EVENT_TABLE()wxPlotWindow::wxPlotWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag ) : wxScrolledWindow( parent, id, pos, size, flag, _T("plotcanvas") ), m_titleStaticText( NULL ){ m_xUnitsPerValue = 1.0; m_xZoom = 1.0; m_enlargeAroundWindowCentre = false; m_scrollOnThumbRelease = false; m_area = new wxPlotArea( this ); wxBoxSizer *mainsizer = new wxBoxSizer( wxHORIZONTAL ); if ((GetWindowStyleFlag() & wxPLOT_BUTTON_ALL) != 0) { wxBoxSizer *buttonlist = new wxBoxSizer( wxVERTICAL ); if ((GetWindowStyleFlag() & wxPLOT_BUTTON_ENLARGE) != 0) { buttonlist->Add( new wxBitmapButton( this, ID_ENLARGE, *GetEnlargeBitmap() ), 0, wxEXPAND|wxALL, 2 ); buttonlist->Add( new wxBitmapButton( this, ID_SHRINK, *GetShrinkBitmap() ), 0, wxEXPAND|wxALL, 2 ); buttonlist->Add( 20,10, 0 ); } if ((GetWindowStyleFlag() & wxPLOT_BUTTON_MOVE) != 0) { buttonlist->Add( new wxBitmapButton( this, ID_MOVE_UP, *GetUpBitmap() ), 0, wxEXPAND|wxALL, 2 ); buttonlist->Add( new wxBitmapButton( this, ID_MOVE_DOWN, *GetDownBitmap() ), 0, wxEXPAND|wxALL, 2 ); buttonlist->Add( 20,10, 0 ); } if ((GetWindowStyleFlag() & wxPLOT_BUTTON_ZOOM) != 0) { buttonlist->Add( new wxBitmapButton( this, ID_ZOOM_IN, *GetZoomInBitmap() ), 0, wxEXPAND|wxALL, 2 ); buttonlist->Add( new wxBitmapButton( this, ID_ZOOM_OUT, *GetZoomOutBitmap() ), 0, wxEXPAND|wxALL, 2 ); } mainsizer->Add( buttonlist, 0, wxEXPAND|wxALL, 4 ); } wxBoxSizer *plotsizer = new wxBoxSizer( wxHORIZONTAL ); //Add sizer to hold the title and plot. //Title to be added later. m_plotAndTitleSizer = new wxBoxSizer( wxVERTICAL ); m_plotAndTitleSizer->Add( plotsizer, 1, wxEXPAND | wxTOP, 10 ); if ((GetWindowStyleFlag() & wxPLOT_Y_AXIS) != 0) { m_yaxis = new wxPlotYAxisArea( this ); wxBoxSizer *vert1 = new wxBoxSizer( wxVERTICAL ); plotsizer->Add( vert1, 1, wxEXPAND|wxTOP,10 ); vert1->Add( m_yaxis, 1 ); if ((GetWindowStyleFlag() & wxPLOT_X_AXIS) != 0) vert1->Add( 60, 40 ); } else { m_yaxis = (wxPlotYAxisArea*) NULL; } if ((GetWindowStyleFlag() & wxPLOT_X_AXIS) != 0) { m_xaxis = new wxPlotXAxisArea( this ); wxBoxSizer *vert2 = new wxBoxSizer( wxVERTICAL ); plotsizer->Add( vert2, 5, wxEXPAND); vert2->Add( m_area, 1, wxEXPAND|wxTOP,10 ); vert2->Add( m_xaxis, 0, wxEXPAND ); } else { plotsizer->Add( m_area, 1, wxEXPAND ); m_xaxis = (wxPlotXAxisArea*) NULL; } mainsizer->Add( m_plotAndTitleSizer, 1, wxEXPAND ); SetSizerAndFit( mainsizer ); SetTargetWindow( m_area ); SetBackgroundColour( *wxWHITE ); m_current = (wxPlotCurve*) NULL;}wxPlotWindow::~wxPlotWindow(){}void wxPlotWindow::Add( wxPlotCurve *curve ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -