区分不同的wxSpinCtrlDouble事件

时间:2017-03-09 22:20:04

标签: c++ events wxwidgets

有没有办法区分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版本)。

0 个答案:

没有答案