如何在wxwidgets中的类中创建的按钮中添加命令?

时间:2016-08-29 18:02:09

标签: c++ wxwidgets

我已经搜索了很长一段时间并且考虑了不同的选择很长一段时间,我现在绝对难倒了。我创建了一个简单的类,它在构造函数中生成16个按钮并为它们分配ID。我希望每个按钮在单击时触发事件。

标题中的类:

class step16
{
    ///signals and buttons
private:
    wxButton*       sequencer              [16];
    long*           ids          = new long[16];
public:
    step16(wxFrame* frame);
    ~step16();
};

声明源文件中的函数:

///constructor for 16 step sample sequencer class
step16::step16(wxFrame* frame)
{
    ///clear all signals on initialization and create buttons
    for(int i = 0; i < 16; i++){
        ids      [i] = wxNewId();
        sequencer[i] = new wxButton(frame,ids[i],wxString::Format(_("")),
                                    wxPoint(i*30 ,     0,wxSize(30,20) );
    }
}

///destructor for the 16 step sequencer class
step16::~step16(){delete[]signals;}

我知道如何将单击事件添加到wxWidgets中的按钮的唯一方法是在Main wxFrame的初始化部分中使用Connect()方法,但是在程序的该部分中连接它们将不会带来所需的结果。主要是因为我需要一组新的16个按钮,在step16类的每个实例中都有唯一的ID和事件。我如何为每个按钮添加唯一的点击事件?

1 个答案:

答案 0 :(得分:2)

您可以使用Bind绑定从wxEventHandler派生的任何类中的处理程序(即几乎任何标准的wxWidgets类,包括wxFrame)。

将按钮的ID传递给Bind()调用,以便事件处理程序知道按下了哪个按钮。

例如,您的step16构造函数可能如下所示:

///constructor for 16 step sample sequencer class
step16::step16(wxFrame* frame)
{
    ///clear all signals on initialization and create buttons
    for(int i = 0; i < 16; i++)
    {
        ids      [i] = wxNewId();
        sequencer[i] = new wxButton(frame,ids[i],wxString::Format(_("")),
                                        wxPoint(i*30,0), wxSize(30,20));

        /// Add it to something so I can test this works!
        frame->GetSizer()->Add(sequencer[i]);

        /// Bind the clicked event for this button to a handler 
        /// in the Main Frame.
        sequencer[i]->Bind(wxEVT_COMMAND_BUTTON_CLICKED, 
                            &MainFrame::OnPress, 
                            (MainFrame*)frame);
    }
}

在这个例子中,我在MainFrame类中创建了一个事件处理程序,指向一个实例的指针被传递给step16的ctor。

您可以使用event.GetId()来区分按下按钮,这将是该行设置的值:

ids [i] = wxNewId();

MainFrame::OnPress方法可能如下所示:

void MainFrame::OnPress(wxCommandEvent& event)
{
    long firstID = *theStep16->GetIDs();

    switch(event.GetId() - firstID)
    {
        case 0:
            std::cout << "First button" << std::endl;
            break;
        case 1:
            std::cout << "Second button" << std::endl;
            break;
        default:
            std::cout << "One of the other buttons with ID " 
                      << event.GetId() << std::endl;
    }
}