简体   繁体   English

无法在 wxAuiNotebook 上放置图表

[英]unable to place chart on wxAuiNotebook

I wrote my С++ application on Win10, wxWidgets version 3.2.0.我在 Win10 wxWidgets 版本 3.2.0 上编写了我的 С++ 应用程序。 and I need to display graphs.我需要显示图表。
For this I want to use the ChartDirector .为此,我想使用ChartDirector
I included chartdir70.dll in my project and made all necessary settings.我在我的项目中包含了 chartdir70.dll 并进行了所有必要的设置。
I am using wxChartDir realtimemeasure as an example.我以wxChartDir realtimemeasure为例。

Now I have buttons displayed, but no graph.现在我显示了按钮,但没有图表。 在此处输入图像描述

ClientChartsViewer.hpp ClientChartsViewer.hpp

/*!
 * ClientChartsViewer class declaration
 */

#pragma once
 // For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include <wx/frame.h>
#include <wx/tglbtn.h>
#include <wx/scrolbar.h>
#include <wx/checkbox.h>

#include "wxchartviewer.h"

#include <vector>
#include <map>

#define SYMBOL_REALTIMEMEASURE_STYLE wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX
#define SYMBOL_REALTIMEMEASURE_TITLE _("Real-Time Chart with Measurement Cursors")
#define SYMBOL_REALTIMEMEASURE_IDNAME ID_REALTIMEMEASURE
#define SYMBOL_REALTIMEMEASURE_SIZE wxSize(800, 420)
#define SYMBOL_REALTIMEMEASURE_POSITION wxDefaultPosition

class ClientChartsViewer : public wxFrame {

public:
    /// Constructors
    ClientChartsViewer();
    ClientChartsViewer(wxWindow* parent, wxWindowID id = SYMBOL_REALTIMEMEASURE_IDNAME, const wxString& caption = SYMBOL_REALTIMEMEASURE_TITLE, const wxPoint& pos = SYMBOL_REALTIMEMEASURE_POSITION, const wxSize& size = SYMBOL_REALTIMEMEASURE_SIZE, long style = SYMBOL_REALTIMEMEASURE_STYLE);
    bool Create(wxWindow* parent, wxWindowID id = SYMBOL_REALTIMEMEASURE_IDNAME, const wxString& caption = SYMBOL_REALTIMEMEASURE_TITLE, const wxPoint& pos = SYMBOL_REALTIMEMEASURE_POSITION, const wxSize& size = SYMBOL_REALTIMEMEASURE_SIZE, long style = SYMBOL_REALTIMEMEASURE_STYLE);

    /// Destructor
    ~ClientChartsViewer();

    /// Initialises member variables
    void Init();

    /// Creates the controls and sizers
    void CreateControls(wxWindow* parent);

    // Draw chart
    void DrawChart(wxChartViewer* viewer); 

    // Draw track lines
    void TrackLineLabel(XYChart* c);
    void DrawTrackLine(XYChart* c, int i, std::map<std::string, double>& log);
    void DrawTrackDiff(XYChart* c, std::map<std::string, double>& log0, std::map<std::string, double>& log1);

    void UpdateControls(wxChartViewer* viewer);

    // Event handler declarations
    // ..............................\\\

};

ClientChartsViewer.cpp ClientChartsViewer.cpp



#include "../include/ClientChartsViewer.hpp"
//#include <wx/sizer.h>
#include <sstream>



/*
 * ClientChartsViewer type definition
 */

static const int gs_dataInterval = 250;
static const int gs_chartUpdateInterval = 250;

// The mouse can drag the track line if it is within the GrabDistance to the line.
static const int gs_grabDistance = 8;


/*
 * ClientChartsViewer constructors
 */

ClientChartsViewer::ClientChartsViewer() {
    Init();
}

ClientChartsViewer::ClientChartsViewer(wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style) {
    Init();
    Create(parent, id, caption, pos, size, style);
}

/*
 * ClientChartsViewer creator
 */

bool
ClientChartsViewer::Create(wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style) {
    wxFrame::Create(parent, id, caption, pos, size, style);
     
    CreateControls(parent);
    if (GetSizer())
    {
        GetSizer()->SetSizeHints(this);
    }
    Centre();

    return true;
}



/*
 * ClientChartsViewer destructor
 */
ClientChartsViewer::~ClientChartsViewer() {
    m_dataRateTimer.Stop();
    m_chartUpdateTimer.Stop();

    if (m_chartViewer->getChart() != NULL) {
        delete m_chartViewer->getChart();
    }
}


