首先说点题外话,光是这个小问题,浪费了我两天的时间,不过还好,分离开了就是进步!
1. wxTreeCtrl 是一个树状控件类,分层显示,每一个项(对应一个wxTreeItemId) 可以设置一个 文本编辑 和一个 图标。其他介绍网上很多不说了。
2. 实现:
//MyTreeItemData 继承于wxTreeItemData, 我主要是用来给给一个子项一个字符串标识
class MyTreeItemData : public wxTreeItemData
{
public:
MyTreeItemData(const wxString& desc):m_desc(desc){}
const wxString& GetDesc() const { return m_desc; }
private:
wxString m_desc;
};
//MyTreeCtrl继承于 wxTreeCtrl
class MyTreeCtrl : public wxTreeCtrl
{
public:
MyTreeCtrl(wxWindow* parent );
~MyTreeCtrl(){}
void OnLRBtn(wxTreeEvent& event);
void OnLeftBtn(wxTreeEvent& event);
void OnRightBtn(wxTreeEvent& event);
};
2. cpp 文件
MyTreeCtrl::MyTreeCtrl(wxWindow* parent )
:wxTreeCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HAS_BUTTONS )
{
wxTreeItemId rootId = this->AddRoot(wxT("工件..."), -1, -1, new MyTreeItemData(wxT("Root")));
wxTreeItemId childId1 = this->AppendItem( rootId, wxT("左/右向..."), -1, -1, new MyTreeItemData(wxT("Id1")));
wxTreeItemId childId2 = this->AppendItem( rootId, wxT("左向..."), -1, -1, new MyTreeItemData(wxT("Id2")));
wxTreeItemId childId3 = this->AppendItem(rootId, wxT("右向..."), -1, -1, new MyTreeItemData(wxT("Id3")));
Connect(this->GetId(), wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler(MyTreeCtrl::OnLRBtn), NULL, NULL);
}
void MyTreeCtrl::OnLRBtn(wxTreeEvent& event)
{
wxTreeItemId id = event.GetItem();
if(!id.IsOk())
return ;
MyTreeItemData* data = (MyTreeItemData*)GetItemData(id);
if( data->GetDesc() == wxT("Id1"))
wxMessageBox(wxT("This is Left and Right Button!"));
else if( data->GetDesc() == wxT("Id2"))
wxMessageBox(wxT("This is Left Button!"));
else if( data->GetDesc() == wxT("Id3"))
wxMessageBox(wxT("This is Right Button!"));
}
3. MainFrame 使用 MyTreeCtrl 创建对象,加入布局;
MainFrame::MainFrame(...)
{
....
MyTreeCtrl* m_trcMsg = new MyTreeCtrl(m_plTreeCtrl);
m_bsTreeCtrl->Add(m_trcMsg, 1, wxEXPAND|wxALL, 0);
m_plTreeCtrl->SetSizer(m_bsTreeCtrl);
m_plTreeCtrl->Layout();
....
}
花了好久没想明白,主要是在 在 MainFrame 里面Connect(...)事件,殊不知,事件其实是MyTreeCtrl 里面实现才可以。