有没有办法区分wxSpinCtrlDouble生成的不同事件? 来自wxWidgets文档:
事件宏: EVT_SPINCTRLDOUBLE(id,func): 每当旋转控件的数值改变时,即单击向上/向下旋转按钮,按下ENTER时,或控件失去焦点,新值与最后一个值不同时生成。
所以在我的情况下(wxMSW,wxWidgets 3.1.0)wxSpinCtrlDouble在控件失去焦点时单击向上/向下旋转按钮和时会生成一个事件。只处理旋转按钮中的事件会很方便。
更新
代码:
#include <wx/spinctrl.h>
#include <wx/wx.h>
class TestSpin : public wxApp
{
virtual bool OnInit();
void OnEvent(wxSpinDoubleEvent&);
wxTextCtrl *mText;
};
DECLARE_APP(TestSpin)
IMPLEMENT_APP(TestSpin)
bool TestSpin::OnInit()
{
wxFrame *frame = new wxFrame(NULL, wxID_ANY, "", wxDefaultPosition,
wxSize(190, 210));
frame->Show(true);
wxSpinCtrlDouble *spin = new wxSpinCtrlDouble(frame, wxID_ANY, "1.0",
wxPoint(10, 10), wxSize(150, 20),
wxSP_ARROW_KEYS | wxALIGN_RIGHT,
1.0, 10.0, 1.0, 1.0);
spin->Bind(wxEVT_SPINCTRLDOUBLE, &TestSpin::OnEvent, this);
mText = new wxTextCtrl(frame, wxID_ANY, "", wxPoint(10, 50), wxSize(150, 110),
wxTE_MULTILINE | wxTE_READONLY);
return true;
}
void TestSpin::OnEvent(wxSpinDoubleEvent&)
{
mText->AppendText("event\n");
}
Here is a screenshot. 这是我点击“向上”旋转按钮(一次)并单击wxTextCtrl(一次)后得到的。所以当我按下“向上”按钮时,它会将值从1更改为2并生成一个事件。然后我点击wxTextCtrl,wxSpinCtrlDouble失去焦点并因某种原因生成两次事件。
如果我只是点击wxSpinCtrlDouble的文本区域,然后点击wxTextCtrl,它也会生成两个事件(在这种情况下,值甚至没有改变)。
此外,对ENTER没有任何反应。
更新II
在提出avariant之后,以下是适合我案例的事件:
#include <wx/spinctrl.h>
#include <wx/wx.h>
class TestSpin : public wxApp
{
virtual bool OnInit();
void OnSpinEvent(wxSpinEvent&);
void OnTextEvent(wxCommandEvent&);
void OnEnterEvent(wxCommandEvent&);
wxTextCtrl *mText;
};
DECLARE_APP(TestSpin)
IMPLEMENT_APP(TestSpin)
bool TestSpin::OnInit()
{
wxFrame *frame = new wxFrame(NULL, wxID_ANY, "", wxDefaultPosition,
wxSize(190, 210));
frame->Show(true);
wxSpinCtrlDouble *spin = new wxSpinCtrlDouble(frame, wxID_ANY, "1.0",
wxPoint(10, 10), wxSize(150, 20),
wxSP_ARROW_KEYS | wxALIGN_RIGHT |
wxTE_PROCESS_ENTER,
1.0, 20.0, 1.0, 1.0);
spin->Bind(wxEVT_SPIN, &TestSpin::OnSpinEvent, this);
spin->Bind(wxEVT_TEXT, &TestSpin::OnTextEvent, this);
spin->Bind(wxEVT_TEXT_ENTER, &TestSpin::OnEnterEvent, this);
mText = new wxTextCtrl(frame, wxID_ANY, "", wxPoint(10, 50), wxSize(150, 110),
wxTE_MULTILINE | wxTE_READONLY);
return true;
}
void TestSpin::OnSpinEvent(wxSpinEvent&)
{
mText->AppendText("spin event\n");
}
void TestSpin::OnTextEvent(wxCommandEvent&)
{
mText->AppendText("text event\n");
}
void TestSpin::OnEnterEvent(wxCommandEvent&)
{
mText->AppendText("enter event\n");
}
Here is the result.在“1”(文本事件)旁边输入“0”,单击“向上”(文本事件+旋转事件),然后按ENTER键,我得到了这个。
嗯,可能没有必要举办这么多活动。但至少现在有一个选择(我可能会选择文本事件,因为它会执行所需的操作:在值更改时生成事件;如果值确实不同,可以在代码中再添加一个检查,即,例如,在小数部分的末尾添加“0”符号不会改变值。)
但是,我不知道它是否适用于其他平台(或其他wxWidgets版本)。