void ClientChartsViewer::CreateControls(wxWindow* parent)
{
    m_parent = parent;
    //SetIcon(wxICON(mondrian));
    //ClientChartsViewer* itemFrame1 = this;
    wxBoxSizer* itemBoxSizer1 = new wxBoxSizer(wxVERTICAL);
    //itemFrame1->SetSizer(itemBoxSizer1);
    parent->SetSizer(itemBoxSizer1);

    wxPanel* itemPanel2 = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
    itemPanel2->SetExtraStyle(wxWS_EX_VALIDATE_RECURSIVELY);
    itemBoxSizer1->Add(itemPanel2, 1, wxGROW | wxALL, 0);
    m_bgColour = itemPanel2->GetBackgroundColour();

    wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
    itemPanel2->SetSizer(itemBoxSizer3);

    wxStaticBox* itemStaticBoxSizer1Static = new wxStaticBox(itemPanel2, wxID_ANY, wxEmptyString);
    wxStaticBoxSizer* itemStaticBoxSizer1 = new wxStaticBoxSizer(itemStaticBoxSizer1Static, wxVERTICAL);
    itemBoxSizer3->Add(itemStaticBoxSizer1, 0, wxGROW | wxALL, parent->FromDIP(3));

    m_pointerButton = new wxToggleButton(itemPanel2, ID_POINTER, _(" &Pointer"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
    m_pointerButton->SetBitmap(GetBitmapResource("pointer.png"));
    m_pointerButton->SetBitmapMargins(parent->FromDIP(10), parent->FromDIP(0));
    // Initially set the mouse to drag to scroll mode
    m_pointerButton->SetValue(true);
    itemStaticBoxSizer1->Add(m_pointerButton, 0, wxGROW | wxALL, parent->FromDIP(3));

    m_zoominButton = new wxToggleButton(itemPanel2, wxID_ZOOM_IN, _(" Zoom &In"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
    m_zoominButton->SetBitmap(GetBitmapResource("zoomin.png"));
    m_zoominButton->SetBitmapMargins(parent->FromDIP(10), parent->FromDIP(0));
    m_zoominButton->SetValue(false);
    itemStaticBoxSizer1->Add(m_zoominButton, 0, wxGROW | wxALL, parent->FromDIP(3));

    m_zoomoutButton = new wxToggleButton(itemPanel2, wxID_ZOOM_OUT, _(" Zoom &Out"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
    m_zoomoutButton->SetBitmap(GetBitmapResource("zoomout.png"));
    m_zoomoutButton->SetBitmapMargins(parent->FromDIP(10), parent->FromDIP(0));
    m_zoomoutButton->SetValue(false);

    itemStaticBoxSizer1->Add(m_zoomoutButton, 0, wxGROW | wxALL, parent->FromDIP(3));

    itemStaticBoxSizer1->Add(3, 3, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, parent->FromDIP(3));

    m_saveButton = new wxButton(itemPanel2, wxID_SAVE, _(" &Save"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
    m_saveButton->SetBitmap(GetBitmapResource("save.png"));
    m_saveButton->SetBitmapMargins(parent->FromDIP(10), parent->FromDIP(0));
    itemStaticBoxSizer1->Add(m_saveButton, 0, wxGROW | wxALL, parent->FromDIP(3));

    itemStaticBoxSizer1->Add(3, 3, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, parent->FromDIP(3));

    m_trackLine1 = new wxCheckBox(itemPanel2, ID_TRACKLINE1, _("Track Line 1"), wxDefaultPosition, wxDefaultSize, 0);
    m_trackLine1->SetValue(true);
    itemStaticBoxSizer1->Add(m_trackLine1, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, parent->FromDIP(3));

    m_trackLine2 = new wxCheckBox(itemPanel2, ID_TRACKLINE2, _("Track Line 2"), wxDefaultPosition, wxDefaultSize, 0);
    m_trackLine2->SetValue(true);
    itemStaticBoxSizer1->Add(m_trackLine2, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, parent->FromDIP(3));

    wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxVERTICAL);
    itemBoxSizer3->Add(itemBoxSizer8, 1, wxGROW | wxALL, parent->FromDIP(3));

    m_chartViewer = new wxChartViewer(itemPanel2, ID_CHARTVIEWER, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxNO_BORDER);
    m_chartViewer->SetMinSize(parent->FromDIP(wxSize(650, 350)));
    m_chartViewer->SetExtraStyle(wxWS_EX_VALIDATE_RECURSIVELY);
    itemBoxSizer8->Add(m_chartViewer, 1, wxGROW | wxALL, parent->FromDIP(3));

    m_scrollBar = new wxScrollBar(itemPanel2, ID_SCROLLBAR, wxDefaultPosition, wxDefaultSize, wxSB_HORIZONTAL);
    m_scrollBar->SetScrollbar(0, 0, 1000000000, 200000000);
    itemBoxSizer8->Add(m_scrollBar, 0, wxGROW | wxALL, parent->FromDIP(3));

    // Clear data arrays to Chart::NoValue
    for (int i = 0; i < sampleSize; ++i)
    {
        m_timeStamps[i] = m_dataSeriesA[i] = m_dataSeriesB[i] = Chart::NoValue;
    }
    m_currentIndex = 0;
    m_firstChartTime = m_chartTimeLimit = Chart::NoValue;

    // Variables to keep track of the mouse for dragging track lines
    m_nearestTrackLine = -1;
    m_nearestDistance = 0;

    // Set m_nextDataTime to the current time. It is used by the real time random number
    // generator so it knows what timestamp should be used for the next data point.
    m_nextDataTime = wxDateTime::Now();

    // Enable mouse wheel zooming by setting the zoom ratio to 1.1 per wheel event
    m_chartViewer->setMouseWheelZoomRatio(1.1);

    // Set m_nextDataTime to the current time. It is used by the real time random number
    // generator so it knows what timestamp should be used for the next data point.
    m_nextDataTime = wxDateTime::Now();

    // Set up the data acquisition mechanism. In this demo, we just use a timer to get a
    // sample every 250ms.
    //m_dataRateTimer = new wxTimer(parent, ID_DATA_TIMER);
    m_dataRateTimer.Connect(wxEVT_TIMER, (wxObjectEventFunction)&ClientChartsViewer::OnDataTimer);
    m_dataRateTimer.Start(gs_dataInterval);

    // Set up the chart update timer
    //m_chartUpdateTimer = new wxTimer(parent, ID_UPDATE_TIMER);
    m_chartUpdateTimer.Connect(wxEVT_TIMER, (wxObjectEventFunction)&ClientChartsViewer::OnChartUpdateTimer);
    m_chartUpdateTimer.Start(gs_chartUpdateInterval);

    m_zoomoutButton->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction)&ClientChartsViewer::OnZoomOutClick);
    m_pointerButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&ClientChartsViewer::OnPointerClick);
    m_zoominButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&ClientChartsViewer::OnZoomInClick);
    m_trackLine1->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction)&ClientChartsViewer::OnTrackline1Click);
    m_trackLine2->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction)&ClientChartsViewer::OnTrackline2Click);
    m_saveButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&ClientChartsViewer::OnSave);
    m_chartViewer->Connect(wxEVT_CHARTVIEWER_MOUSEMOVE_PLOTAREA, (wxObjectEventFunction)&ClientChartsViewer::OnMouseMovePlotArea);
    m_chartViewer->Connect(wxEVT_CHARTVIEWER_VIEWPORT_CHANGED, (wxObjectEventFunction)&ClientChartsViewer::OnViewPortChanged);
    m_scrollBar->Connect(wxEVT_COMMAND_SCROLLBAR_UPDATED, (wxObjectEventFunction)&ClientChartsViewer::OnScrollbarUpdated);

}


