为树形控件叶子节点添加控件的方法,目前思路:树形控件以层的形式展示信息,通过这两天对wxWidgets控件特别是wxTreeCtrl类的研究可知,如果希望在wxTreeItemId上绑定一些数据,只需要实现自己的wxTreeItemData派生类,然后调用wxTreeCtrl::SetItemData函数以及wxTreeCtrl::GetItemData函数即可。
目前代码如下:(有待继续。。。)
一、头文件说明
- #include "wx/wx.h"
- #include "wx/treectrl.h"
- //--------------------------------------------------------------------------------
- // 声明一个和子项绑定的类,也是实现自定义树形控件的基础
- class CTreeNodeMgrItemData : public wxTreeItemData
- {
- public:
- CTreeNodeMgrItemData( int flag = 0 )
- {
- // 判断用户要绑定的控件,1、2、3分别是文本框、下拉列表框和按钮
- switch ( flag )
- {
- case 1: m_textctrl = new wxTextCtrl(); break;
- case 2: m_combobox = new wxComboBox(); break;
- case 3: m_button = new wxButton(); break;
- case 0: ;
- default:break;
- }
- }
- CTreeNodeMgrItemData(const wxString& desc) : m_desc(desc) { }
- CTreeNodeMgrItemData( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, const int flag )
- {
- switch ( flag )
- {
- case 1:
- pt.x += 80;
- pt.y -= 10;
- m_textctrl = new wxTextCtrl( parent, id, value, pt, wxSize( 120, 18 ) );
- break;
- case 2:
- pt.x += 80;
- pt.y -= 10;
- m_combobox = new wxComboBox( parent, id, value, pt, wxSize( 120, 18 ) );
- break;
- case 3:
- pt.x += 80;
- pt.y -= 10;
- m_button = new wxButton( parent, id, value, pt, wxSize( 120, 18 ) );
- break;
- case 0:;
- default:break;
- }
- }
- void CreateTextCtrl( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, wxSize sz )
- {
- if ( NULL == m_textctrl )
- {
- m_textctrl = new wxTextCtrl();
- m_textctrl->Create( parent, id, value, pt, sz );
- }
- else
- {
- m_textctrl = new wxTextCtrl();
- m_textctrl->Create( parent, id, value, pt, sz );
- }
- }
- void CreateComboBox( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, wxSize sz )
- {
- if ( NULL == m_combobox )
- {
- m_combobox = new wxComboBox();
- m_combobox->Create( parent, id, value, pt, sz );
- }
- else
- {
- m_combobox = new wxComboBox();
- m_combobox->Create( parent, id, value, pt, sz );
- }
- }
- void CreateButton( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, wxSize sz )
- {
- if ( NULL == m_button )
- {
- m_button = new wxButton();
- m_button->Create( parent, id, value, pt, sz );
- }
- else
- {
- m_button = new wxButton();
- m_button->Create( parent, id, value, pt, sz );
- }
- }
- const wxTextCtrl *GetTextCtrl() const { return m_textctrl; }
- const wxComboBox *GetComboBoxCtrl() const { return m_combobox; }
- void ShowInfo( wxTreeCtrl *tree );
- const wxChar *GetDesc() const { return m_desc.c_str(); }
- private:
- wxString m_desc; // 绑定项是字符串,作为说明之用
- wxTextCtrl* m_textctrl; // 绑定的文本框控件
- wxComboBox* m_combobox; // 绑定的下拉类表框控件
- wxButton* m_button; // 绑定的按钮控件
- };
- //--------------------------------------------------------------------------------
- // 重载wxTreeCtrl类
- class CTreeNodeMgr : public wxTreeCtrl
- {
- public:
- enum MENU_ITEM_ID
- {
- MENU_ADDNODE_CHILD = 1001,
- MENU_ADDNODE_SIBLING,
- MENU_DELNODE,
- };
- CTreeNodeMgr() {}
- CTreeNodeMgr( wxWindow * parent, const wxWindowID id,
- const wxPoint & pos, const wxSize & size, long style );
- virtual ~CTreeNodeMgr() { }
- void OnBeginLabelEdit( wxTreeEvent & event );
- void OnEndLabelEdit( wxTreeEvent & event );
- void OnDeleteItem( wxTreeEvent & event );
- void OnContextMenu( wxContextMenuEvent & event );
- void OnItemMenu( wxTreeEvent & event );
- void OnGetInfo( wxTreeEvent & event );
- void OnSetInfo( wxTreeEvent & event );
- void OnItemExpanded( wxTreeEvent & event );
- void OnItemExpanding( wxTreeEvent & event );
- void OnItemCollapsed( wxTreeEvent & event );
- void OnItemCollapsing( wxTreeEvent & event );
- void OnSelChanged( wxTreeEvent & event );
- void OnSelChanging( wxTreeEvent & event );
- void OnTreeKeyDown( wxTreeEvent & event );
- void OnItemActivated( wxTreeEvent & event );
- void OnItemRClick( wxTreeEvent & event );
- void OnRMouseDown( wxMouseEvent & event );
- void OnRMouseUp( wxMouseEvent & event );
- void OnRMouseDClick( wxMouseEvent & event );
- void OnLMouseDown( wxMouseEvent& event );
- void GetItemsRecursively( const wxTreeItemId & idParent,
- wxTreeItemIdValue cookie = 0 );
- void AddTestItemsToTree( size_t numChildren, size_t depth );
- void ShowMenu( wxTreeItemId id, const wxPoint & pt );
- void DoSortChildren( const wxTreeItemId & item, bool reverse = false )
- {
- m_reverseSort = reverse;
- wxTreeCtrl::SortChildren( item );
- }
- void DoEnsureVisible()
- {
- if ( m_lastItem.IsOk() ) EnsureVisible( m_lastItem );
- }
- int ImageSize( void ) const
- {
- return m_imageSize;
- }
- void SetLastItem( wxTreeItemId id )
- {
- m_lastItem = id;
- }
- protected:
- virtual int OnCompareItems( const wxTreeItemId & i1, const wxTreeItemId & i2 );
- // is this the test item which we use in several event handlers?
- bool IsTestItem( const wxTreeItemId & item )
- {
- // the test item is the first child folder
- return GetItemParent( item ) == GetRootItem() && ! GetPrevSibling( item );
- }
- private:
- void AddItemsRecursively( const wxTreeItemId & idParent,
- size_t nChildren, size_t depth, size_t folder );
- int m_imageSize;// current size of images
- bool m_reverseSort;// flag for OnCompareItems
- wxTreeItemId m_lastItem;// for OnEnsureVisible()
- wxTreeItemId m_draggedItem;// item being dragged right now
- wxImageList* imageList;// 图片,模拟复选框
- int state;
- DECLARE_DYNAMIC_CLASS( CTreeNodeMgr )
- DECLARE_EVENT_TABLE()
- };
二、实现文件
- #include "TreeCtrl.h"
- #define TreeTest_Ctrl 1000
- //--------------------------------------------------------------------------------
- BEGIN_EVENT_TABLE( CTreeNodeMgr, wxTreeCtrl )
- EVT_TREE_BEGIN_LABEL_EDIT( TreeTest_Ctrl, CTreeNodeMgr::OnBeginLabelEdit )// 当用户开始编辑或者刚刚完成编辑子项标签的时候产生
- EVT_TREE_END_LABEL_EDIT( TreeTest_Ctrl, CTreeNodeMgr::OnEndLabelEdit )
- EVT_TREE_DELETE_ITEM( TreeTest_Ctrl, CTreeNodeMgr::OnDeleteItem )// 当某个子项被删除的时候产生
- EVT_TREE_SET_INFO( TreeTest_Ctrl, CTreeNodeMgr::OnSetInfo )// 当某个子项的数据被设置的时候产生
- EVT_TREE_ITEM_EXPANDED( TreeTest_Ctrl, CTreeNodeMgr::OnItemExpanded )
- EVT_TREE_ITEM_EXPANDING( TreeTest_Ctrl, CTreeNodeMgr::OnItemExpanding )
- EVT_TREE_ITEM_COLLAPSED( TreeTest_Ctrl, CTreeNodeMgr::OnItemCollapsed )
- EVT_TREE_ITEM_COLLAPSING( TreeTest_Ctrl, CTreeNodeMgr::OnItemCollapsing )
- EVT_TREE_SEL_CHANGED( TreeTest_Ctrl, CTreeNodeMgr::OnSelChanged )
- EVT_TREE_SEL_CHANGING( TreeTest_Ctrl, CTreeNodeMgr::OnSelChanging )
- EVT_TREE_KEY_DOWN( TreeTest_Ctrl, CTreeNodeMgr::OnTreeKeyDown )
- EVT_TREE_ITEM_ACTIVATED( TreeTest_Ctrl, CTreeNodeMgr::OnItemActivated )
- // so many differents ways to handle right mouse button clicks...
- EVT_CONTEXT_MENU( CTreeNodeMgr::OnContextMenu )
- // EVT_TREE_ITEM_MENU is the preferred event for creating context menus
- // on a tree control, because it includes the point of the click or item,
- // meaning that no additional placement calculations are required.
- EVT_TREE_ITEM_MENU( TreeTest_Ctrl, CTreeNodeMgr::OnItemMenu )
- EVT_TREE_ITEM_RIGHT_CLICK( TreeTest_Ctrl, CTreeNodeMgr::OnItemRClick )
- EVT_RIGHT_DOWN( CTreeNodeMgr::OnRMouseDown )
- EVT_LEFT_DOWN( CTreeNodeMgr::OnLMouseDown )
- EVT_RIGHT_UP( CTreeNodeMgr::OnRMouseUp )
- EVT_RIGHT_DCLICK( CTreeNodeMgr::OnRMouseDClick )
- END_EVENT_TABLE()
- //--------------------------------------------------------------------------------
- IMPLEMENT_DYNAMIC_CLASS( CTreeNodeMgr, wxTreeCtrl )
- //--------------------------------------------------------------------------------
- CTreeNodeMgr::CTreeNodeMgr( wxWindow * parent, const wxWindowID id,
- const wxPoint & pos, const wxSize & size, long style )
- : wxTreeCtrl( parent, id, pos, size, style )
- {
- m_reverseSort = false;
- // 加入复选框图标
- imageList = new wxImageList( 16, 16 );
- imageList->Add( wxIcon( wxT( "Icon_Normal" ) ) );
- imageList->Add( wxIcon( wxT( "Icon_Selected" ) ) );
- imageList->Add( wxIcon( wxT( "Icon_Expanded" ) ) );
- state = 0;
- AssignImageList( imageList );
- int flag = 1;
- // Add some items to the tree
- if ( 0 == flag )
- {
- //wxPoint pt;
- //pt.y = pos.y + 500;
- //pt.x = pos.x;
- wxTreeCtrl* treeCtrl = new wxTreeCtrl( parent, 1002, pos, wxSize( size.GetWidth() - 8, 500 ), wxTR_DEFAULT_STYLE );
- wxTreeItemId rootId = treeCtrl->AddRoot( wxT( "环境参数" ), 0, 0, new CTreeNodeMgrItemData( wxT( "环境参数" ) ) );
- wxTreeItemId itemId1 = treeCtrl->AppendItem( rootId, wxT( "一般属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "一般属性" ) ) );
- wxTreeItemId itemId11 = treeCtrl->AppendItem( itemId1, wxT( "总帧数" ), -1, -1, new CTreeNodeMgrItemData( wxT( "总帧数" ) ) );
- wxTreeItemId itemId12 = treeCtrl->AppendItem( itemId1, wxT( "循环播放" ), -1, -1, new CTreeNodeMgrItemData( wxT( "循环播放" ) ) );
- wxTreeItemId itemId13 = treeCtrl->AppendItem( itemId1, wxT( "循环起始帧" ), -1, -1, new CTreeNodeMgrItemData( wxT( "循环起始帧" ) ) );
- wxTreeItemId itemId14 = treeCtrl->AppendItem( itemId1, wxT( "名称" ), -1, -1, new CTreeNodeMgrItemData( wxT( "名称" ) ) );
- wxTreeItemId itemId2 = treeCtrl->AppendItem( rootId, wxT( "移动路径属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "移动路径属性" ) ) );
- wxTreeItemId itemId21 = treeCtrl->AppendItem( itemId2, wxT( "路径类型" ), -1, -1, new CTreeNodeMgrItemData( wxT( "路径类型" ) ) );
- wxTreeItemId itemId3 = treeCtrl->AppendItem( rootId, wxT( "坐标变换属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "坐标变换属性" ) ) );
- wxTreeItemId itemId31 = treeCtrl->AppendItem( itemId3, wxT( "轴点" ), -1, -1, new CTreeNodeMgrItemData( wxT( "轴点" ) ) );
- wxTreeItemId itemId32 = treeCtrl->AppendItem( itemId3, wxT( "位置" ), -1, -1, new CTreeNodeMgrItemData( wxT( "位置" ) ) );
- wxTreeItemId itemId33 = treeCtrl->AppendItem( itemId3, wxT( "旋转" ), -1, -1, new CTreeNodeMgrItemData( wxT( "旋转" ) ) );
- wxTreeItemId itemId34 = treeCtrl->AppendItem( itemId3, wxT( "缩放" ), -1, -1, new CTreeNodeMgrItemData( wxT( "缩放" ) ) );
- }
- else
- {
- AddTestItemsToTree( 5, 2 );
- }
- }
- //--------------------------------------------------------------------------------
- int CTreeNodeMgr::OnCompareItems(const wxTreeItemId& item1,
- const wxTreeItemId& item2)
- {
- if ( m_reverseSort )
- {
- // just exchange 1st and 2nd items
- return wxTreeCtrl::OnCompareItems(item2, item1);
- }
- else
- {
- return wxTreeCtrl::OnCompareItems(item1, item2);
- }
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::AddItemsRecursively(const wxTreeItemId& idParent,
- size_t numChildren,
- size_t depth,
- size_t folder)
- {
- if ( depth > 0 )
- {
- bool hasChildren = depth > 1;
- wxString str;
- for ( size_t n = 0; n < numChildren; n++ )
- {
- // at depth 1 elements won't have any more children
- if ( hasChildren )
- str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));
- else
- str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));
- wxTreeItemId id /*= AppendItem( idParent, str, -1, -1,
- new CTreeNodeMgrItemData( str ) )*/;
- if ( 1 == depth )
- {
- id = AppendItem( idParent, str, -1, -1,
- new CTreeNodeMgrItemData( 0 ) );
- }
- else
- {
- id = AppendItem( idParent, str, -1, -1,
- new CTreeNodeMgrItemData(str) );
- }
- SetItemImage( id, 0, wxTreeItemIcon_Normal );
- SetItemImage( id, 1, wxTreeItemIcon_Selected );
- SetItemImage( id, 2, wxTreeItemIcon_Expanded );
- // remember the last child for OnEnsureVisible()
- if ( ! hasChildren && n == numChildren - 1 )
- {
- m_lastItem = id;
- }
- AddItemsRecursively( id, numChildren, depth - 1, n + 1 );
- }
- }
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::AddTestItemsToTree( size_t numChildren, size_t depth )
- {
- wxTreeItemId rootId = AddRoot( wxT( "所有物件" ), -1, -1,
- new CTreeNodeMgrItemData( wxT( "Root item" ) ) );
- SetItemImage( rootId, 0, wxTreeItemIcon_Normal );
- SetItemImage( rootId, 1, wxTreeItemIcon_Selected );
- SetItemImage( rootId, 2, wxTreeItemIcon_Expanded );
- AddItemsRecursively( rootId, numChildren, depth, 0 );
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::GetItemsRecursively(const wxTreeItemId& idParent,
- wxTreeItemIdValue cookie)
- {
- wxTreeItemId id;
- if ( !cookie )
- id = GetFirstChild(idParent, cookie);
- else
- id = GetNextChild(idParent, cookie);
- if ( !id.IsOk() )
- return;
- wxString text = GetItemText(id);
- wxLogMessage(text);
- if (ItemHasChildren(id))
- GetItemsRecursively(id);
- GetItemsRecursively(idParent, cookie);
- }
- //--------------------------------------------------------------------------------
- // avoid repetition
- #define TREE_EVENT_HANDLER(name) /
- void CTreeNodeMgr::name(wxTreeEvent& event) /
- { /
- SetLastItem(wxTreeItemId()); /
- event.Skip(); /
- }
- TREE_EVENT_HANDLER( OnDeleteItem )
- TREE_EVENT_HANDLER( OnGetInfo )
- TREE_EVENT_HANDLER( OnSetInfo )
- TREE_EVENT_HANDLER( OnItemExpanded )
- // TREE_EVENT_HANDLER( OnItemExpanding )
- TREE_EVENT_HANDLER( OnItemCollapsed )
- TREE_EVENT_HANDLER( OnSelChanged )
- TREE_EVENT_HANDLER( OnSelChanging )
- #undef TREE_EVENT_HANDLER
- // 树展开事件
- void CTreeNodeMgr::OnItemExpanding( wxTreeEvent& event )
- {
- // 显示一些有关此项目的信息
- wxTreeItemId itemId = event.GetItem();// 取得本项目的Id
- if ( IsTestItem(itemId) )
- {
- wxTreeItemIdValue cookie;
- int i = 19;
- wxTreeItemId itemId_child = GetFirstChild( itemId, cookie );
- CTreeNodeMgrItemData *item = ( CTreeNodeMgrItemData * )GetItemData( itemId_child );// 取得与此项目相关的信息
- if ( !item )
- {
- CTreeNodeMgrItemData *itemdata = new CTreeNodeMgrItemData();
- SetItemData( itemId_child, itemdata);
- while ( itemId_child = GetNextChild( itemId, cookie ) )
- {
- SetItemData( itemId_child, itemdata );
- }
- }
- else
- {
- item->CreateTextCtrl( this,wxID_ANY, _( "" ), wxPoint( 150, 21 ), wxSize( 110, 15 ) );
- while ( itemId_child = GetNextChild( itemId, cookie ) )
- {
- item = (CTreeNodeMgrItemData *)GetItemData( itemId_child );
- item->CreateTextCtrl( this, wxID_ANY, _( "" ), wxPoint( 150, 18 + i ), wxSize( 110, 15 ) );
- i += 18;
- }
- }
- }
- }
- //--------------------------------------------------------------------------------
- // 键盘按下事件
- void CTreeNodeMgr::OnTreeKeyDown( wxTreeEvent & event )
- {
- //LogKeyEvent( wxT( "Tree key down " ), event.GetKeyEvent() );
- //wxString key;
- // long keycode = event.GetKeyCode();
- // {
- // switch ( keycode )
- // {
- // case WXK_RETURN: key = wxT("RETURN"); break;
- // case WXK_ESCAPE: key = wxT("ESCAPE"); break;
- // default:
- // {
- // if ( keycode < 128 && wxIsprint((int)keycode) )
- // key.Printf(wxT("'%c'"), (char)keycode);
- // else if ( keycode > 0 && keycode < 27 )
- // key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);
- // else
- // key.Printf(wxT("unknown (%ld)"), keycode);
- // }
- // }
- // }
- event.Skip();
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnBeginLabelEdit(wxTreeEvent& event)
- {
- // wxLogMessage(wxT("OnBeginLabelEdit"));
- // for testing, prevent this item's label editing
- wxTreeItemId itemId = event.GetItem();
- if ( IsTestItem(itemId) )
- {
- //wxMessageBox(wxT("You can't edit this item."));
- event.Veto();
- }
- else if ( itemId == GetRootItem() )
- {
- // test that it is possible to change the text of the item being edited
- SetItemText(itemId, _T("Editing root item"));
- }
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnEndLabelEdit(wxTreeEvent& event)
- {
- wxLogMessage(wxT("OnEndLabelEdit"));
- // don't allow anything except letters in the labels
- if ( !event.GetLabel().IsWord() )
- {
- // wxMessageBox(wxT("The new label should be a single word."));
- event.Veto();
- }
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnItemCollapsing(wxTreeEvent& event)
- {
- wxTreeItemId itemId = event.GetItem();
- CTreeNodeMgrItemData *item = (CTreeNodeMgrItemData *)GetItemData(itemId);// 取得与此项目相关的信息
- if ( IsTestItem( itemId ) )
- {
- wxTreeItemIdValue cookie;
- wxTreeItemId itemId_child = GetFirstChild( itemId, cookie );
- CTreeNodeMgrItemData *item = ( CTreeNodeMgrItemData * )GetItemData( itemId_child );// 取得与此项目相关的信息
- if ( item->GetTextCtrl() )
- {
- delete item->GetTextCtrl();
- }
- while ( itemId_child = GetNextChild( itemId, cookie ) )
- {
- item = ( CTreeNodeMgrItemData * )GetItemData( itemId_child );
- if ( item->GetTextCtrl() )
- {
- delete item->GetTextCtrl();
- }
- }
- }
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnItemActivated( wxTreeEvent & event )
- {
- wxTreeItemId itemId = event.GetItem();
- CTreeNodeMgrItemData * item = ( CTreeNodeMgrItemData * )GetItemData( itemId );
- if ( item != NULL )
- {
- }
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnItemMenu( wxTreeEvent & event )
- {
- wxTreeItemId itemId = event.GetItem();
- CTreeNodeMgrItemData * item = itemId.IsOk() ?
- ( CTreeNodeMgrItemData * )GetItemData( itemId ) : NULL;
- wxPoint clientpt = event.GetPoint();
- wxPoint screenpt = ClientToScreen( clientpt );
- ShowMenu( itemId, clientpt );
- event.Skip();
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnContextMenu( wxContextMenuEvent & event )
- {
- wxPoint pt = event.GetPosition();
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::ShowMenu( wxTreeItemId id, const wxPoint & pt )
- {
- #if wxUSE_MENUS
- wxMenu menu;
- menu.Append( MENU_ADDNODE_CHILD, wxT( "添加子节点" ) );
- menu.Append( MENU_ADDNODE_SIBLING, wxT( "添加兄弟节点" ) );
- menu.Append( MENU_DELNODE, wxT( "删除该节点" ) );
- PopupMenu( &menu, pt );
- #endif
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnItemRClick( wxTreeEvent & event )
- {
- wxTreeItemId itemId = event.GetItem();
- CTreeNodeMgrItemData * item = itemId.IsOk() ?
- ( CTreeNodeMgrItemData * )GetItemData( itemId ) : NULL;
- event.Skip();
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnRMouseDown( wxMouseEvent & event )
- {
- event.Skip();
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnRMouseUp( wxMouseEvent & event )
- {
- event.Skip();
- }
- //--------------------------------------------------------------------------------
- void CTreeNodeMgr::OnRMouseDClick( wxMouseEvent & event )
- {
- wxTreeItemId id = HitTest( event.GetPosition() );
- if ( ! id )
- {
- //wxLogMessage( wxT( "No item under mouse" ) );
- }
- else
- {
- CTreeNodeMgrItemData * item = ( CTreeNodeMgrItemData * )GetItemData( id );
- if ( item )
- {
- //wxLogMessage( wxT( "Item '%s' under mouse" ), item->GetDesc() );
- }
- }
- event.Skip();
- }
- // 鼠标左键按下
- void CTreeNodeMgr::OnLMouseDown( wxMouseEvent& event )
- {
- wxTreeItemId id = HitTest( event.GetPosition() );
- if ( !id )
- {
- // wxLogMessage( wxT( "No item under mouse" ) );
- }
- else
- {
- CTreeNodeMgrItemData * item = ( CTreeNodeMgrItemData * )GetItemData( id );
- if ( item )
- {
- wxTreeItemIdValue cookie;
- if ( id == GetRootItem() || GetFirstChild( id, cookie ) )
- {// 不是叶子节点
- // wxMessageBox( _("不是叶子节点啦") );
- }
- else
- {// 是叶子节点
- if ( state == 0 )
- {
- SetItemImage( id, 0, wxTreeItemIcon_Normal );
- Update();
- state = 1;
- }
- else
- {
- SetItemImage( id, 1, wxTreeItemIcon_Normal );
- Update();
- state = 0;
- }
- }
- //
- SetItemImage( id, 2, wxTreeItemIcon_Expanded );
- // wxLogMessage( wxT( "Item '%s' under mouse" ), item->GetDesc() );
- }
- }
- event.Skip();
- }
三、调用测试文件
- #include "TreeCtrl.h"
- #include "wx/bookctrl.h"
- // ----------------------------------------------------------------------------
- // private classes
- // ----------------------------------------------------------------------------
- class MyApp : public wxApp
- {
- public:
- virtual bool OnInit();
- };
- class MyFrame : public wxFrame
- {
- public:
- MyFrame(const wxString& title);
- void OnQuit(wxCommandEvent& event);
- void OnAbout(wxCommandEvent& event);
- bool CreateTreeCtrl( wxWindow * parent, const wxPoint & pos, const wxSize & size );
- private:
- DECLARE_EVENT_TABLE()
- };
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // IDs for the controls and the menu commands
- enum
- {
- Minimal_Quit = wxID_EXIT,
- Minimal_About = wxID_ABOUT
- };
- // ----------------------------------------------------------------------------
- // event tables and other macros for wxWidgets
- // ----------------------------------------------------------------------------
- BEGIN_EVENT_TABLE(MyFrame, wxFrame)
- EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
- EVT_MENU(Minimal_About, MyFrame::OnAbout)
- END_EVENT_TABLE()
- IMPLEMENT_APP(MyApp)
- // ============================================================================
- // implementation
- // ============================================================================
- // ----------------------------------------------------------------------------
- // the application class
- // ----------------------------------------------------------------------------
- bool MyApp::OnInit()
- {
- if ( !wxApp::OnInit() )
- return false;
- MyFrame *frame = new MyFrame(_T("TreeCtrl控件测试窗口"));
- frame->Show(true);
- return true;
- }
- // ----------------------------------------------------------------------------
- // main frame
- // ----------------------------------------------------------------------------
- MyFrame::MyFrame(const wxString& title)
- : wxFrame(NULL, wxID_ANY, title)
- {
- SetIcon(wxICON(sample));
- #if wxUSE_MENUS
- // create a menu bar
- wxMenu *fileMenu = new wxMenu;
- // the "About" item should be in the help menu
- wxMenu *helpMenu = new wxMenu;
- helpMenu->Append(Minimal_About, _T("关于(&A).../tF1"), _T("显示关于对话框"));
- fileMenu->Append(Minimal_Quit, _T("退出(&E)/tAlt-X"), _T("退出本程序"));
- // now append the freshly created menu to the menu bar...
- wxMenuBar *menuBar = new wxMenuBar();
- menuBar->Append(fileMenu, _T("文件(&F)"));
- menuBar->Append(helpMenu, _T("帮助(&H)"));
- SetMenuBar(menuBar);
- CreateTreeCtrl( this, wxPoint( 8, 10 ), wxSize( 500, 700 ) );
- #endif // wxUSE_MENUS
- #if wxUSE_STATUSBAR
- // create a status bar just for fun (by default with 1 pane only)
- CreateStatusBar(2);
- SetStatusText(_T("Welcome to wxWidgets!"));
- #endif // wxUSE_STATUSBAR
- }
- // create a tree controller
- bool MyFrame::CreateTreeCtrl( wxWindow * parent, const wxPoint & pos, const wxSize & size )
- {
- wxBookCtrl * mpBook;
- wxPanel * mpPanelObj;
- wxPanel * mpPanelEnv;
- CTreeNodeMgr * mpTreeNodeMgrObj;
- CTreeNodeMgr * mpTreeNodeMgrEnv;
- mpBook = new wxBookCtrl( this, wxID_ANY, wxPoint( 0, 0 ),
- size, wxNO_FULL_REPAINT_ON_RESIZE );
- mpPanelObj = new wxPanel( mpBook);
- mpBook->AddPage( mpPanelObj, wxT( "物件参数" ) );
- mpPanelEnv = new wxPanel( mpBook );
- mpBook->AddPage( mpPanelEnv, wxT( "环境参数" ) );
- wxPoint pt;
- pt.y = pos.y + 500;
- pt.x = pos.x;
- mpTreeNodeMgrEnv = new CTreeNodeMgr( mpPanelEnv, 1000,
- pos, wxSize( size.GetWidth() - 8, 500 ), wxTR_DEFAULT_STYLE );
- mpTreeNodeMgrObj = new CTreeNodeMgr( mpPanelObj, 1001,
- pos, wxSize( size.GetWidth() - 8, 500 ), wxTR_DEFAULT_STYLE );
- wxTreeCtrl* treeCtrl = new wxTreeCtrl( mpPanelEnv, 1002, pt, wxSize( size.GetWidth() - 8, 250 ), wxTR_DEFAULT_STYLE );
- //wxImageList* imageList = new wxImageList( 24, 24 );
- //imageList->Add( wxIcon( wxT( "rootTree" ) ) );
- //imageList->Add( wxIcon( wxT( "childNode" ) ) );
- //treeCtrl->AssignImageList( imageList );
- wxTreeItemId rootId = treeCtrl->AddRoot( wxT( "环境参数" ), 0, 0, new CTreeNodeMgrItemData( wxT( "环境参数" ) ) );
- wxTreeItemId itemId1 = treeCtrl->AppendItem( rootId, wxT( "一般属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "一般属性" ) ) );
- wxTreeItemId itemId11 = treeCtrl->AppendItem( itemId1, wxT( "总帧数" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "100" ), wxPoint( 60, 35 ), 1 ) );
- wxTreeItemId itemId12 = treeCtrl->AppendItem( itemId1, wxT( "循环播放" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "" ), wxPoint( 60, 55 ), 2 ) );
- wxTreeItemId itemId13 = treeCtrl->AppendItem( itemId1, wxT( "循环起始帧" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 75 ), 1 ) ) ;
- wxTreeItemId itemId14 = treeCtrl->AppendItem( itemId1, wxT( "名称" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 95 ), 1 ) ) ;
- wxTreeItemId itemId2 = treeCtrl->AppendItem( rootId, wxT( "移动路径属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "移动路径属性" ) ) );
- wxTreeItemId itemId21 = treeCtrl->AppendItem( itemId2, wxT( "路径类型" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "MT_UNKNOWN" ), wxPoint( 60, 115 ), 2 ) );
- wxTreeItemId itemId22 = treeCtrl->AppendItem( itemId2, wxT( "加速度" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 135 ), 1 ) );
- wxTreeItemId itemId23 = treeCtrl->AppendItem( itemId2, wxT( "角度" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 155 ), 1 ) );
- wxTreeItemId itemId24 = treeCtrl->AppendItem( itemId2, wxT( "终点" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "5,0,0" ), wxPoint( 60, 175 ), 1 ) );
- wxTreeItemId itemId25 = treeCtrl->AppendItem( itemId2, wxT( "弹性系数" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "1" ), wxPoint( 60, 195 ), 1 ) );
- wxTreeItemId itemId26 = treeCtrl->AppendItem( itemId2, wxT( "起点" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "-5,0,0" ), wxPoint( 60, 215 ), 1 ) );
- wxTreeItemId itemId27 = treeCtrl->AppendItem( itemId2, wxT( "速度" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 235 ), 1 ) );
- wxTreeItemId itemId3 = treeCtrl->AppendItem( rootId, wxT( "坐标变换属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "坐标变换属性" ) ) );
- wxTreeItemId itemId31 = treeCtrl->AppendItem( itemId3, wxT( "轴点" ), -1, -1, new CTreeNodeMgrItemData( wxT( "轴点" ) ) );
- wxTreeItemId itemId32 = treeCtrl->AppendItem( itemId3, wxT( "位置" ), -1, -1, new CTreeNodeMgrItemData( wxT( "位置" ) ) );
- wxTreeItemId itemId33 = treeCtrl->AppendItem( itemId3, wxT( "旋转" ), -1, -1, new CTreeNodeMgrItemData( wxT( "旋转" ) ) );
- wxTreeItemId itemId34 = treeCtrl->AppendItem( itemId3, wxT( "缩放" ), -1, -1, new CTreeNodeMgrItemData( wxT( "缩放" ) ) );
- //mpTreeNodeMgrEnvPara = new CTreeNodeMgr( mpPanelEnv, 1002,
- // pt, wxSize( size.GetWidth() - 8, 200 ), wxTR_DEFAULT_STYLE );
- return true;
- }
- // event handlers
- void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
- {
- // true is to force the frame to close
- Close(true);
- }
- void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
- {
- wxMessageBox(wxString::Format(
- _T("Welcome to %s!/n")
- _T("/n")
- _T("This is the minimal wxWidgets sample/n")
- _T("running under %s."),
- wxVERSION_STRING,
- wxGetOsDescription().c_str()
- ),
- _T("About wxWidgets minimal sample"),
- wxOK | wxICON_INFORMATION,
- this);
- }