繁体   English   中英

无法在 wxAuiNotebook 上放置图表

[英]unable to place chart on wxAuiNotebook

我在 Win10 wxWidgets 版本 3.2.0 上编写了我的 С++ 应用程序。 我需要显示图表。
为此,我想使用ChartDirector
我在我的项目中包含了 chartdir70.dll 并进行了所有必要的设置。
我以wxChartDir realtimemeasure为例。

现在我显示了按钮,但没有图表。 在此处输入图像描述

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



#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;
}


也就是说,我想在我的 wxAuiNotebook* PanelViewData 上放置一个图表。 在我的代码中,我做了以下事情:

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);

我将指向 PanelViewData 的指针传递给 ClientChartsViewer() 构造函数。

您似乎没有调用 base class ctor,这意味着从未创建实际的ClientChartsViewer window。 您必须稍后为任何wxWindow派生的 class 调用非默认构造函数或Create() (我假设这个是,尽管我可能是错的,因为您没有明确显示它的声明)。

暂无
暂无

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

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