/*
 * Member initialisation
 */

void ClientChartsViewer::Init() {
    m_trackLine1 = nullptr;
    m_trackLine2 = nullptr;
}


That is, I want to place a graph on my wxAuiNotebook* PanelViewData.也就是说,我想在我的 wxAuiNotebook* PanelViewData 上放置一个图表。 In my code I did the following:在我的代码中,我做了以下事情:

wxAuiNotebook* PanelViewData = new wxAuiNotebook(this, wxID_ANY,
wxDefaultPosition, wxSize(200, 150),
wxAUI_NB_TAB_MOVE | wxAUI_NB_WINDOWLIST_BUTTON | wxAUI_NB_CLOSE_ON_ACTIVE_TAB | wxNO_BORDER);

// Charts
ChartsViewer_ = new ClientChartsViewer(PanelViewData);

I pass a pointer to the PanelViewData to the ClientChartsViewer() constructor.我将指向 PanelViewData 的指针传递给 ClientChartsViewer() 构造函数。

You don't seem to be calling the base class ctor, which means that the actual ClientChartsViewer window is never created.您似乎没有调用 base class ctor,这意味着从未创建实际的ClientChartsViewer window。 You must either call the non-default ctor or Create() later for any wxWindow -derived class (which I assume this one is, although I could be wrong because you don't show its declaration explicitly).您必须稍后为任何wxWindow派生的 class 调用非默认构造函数或Create() (我假设这个是,尽管我可能是错的,因为您没有明确显示它的声明)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM