与上章相比,增加一个自定义控件 MySlider。
重点是自定义事件。
自定义控件中的自定义事件主要由以下3个步骤组成:
1.在头文件中声明了MY_EVENT事件类型,wxDECLARE_EVENT(MY_EVENT,wxCommandEvent);
2.在CPP文件中进行事件类型定义
wxDEFINE_EVENT(MY_EVENT,wxCommandEvent);
3.发送事件
wxCommandEvent ent(MY_EVENT);
ent.SetEventObject(this);
ent.SetInt(m_slider->GetValue());
ent.SetString(wxString::Format("%i",m_slider->GetValue()));
wxPostEvent(this,ent);
一、MySlider控件
#include <wx/wx.h>
wxDECLARE_EVENT(MY_EVENT,wxCommandEvent);
class MySlider:public wxPanel
{
public:
MySlider(wxPanel* parent);
protected:
void m_slider_Scroll(wxScrollEvent& event);
wxSlider* m_slider;
};
#endif // MYSLIDER_H_INCLUDED
wxDEFINE_EVENT(MY_EVENT,wxCommandEvent);
MySlider::MySlider(wxPanel* parent)
:wxPanel(parent,wxID_ANY)
{
m_parent = parent;
m_slider = new wxSlider(m_parent,wxID_ANY
,75,0,750
,wxPoint(100,-1)
,wxSize(150,-1)
,wxSL_LABELS
);
m_slider->Bind(wxEVT_COMMAND_SLIDER_UPDATED
,wxScrollEventHandler( MySlider::m_slider_Scroll)
,this
);
}
void MySlider::m_slider_Scroll(wxScrollEvent& event)
{
wxCommandEvent ent(MY_EVENT);
ent.SetEventObject(this);
ent.SetInt(m_slider->GetValue());
ent.SetString(wxString::Format("%i",m_slider->GetValue()));
// wxPostEvent(this,ent);
ProcessWindowEvent(ent);
}
二、主程序
#include <wx/wx.h>
#include "mypanel.h"
#include "myslider.h"
class Simple:public wxFrame
{
public:
Simple(const wxString& title);
int GetCurWidth(){return cur_width;};
protected:
void OnScroll(wxCommandEvent& event);
wxPanel* panel;
wxTextCtrl* tc;
MyPanel* m_wid;
MySlider* m_slider;
int cur_width;
};
Simple::Simple(const wxString& title)
:wxFrame(NULL,-1,title)
{
cur_width = 75;
panel = new wxPanel(this,wxID_ANY);
wxPanel* topPanel = new wxPanel(panel,wxID_ANY);
wxPanel* centerPanel = new wxPanel(panel,wxID_ANY);
tc = new wxTextCtrl(topPanel,wxID_ANY);
m_slider = new MySlider(centerPanel);
m_slider->Bind(MY_EVENT,Simple::OnScroll,this);
wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer* hbox3 = new wxBoxSizer(wxHORIZONTAL);
m_wid = new MyPanel(panel);
m_wid->SetCurWidth(cur_width);
hbox3->Add(topPanel,1,wxTOP|wxLEFT,35);
hbox2->Add(centerPanel,1,wxEXPAND);
hbox1->Add(m_wid,1,wxEXPAND);
vbox->Add(hbox3,1,wxEXPAND);
vbox->Add(hbox2,1,wxEXPAND);
vbox->Add(hbox1,0,wxEXPAND);
panel->SetSizer(vbox);
Centre();
}
void Simple::OnScroll(wxCommandEvent& event)
{
tc->SetLabel(event.GetString());
// cur_width = wxAtoi( event.GetString());
cur_width = event.GetInt();
m_wid->SetCurWidth(cur_width);
m_wid->Refresh();
}