私のプロジェクト (Visual C++ 2010 Express、wxWidgets 2.9.4) では、wxFloatingPointValidator を介して 3 つの変数 (a0、a1、a2 - 放物線の係数を表す) に関連付けられることになっているいくつかの TextCtrl オブジェクトを使用しています。これらは、wxMathPlot を使用して関数をプロットするために使用されます。係数は、他のすべてが定義されている wxFrame クラスのメンバーです。プログラムは「計算」ボタンを中心に展開します - 関数の x 座標と y 座標を計算し、レイヤーを m_plot wxMathPlot オブジェクトに追加する OnCalculate() メソッドをトリガーします。何らかの理由で、バリデーターは入力値をメンバー フィールドにまったく渡しません (デバッグ モードでこれを追跡しました)。私はいくつかのサンプル コードスニペットを参照してきました。 私の実装はほとんど同じですが、望ましい効果が得られないように思えます。どんな助けでも大歓迎です...
注: バリデーターとテキスト ボックスをベクター内に配置してコードを整理するなど、さまざまなことを試しましたが、このバージョンでは、自分が何をしているのかがもう少し明確になるようにしました。また、同じ効果を持つ a0、a1、a2 のデフォルト値はありませんでした (y=0 で直線をプロットします)。
編集:変数a0、a1、a2を別のクラスに入れて、公式のwxValidatorサンプルのようにグローバルに定義しようとしました->同じ効果...
#include "wx/wx.h"
#include <wx/valnum.h> // wxFloatingPointValidator
#include <wx/bookctrl.h> // make tabs in the window
#include "mathplot.h" // plotting
#include <vector>
class MyApp: public wxApp
{
virtual bool OnInit();
};
class MyFrame: public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
wxBookCtrl * book;
wxTextCtrl * _textBox0, * _textBox1, * _textBox2;
double a0,a1,a2;
std::vector<double> _xcoords, _ycoords;
mpWindow * m_plot;
void OnQuit(wxCommandEvent& event);
void OnCalculate(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
enum
{
ID_Quit = 1,
ID_textBox,
BUTTON_calculate
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_BUTTON(BUTTON_calculate, MyFrame::OnCalculate)
END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame( _("wxPlotter"), wxPoint(50, 50), wxSize(450,340) );
frame->Show(true);
SetTopWindow(frame);
return true;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame( NULL, -1, title, pos, size )
{
a0=0; a1=0; a2=0; // default values
wxMenu *menuFile = new wxMenu;
menuFile->Append( ID_Quit, _("&Exit") );
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append( menuFile, _("&File") );
SetMenuBar( menuBar );
book = new wxBookCtrl(this, -1);
wxPanel *panel1 = new wxPanel(book);
wxFloatingPointValidator<double> _val0(4,&a0,wxNUM_VAL_DEFAULT);
_textBox0 = new wxTextCtrl(panel1, ID_textBox, "0.0000", wxPoint(40, 30), wxSize(60,20), wxTE_PROCESS_ENTER, _val0, wxTextCtrlNameStr);
wxFloatingPointValidator<double> _val1(4,&a1,wxNUM_VAL_DEFAULT);
_textBox1 = new wxTextCtrl(panel1, ID_textBox, "0.0000", wxPoint(40, 60), wxSize(60,20), wxTE_PROCESS_ENTER, _val1, wxTextCtrlNameStr);
wxFloatingPointValidator<double> _val2(4,&a2,wxNUM_VAL_DEFAULT);
_textBox2 = new wxTextCtrl(panel1, ID_textBox, "0.0000", wxPoint(40, 90), wxSize(60,20), wxTE_PROCESS_ENTER, _val2, wxTextCtrlNameStr);
new wxButton( panel1, BUTTON_calculate, _T("Calculate"), wxPoint(150,30), wxSize(100,30) );
book->AddPage(panel1, _T("Input"), true); // move the page to the tab
wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
wxPanel *panel2 = new wxPanel(book);
panel2->SetSizer(topsizer);
m_plot = new mpWindow( panel2, -1, wxPoint(0,0), wxSize(100,100), wxSUNKEN_BORDER );
m_plot->SetMargins(0,0,50,70);
mpScaleX* xaxis = new mpScaleX(wxT("x"), mpALIGN_BOTTOM, true);
mpScaleY* yaxis = new mpScaleY(wxT("y"), mpALIGN_LEFT, true);
xaxis->SetDrawOutsideMargins(false);
yaxis->SetDrawOutsideMargins(false);
m_plot->AddLayer(xaxis);
m_plot->AddLayer(yaxis);
m_plot->Fit(-5.,5.,-5,5.,0,0);
topsizer->Add( m_plot, 1, wxEXPAND );
book->AddPage(panel2, _T("Plot"), false); // false to make this a secondary tab -> not displayed upon initialisation
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) // defines what happens when quit is pressed
{
Close(TRUE); // closes the window
}
void MyFrame::OnCalculate(wxCommandEvent& WXUNUSED(event))
{
for (int i=0; i<1000; i++)
{
_xcoords.push_back(i*.1);
_ycoords.push_back(a0+a1*_xcoords[i]+a2*pow(_xcoords[i],2.));
}
mpFXYVector* vectorLayer = new mpFXYVector(_("Parabola"));
vectorLayer->SetData(_xcoords, _ycoords);
vectorLayer->SetContinuity(true);
wxPen vectorpen(*wxBLUE, 2, wxSOLID);
vectorLayer->SetPen(vectorpen);
vectorLayer->SetDrawOutsideMargins(false);
m_plot->AddLayer(vectorLayer);
m_plot->Fit(-5.,5.,-5,5.,0,0);
}