wxWidgets树形控件的扩展

本文介绍了如何使用wxWidgets库扩展树形控件,并在叶子节点上绑定各种自定义控件,包括文本框、下拉列表框和按钮,实现了灵活的数据绑定与展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

wxWidgets树形控件的扩展

分类: wxWidgets学习笔记 556人阅读 评论(0) 收藏 举报

  

    为树形控件叶子节点添加控件的方法,目前思路:树形控件以层的形式展示信息,通过这两天对wxWidgets控件特别是wxTreeCtrl类的研究可知,如果希望在wxTreeItemId上绑定一些数据,只需要实现自己的wxTreeItemData派生类,然后调用wxTreeCtrl::SetItemData函数以及wxTreeCtrl::GetItemData函数即可。

目前代码如下:(有待继续。。。)

一、头文件说明

 

  1. #include "wx/wx.h"   
  2. #include "wx/treectrl.h"   
  3.   
  4. //--------------------------------------------------------------------------------   
  5. // 声明一个和子项绑定的类,也是实现自定义树形控件的基础   
  6. class CTreeNodeMgrItemData : public wxTreeItemData  
  7. {  
  8. public:  
  9.     CTreeNodeMgrItemData( int flag = 0 )  
  10.     {  
  11.         // 判断用户要绑定的控件,1、2、3分别是文本框、下拉列表框和按钮   
  12.         switch ( flag )  
  13.         {  
  14.         case 1: m_textctrl = new wxTextCtrl(); break;  
  15.         case 2: m_combobox = new wxComboBox(); break;  
  16.         case 3: m_button = new wxButton(); break;  
  17.         case 0: ;  
  18.         default:break;  
  19.         }          
  20.     }  
  21.     CTreeNodeMgrItemData(const wxString& desc) : m_desc(desc) { }  
  22.     CTreeNodeMgrItemData( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, const int flag )  
  23.     {  
  24.         switch ( flag )  
  25.         {  
  26.         case 1:  
  27.             pt.x += 80;  
  28.             pt.y -= 10;  
  29.             m_textctrl = new wxTextCtrl( parent, id, value, pt, wxSize( 120, 18 ) );  
  30.             break;  
  31.         case 2:  
  32.             pt.x += 80;  
  33.             pt.y -= 10;  
  34.             m_combobox = new wxComboBox( parent, id, value, pt, wxSize( 120, 18 ) );  
  35.             break;  
  36.         case 3:  
  37.             pt.x += 80;  
  38.             pt.y -= 10;  
  39.             m_button = new wxButton( parent, id, value, pt, wxSize( 120, 18 ) );  
  40.             break;  
  41.         case 0:;  
  42.         default:break;  
  43.         }  
  44.   
  45.     }  
  46.   
  47.     void CreateTextCtrl( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, wxSize sz )  
  48.     {           
  49.         if ( NULL == m_textctrl )  
  50.         {  
  51.             m_textctrl = new wxTextCtrl();  
  52.             m_textctrl->Create( parent, id, value, pt, sz );  
  53.         }  
  54.         else  
  55.         {  
  56.             m_textctrl = new wxTextCtrl();  
  57.             m_textctrl->Create( parent, id, value, pt, sz );  
  58.         }  
  59.   
  60.     }  
  61.   
  62.     void CreateComboBox( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, wxSize sz )  
  63.     {  
  64.         if ( NULL == m_combobox )  
  65.         {  
  66.             m_combobox = new wxComboBox();  
  67.             m_combobox->Create( parent, id, value, pt, sz );  
  68.         }  
  69.         else  
  70.         {  
  71.             m_combobox = new wxComboBox();  
  72.             m_combobox->Create( parent, id, value, pt, sz );  
  73.         }  
  74.     }  
  75.     void CreateButton( wxWindow* parent, wxWindowID id, const wxString& value, wxPoint pt, wxSize sz )  
  76.     {  
  77.         if ( NULL == m_button )  
  78.         {  
  79.             m_button = new wxButton();  
  80.             m_button->Create( parent, id, value, pt, sz );  
  81.         }  
  82.         else  
  83.         {  
  84.             m_button = new wxButton();  
  85.             m_button->Create( parent, id, value, pt, sz );  
  86.         }  
  87.     }  
  88.     const wxTextCtrl *GetTextCtrl() const { return m_textctrl; }  
  89.     const wxComboBox *GetComboBoxCtrl() const { return m_combobox; }  
  90.     void ShowInfo( wxTreeCtrl *tree );  
  91.     const wxChar *GetDesc() const { return m_desc.c_str(); }  
  92.   
  93. private:  
  94.     wxString m_desc;        // 绑定项是字符串,作为说明之用   
  95.     wxTextCtrl* m_textctrl; // 绑定的文本框控件   
  96.     wxComboBox* m_combobox; // 绑定的下拉类表框控件   
  97.     wxButton* m_button;     // 绑定的按钮控件   
  98. };  
  99.   
  100. //--------------------------------------------------------------------------------   
  101. // 重载wxTreeCtrl类   
  102. class CTreeNodeMgr : public wxTreeCtrl  
  103. {  
  104. public:  
  105.     enum MENU_ITEM_ID  
  106.     {  
  107.         MENU_ADDNODE_CHILD = 1001,  
  108.         MENU_ADDNODE_SIBLING,  
  109.         MENU_DELNODE,  
  110.     };  
  111.   
  112.     CTreeNodeMgr() {}  
  113.   
  114.     CTreeNodeMgr( wxWindow * parent, const wxWindowID id,  
  115.         const wxPoint & pos, const wxSize & size, long style );  
  116.   
  117.     virtual ~CTreeNodeMgr() {  }  
  118.   
  119.     void OnBeginLabelEdit( wxTreeEvent & event );  
  120.   
  121.     void OnEndLabelEdit( wxTreeEvent & event );  
  122.   
  123.     void OnDeleteItem( wxTreeEvent & event );  
  124.   
  125.     void OnContextMenu( wxContextMenuEvent & event );  
  126.   
  127.     void OnItemMenu( wxTreeEvent & event );  
  128.   
  129.     void OnGetInfo( wxTreeEvent & event );  
  130.   
  131.     void OnSetInfo( wxTreeEvent & event );  
  132.   
  133.     void OnItemExpanded( wxTreeEvent & event );  
  134.   
  135.     void OnItemExpanding( wxTreeEvent & event );  
  136.   
  137.     void OnItemCollapsed( wxTreeEvent & event );  
  138.   
  139.     void OnItemCollapsing( wxTreeEvent & event );  
  140.   
  141.     void OnSelChanged( wxTreeEvent & event );  
  142.   
  143.     void OnSelChanging( wxTreeEvent & event );  
  144.   
  145.     void OnTreeKeyDown( wxTreeEvent & event );  
  146.   
  147.     void OnItemActivated( wxTreeEvent & event );  
  148.   
  149.     void OnItemRClick( wxTreeEvent & event );  
  150.   
  151.     void OnRMouseDown( wxMouseEvent & event );  
  152.   
  153.     void OnRMouseUp( wxMouseEvent & event );  
  154.   
  155.     void OnRMouseDClick( wxMouseEvent & event );  
  156.   
  157.     void OnLMouseDown( wxMouseEvent& event );  
  158.   
  159.     void GetItemsRecursively( const wxTreeItemId & idParent,  
  160.         wxTreeItemIdValue cookie = 0 );  
  161.   
  162.     void AddTestItemsToTree( size_t numChildren, size_t depth );  
  163.   
  164.     void ShowMenu( wxTreeItemId id, const wxPoint & pt );  
  165.   
  166.     void DoSortChildren( const wxTreeItemId & item, bool reverse = false )  
  167.     {  
  168.         m_reverseSort = reverse;  
  169.         wxTreeCtrl::SortChildren( item );  
  170.     }  
  171.   
  172.     void DoEnsureVisible()   
  173.     {   
  174.         if ( m_lastItem.IsOk() ) EnsureVisible( m_lastItem );  
  175.     }  
  176.   
  177.     int ImageSize( void ) const   
  178.     {  
  179.         return m_imageSize;  
  180.     }  
  181.   
  182.     void SetLastItem( wxTreeItemId id )   
  183.     {  
  184.         m_lastItem = id;   
  185.     }  
  186.   
  187. protected:  
  188.     virtual int OnCompareItems( const wxTreeItemId & i1, const wxTreeItemId & i2 );  
  189.   
  190.     // is this the test item which we use in several event handlers?   
  191.     bool IsTestItem( const wxTreeItemId & item )  
  192.     {  
  193.         // the test item is the first child folder   
  194.         return GetItemParent( item ) == GetRootItem() && ! GetPrevSibling( item );  
  195.     }  
  196.   
  197. private:  
  198.     void AddItemsRecursively( const wxTreeItemId & idParent,  
  199.         size_t nChildren, size_t depth, size_t folder );  
  200.   
  201.     int          m_imageSize;// current size of images   
  202.     bool         m_reverseSort;// flag for OnCompareItems   
  203.     wxTreeItemId m_lastItem;// for OnEnsureVisible()   
  204.     wxTreeItemId m_draggedItem;// item being dragged right now   
  205.     wxImageList* imageList;// 图片,模拟复选框   
  206.     int          state;  
  207.   
  208.     DECLARE_DYNAMIC_CLASS( CTreeNodeMgr )  
  209.     DECLARE_EVENT_TABLE()  
  210. };  

 二、实现文件

 

  1. #include "TreeCtrl.h"   
  2.   
  3. #define TreeTest_Ctrl 1000   
  4.   
  5. //--------------------------------------------------------------------------------   
  6. BEGIN_EVENT_TABLE( CTreeNodeMgr, wxTreeCtrl )  
  7. EVT_TREE_BEGIN_LABEL_EDIT( TreeTest_Ctrl, CTreeNodeMgr::OnBeginLabelEdit )// 当用户开始编辑或者刚刚完成编辑子项标签的时候产生   
  8. EVT_TREE_END_LABEL_EDIT( TreeTest_Ctrl, CTreeNodeMgr::OnEndLabelEdit )  
  9. EVT_TREE_DELETE_ITEM( TreeTest_Ctrl, CTreeNodeMgr::OnDeleteItem )// 当某个子项被删除的时候产生   
  10. EVT_TREE_SET_INFO( TreeTest_Ctrl, CTreeNodeMgr::OnSetInfo )// 当某个子项的数据被设置的时候产生   
  11. EVT_TREE_ITEM_EXPANDED( TreeTest_Ctrl, CTreeNodeMgr::OnItemExpanded )  
  12. EVT_TREE_ITEM_EXPANDING( TreeTest_Ctrl, CTreeNodeMgr::OnItemExpanding )  
  13. EVT_TREE_ITEM_COLLAPSED( TreeTest_Ctrl, CTreeNodeMgr::OnItemCollapsed )  
  14. EVT_TREE_ITEM_COLLAPSING( TreeTest_Ctrl, CTreeNodeMgr::OnItemCollapsing )  
  15. EVT_TREE_SEL_CHANGED( TreeTest_Ctrl, CTreeNodeMgr::OnSelChanged )  
  16. EVT_TREE_SEL_CHANGING( TreeTest_Ctrl, CTreeNodeMgr::OnSelChanging )  
  17. EVT_TREE_KEY_DOWN( TreeTest_Ctrl, CTreeNodeMgr::OnTreeKeyDown )  
  18. EVT_TREE_ITEM_ACTIVATED( TreeTest_Ctrl, CTreeNodeMgr::OnItemActivated )  
  19. // so many differents ways to handle right mouse button clicks...   
  20. EVT_CONTEXT_MENU( CTreeNodeMgr::OnContextMenu )  
  21. // EVT_TREE_ITEM_MENU is the preferred event for creating context menus   
  22. // on a tree control, because it includes the point of the click or item,   
  23. // meaning that no additional placement calculations are required.   
  24. EVT_TREE_ITEM_MENU( TreeTest_Ctrl, CTreeNodeMgr::OnItemMenu )  
  25. EVT_TREE_ITEM_RIGHT_CLICK( TreeTest_Ctrl, CTreeNodeMgr::OnItemRClick )  
  26. EVT_RIGHT_DOWN( CTreeNodeMgr::OnRMouseDown )  
  27. EVT_LEFT_DOWN( CTreeNodeMgr::OnLMouseDown )  
  28. EVT_RIGHT_UP( CTreeNodeMgr::OnRMouseUp )  
  29. EVT_RIGHT_DCLICK( CTreeNodeMgr::OnRMouseDClick )  
  30. END_EVENT_TABLE()  
  31.   
  32. //--------------------------------------------------------------------------------   
  33. IMPLEMENT_DYNAMIC_CLASS( CTreeNodeMgr, wxTreeCtrl )  
  34.   
  35. //--------------------------------------------------------------------------------   
  36. CTreeNodeMgr::CTreeNodeMgr( wxWindow * parent, const wxWindowID id,  
  37.                            const wxPoint & pos, const wxSize & size, long style )  
  38.                            : wxTreeCtrl( parent, id, pos, size, style )  
  39. {  
  40.     m_reverseSort = false;  
  41.   
  42.     // 加入复选框图标   
  43.     imageList = new wxImageList( 16, 16 );  
  44.     imageList->Add( wxIcon( wxT( "Icon_Normal" ) ) );  
  45.     imageList->Add( wxIcon( wxT( "Icon_Selected" ) ) );  
  46.     imageList->Add( wxIcon( wxT( "Icon_Expanded" ) ) );  
  47.     state = 0;  
  48.   
  49.     AssignImageList( imageList );  
  50.   
  51.     int flag = 1;  
  52.     // Add some items to the tree   
  53.     if ( 0 == flag )  
  54.     {  
  55.         //wxPoint pt;   
  56.         //pt.y = pos.y + 500;   
  57.         //pt.x = pos.x;   
  58.   
  59.         wxTreeCtrl* treeCtrl = new wxTreeCtrl( parent, 1002, pos, wxSize( size.GetWidth() - 8, 500 ), wxTR_DEFAULT_STYLE );  
  60.   
  61.         wxTreeItemId rootId = treeCtrl->AddRoot( wxT( "环境参数" ), 0, 0, new CTreeNodeMgrItemData( wxT( "环境参数" ) ) );  
  62.         wxTreeItemId itemId1 = treeCtrl->AppendItem( rootId, wxT( "一般属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "一般属性" ) ) );  
  63.         wxTreeItemId itemId11 = treeCtrl->AppendItem( itemId1, wxT( "总帧数" ), -1, -1, new CTreeNodeMgrItemData( wxT( "总帧数" ) ) );  
  64.         wxTreeItemId itemId12 = treeCtrl->AppendItem( itemId1, wxT( "循环播放" ), -1, -1, new CTreeNodeMgrItemData( wxT( "循环播放" ) ) );  
  65.         wxTreeItemId itemId13 = treeCtrl->AppendItem( itemId1, wxT( "循环起始帧" ), -1, -1, new CTreeNodeMgrItemData( wxT( "循环起始帧" ) ) );  
  66.         wxTreeItemId itemId14 = treeCtrl->AppendItem( itemId1, wxT( "名称" ), -1, -1, new CTreeNodeMgrItemData( wxT( "名称" ) ) );  
  67.   
  68.         wxTreeItemId itemId2 = treeCtrl->AppendItem( rootId, wxT( "移动路径属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "移动路径属性" ) ) );  
  69.         wxTreeItemId itemId21 = treeCtrl->AppendItem( itemId2, wxT( "路径类型" ), -1, -1, new CTreeNodeMgrItemData( wxT( "路径类型" ) ) );  
  70.   
  71.         wxTreeItemId itemId3 = treeCtrl->AppendItem( rootId, wxT( "坐标变换属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "坐标变换属性" ) ) );  
  72.         wxTreeItemId itemId31 = treeCtrl->AppendItem( itemId3, wxT( "轴点" ), -1, -1, new CTreeNodeMgrItemData( wxT( "轴点" ) ) );  
  73.         wxTreeItemId itemId32 = treeCtrl->AppendItem( itemId3, wxT( "位置" ), -1, -1, new CTreeNodeMgrItemData( wxT( "位置" ) ) );  
  74.         wxTreeItemId itemId33 = treeCtrl->AppendItem( itemId3, wxT( "旋转" ), -1, -1, new CTreeNodeMgrItemData( wxT( "旋转" ) ) );  
  75.         wxTreeItemId itemId34 = treeCtrl->AppendItem( itemId3, wxT( "缩放" ), -1, -1, new CTreeNodeMgrItemData( wxT( "缩放" ) ) );  
  76.     }  
  77.     else  
  78.     {  
  79.         AddTestItemsToTree( 5, 2 );  
  80.     }  
  81. }  
  82.   
  83. //--------------------------------------------------------------------------------   
  84. int CTreeNodeMgr::OnCompareItems(const wxTreeItemId& item1,  
  85.                                  const wxTreeItemId& item2)  
  86. {  
  87.     if ( m_reverseSort )  
  88.     {  
  89.         // just exchange 1st and 2nd items   
  90.         return wxTreeCtrl::OnCompareItems(item2, item1);  
  91.     }  
  92.     else  
  93.     {  
  94.         return wxTreeCtrl::OnCompareItems(item1, item2);  
  95.     }  
  96. }  
  97.   
  98. //--------------------------------------------------------------------------------   
  99. void CTreeNodeMgr::AddItemsRecursively(const wxTreeItemId& idParent,  
  100.                                        size_t numChildren,  
  101.                                        size_t depth,  
  102.                                        size_t folder)  
  103. {  
  104.     if ( depth > 0 )  
  105.     {  
  106.         bool hasChildren = depth > 1;  
  107.   
  108.         wxString str;  
  109.         for ( size_t n = 0; n < numChildren; n++ )  
  110.         {  
  111.             // at depth 1 elements won't have any more children   
  112.             if ( hasChildren )  
  113.                 str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));  
  114.             else  
  115.                 str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));  
  116.   
  117.             wxTreeItemId id /*= AppendItem( idParent, str, -1, -1, 
  118.                             new CTreeNodeMgrItemData( str ) )*/;  
  119.             if ( 1 == depth )  
  120.             {  
  121.                 id = AppendItem( idParent, str, -1, -1,  
  122.                     new CTreeNodeMgrItemData( 0 ) );  
  123.             }  
  124.             else  
  125.             {  
  126.                 id = AppendItem( idParent, str, -1, -1,  
  127.                     new CTreeNodeMgrItemData(str) );  
  128.             }  
  129.             SetItemImage( id, 0, wxTreeItemIcon_Normal );  
  130.             SetItemImage( id, 1, wxTreeItemIcon_Selected );  
  131.             SetItemImage( id, 2, wxTreeItemIcon_Expanded );  
  132.   
  133.             // remember the last child for OnEnsureVisible()   
  134.             if ( ! hasChildren && n == numChildren - 1 )  
  135.             {  
  136.                 m_lastItem = id;  
  137.             }  
  138.   
  139.             AddItemsRecursively( id, numChildren, depth - 1, n + 1 );  
  140.         }  
  141.     }  
  142. }  
  143.   
  144. //--------------------------------------------------------------------------------   
  145. void CTreeNodeMgr::AddTestItemsToTree( size_t numChildren, size_t depth )  
  146. {  
  147.     wxTreeItemId rootId = AddRoot( wxT( "所有物件" ), -1, -1,  
  148.         new CTreeNodeMgrItemData( wxT( "Root item" ) ) );  
  149.     SetItemImage( rootId, 0, wxTreeItemIcon_Normal );  
  150.     SetItemImage( rootId, 1, wxTreeItemIcon_Selected );  
  151.     SetItemImage( rootId, 2, wxTreeItemIcon_Expanded );  
  152.     AddItemsRecursively( rootId, numChildren, depth, 0 );  
  153. }  
  154.   
  155. //--------------------------------------------------------------------------------   
  156. void CTreeNodeMgr::GetItemsRecursively(const wxTreeItemId& idParent,  
  157.                                        wxTreeItemIdValue cookie)  
  158. {  
  159.     wxTreeItemId id;  
  160.   
  161.     if ( !cookie )  
  162.         id = GetFirstChild(idParent, cookie);  
  163.     else  
  164.         id = GetNextChild(idParent, cookie);  
  165.   
  166.     if ( !id.IsOk() )  
  167.         return;  
  168.   
  169.     wxString text = GetItemText(id);  
  170.     wxLogMessage(text);  
  171.   
  172.     if (ItemHasChildren(id))  
  173.         GetItemsRecursively(id);  
  174.   
  175.     GetItemsRecursively(idParent, cookie);  
  176. }  
  177.   
  178. //--------------------------------------------------------------------------------   
  179. // avoid repetition   
  180. #define TREE_EVENT_HANDLER(name)                                 /   
  181.     void CTreeNodeMgr::name(wxTreeEvent& event)                        /  
  182. {                                                                /  
  183.     SetLastItem(wxTreeItemId());                                 /  
  184.     event.Skip();                                                /  
  185. }  
  186.   
  187. TREE_EVENT_HANDLER( OnDeleteItem )  
  188. TREE_EVENT_HANDLER( OnGetInfo )  
  189. TREE_EVENT_HANDLER( OnSetInfo )  
  190. TREE_EVENT_HANDLER( OnItemExpanded )  
  191. // TREE_EVENT_HANDLER( OnItemExpanding )   
  192. TREE_EVENT_HANDLER( OnItemCollapsed )  
  193. TREE_EVENT_HANDLER( OnSelChanged )  
  194. TREE_EVENT_HANDLER( OnSelChanging )  
  195.   
  196. #undef TREE_EVENT_HANDLER   
  197. // 树展开事件   
  198. void CTreeNodeMgr::OnItemExpanding( wxTreeEvent& event )  
  199. {  
  200.   
  201.     // 显示一些有关此项目的信息   
  202.     wxTreeItemId itemId = event.GetItem();// 取得本项目的Id   
  203.     if ( IsTestItem(itemId) )  
  204.     {  
  205.         wxTreeItemIdValue cookie;  
  206.         int i = 19;  
  207.   
  208.         wxTreeItemId itemId_child = GetFirstChild( itemId, cookie );  
  209.         CTreeNodeMgrItemData *item = ( CTreeNodeMgrItemData * )GetItemData( itemId_child );// 取得与此项目相关的信息   
  210.   
  211.   
  212.         if ( !item )  
  213.         {  
  214.             CTreeNodeMgrItemData *itemdata = new CTreeNodeMgrItemData();  
  215.             SetItemData( itemId_child, itemdata);  
  216.             while ( itemId_child = GetNextChild( itemId, cookie ) )  
  217.             {  
  218.                 SetItemData( itemId_child, itemdata );  
  219.             }  
  220.         }  
  221.         else  
  222.         {  
  223.             item->CreateTextCtrl( this,wxID_ANY, _( "" ), wxPoint( 150, 21 ), wxSize( 110, 15 ) );  
  224.             while ( itemId_child = GetNextChild( itemId, cookie ) )  
  225.             {  
  226.                 item = (CTreeNodeMgrItemData *)GetItemData( itemId_child );  
  227.                 item->CreateTextCtrl( this, wxID_ANY, _( "" ), wxPoint( 150, 18 + i ), wxSize( 110, 15 ) );  
  228.                 i += 18;  
  229.             }  
  230.         }  
  231.   
  232.     }  
  233.   
  234. }  
  235. //--------------------------------------------------------------------------------   
  236. // 键盘按下事件   
  237. void CTreeNodeMgr::OnTreeKeyDown( wxTreeEvent & event )  
  238. {  
  239.     //LogKeyEvent( wxT( "Tree key down " ), event.GetKeyEvent() );   
  240.   
  241.     //wxString key;   
  242.     //   long keycode = event.GetKeyCode();   
  243.     //   {   
  244.     //       switch ( keycode )   
  245.     //       {   
  246.     //           case WXK_RETURN: key = wxT("RETURN"); break;   
  247.     //           case WXK_ESCAPE: key = wxT("ESCAPE"); break;   
  248.     //           default:   
  249.     //           {   
  250.     //              if ( keycode < 128 && wxIsprint((int)keycode) )   
  251.     //                  key.Printf(wxT("'%c'"), (char)keycode);   
  252.     //              else if ( keycode > 0 && keycode < 27 )   
  253.     //                  key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);   
  254.     //              else   
  255.     //                  key.Printf(wxT("unknown (%ld)"), keycode);   
  256.     //           }   
  257.     //       }   
  258.     //   }   
  259.   
  260.     event.Skip();  
  261. }  
  262.   
  263. //--------------------------------------------------------------------------------   
  264. void CTreeNodeMgr::OnBeginLabelEdit(wxTreeEvent& event)  
  265. {  
  266.     // wxLogMessage(wxT("OnBeginLabelEdit"));   
  267.   
  268.     // for testing, prevent this item's label editing   
  269.     wxTreeItemId itemId = event.GetItem();  
  270.     if ( IsTestItem(itemId) )  
  271.     {  
  272.         //wxMessageBox(wxT("You can't edit this item."));   
  273.   
  274.         event.Veto();  
  275.     }  
  276.     else if ( itemId == GetRootItem() )  
  277.     {  
  278.         // test that it is possible to change the text of the item being edited   
  279.         SetItemText(itemId, _T("Editing root item"));  
  280.     }  
  281. }  
  282.   
  283. //--------------------------------------------------------------------------------   
  284. void CTreeNodeMgr::OnEndLabelEdit(wxTreeEvent& event)  
  285. {  
  286.     wxLogMessage(wxT("OnEndLabelEdit"));  
  287.   
  288.     // don't allow anything except letters in the labels   
  289.     if ( !event.GetLabel().IsWord() )  
  290.     {  
  291.         // wxMessageBox(wxT("The new label should be a single word."));   
  292.   
  293.         event.Veto();  
  294.     }  
  295. }  
  296.   
  297. //--------------------------------------------------------------------------------   
  298. void CTreeNodeMgr::OnItemCollapsing(wxTreeEvent& event)  
  299. {  
  300.     wxTreeItemId itemId = event.GetItem();  
  301.     CTreeNodeMgrItemData *item = (CTreeNodeMgrItemData *)GetItemData(itemId);// 取得与此项目相关的信息   
  302.     if ( IsTestItem( itemId ) )  
  303.     {  
  304.         wxTreeItemIdValue cookie;  
  305.         wxTreeItemId itemId_child = GetFirstChild( itemId, cookie );  
  306.         CTreeNodeMgrItemData *item = ( CTreeNodeMgrItemData * )GetItemData( itemId_child );// 取得与此项目相关的信息   
  307.         if ( item->GetTextCtrl() )  
  308.         {  
  309.             delete item->GetTextCtrl();   
  310.         }  
  311.   
  312.         while ( itemId_child = GetNextChild( itemId, cookie ) )  
  313.         {  
  314.             item = ( CTreeNodeMgrItemData * )GetItemData( itemId_child );  
  315.             if ( item->GetTextCtrl() )  
  316.             {  
  317.                 delete item->GetTextCtrl();   
  318.             }  
  319.         }  
  320.   
  321.     }  
  322. }  
  323.   
  324. //--------------------------------------------------------------------------------   
  325. void CTreeNodeMgr::OnItemActivated( wxTreeEvent & event )  
  326. {  
  327.     wxTreeItemId itemId = event.GetItem();  
  328.     CTreeNodeMgrItemData * item = ( CTreeNodeMgrItemData * )GetItemData( itemId );  
  329.     if ( item != NULL )  
  330.     {  
  331.     }  
  332. }  
  333.   
  334. //--------------------------------------------------------------------------------   
  335. void CTreeNodeMgr::OnItemMenu( wxTreeEvent & event )  
  336. {  
  337.     wxTreeItemId itemId = event.GetItem();  
  338.     CTreeNodeMgrItemData * item = itemId.IsOk() ?   
  339.         ( CTreeNodeMgrItemData * )GetItemData( itemId ) : NULL;  
  340.     wxPoint clientpt = event.GetPoint();  
  341.     wxPoint screenpt = ClientToScreen( clientpt );  
  342.     ShowMenu( itemId, clientpt );  
  343.     event.Skip();  
  344. }  
  345.   
  346. //--------------------------------------------------------------------------------   
  347. void CTreeNodeMgr::OnContextMenu( wxContextMenuEvent & event )  
  348. {  
  349.     wxPoint pt = event.GetPosition();  
  350. }  
  351.   
  352. //--------------------------------------------------------------------------------   
  353. void CTreeNodeMgr::ShowMenu( wxTreeItemId id, const wxPoint & pt )  
  354. {  
  355. #if wxUSE_MENUS   
  356.     wxMenu menu;  
  357.     menu.Append( MENU_ADDNODE_CHILD, wxT( "添加子节点" ) );  
  358.     menu.Append( MENU_ADDNODE_SIBLING, wxT( "添加兄弟节点" ) );  
  359.     menu.Append( MENU_DELNODE, wxT( "删除该节点" ) );  
  360.     PopupMenu( &menu, pt );  
  361. #endif   
  362. }  
  363.   
  364. //--------------------------------------------------------------------------------   
  365. void CTreeNodeMgr::OnItemRClick( wxTreeEvent & event )  
  366. {  
  367.     wxTreeItemId itemId = event.GetItem();  
  368.     CTreeNodeMgrItemData * item = itemId.IsOk() ?   
  369.         ( CTreeNodeMgrItemData * )GetItemData( itemId ) : NULL;  
  370.   
  371.     event.Skip();  
  372. }  
  373.   
  374. //--------------------------------------------------------------------------------   
  375. void CTreeNodeMgr::OnRMouseDown( wxMouseEvent & event )  
  376. {  
  377.     event.Skip();  
  378. }  
  379.   
  380. //--------------------------------------------------------------------------------   
  381. void CTreeNodeMgr::OnRMouseUp( wxMouseEvent & event )  
  382. {  
  383.     event.Skip();  
  384. }  
  385.   
  386. //--------------------------------------------------------------------------------   
  387. void CTreeNodeMgr::OnRMouseDClick( wxMouseEvent & event )  
  388. {  
  389.     wxTreeItemId id = HitTest( event.GetPosition() );  
  390.     if ( ! id )   
  391.     {  
  392.         //wxLogMessage( wxT( "No item under mouse" ) );   
  393.     }  
  394.     else  
  395.     {  
  396.         CTreeNodeMgrItemData * item = ( CTreeNodeMgrItemData * )GetItemData( id );  
  397.         if ( item )  
  398.         {  
  399.             //wxLogMessage( wxT( "Item '%s' under mouse" ), item->GetDesc() );   
  400.         }  
  401.     }  
  402.   
  403.     event.Skip();  
  404. }  
  405.   
  406. // 鼠标左键按下   
  407. void CTreeNodeMgr::OnLMouseDown( wxMouseEvent& event )  
  408. {  
  409.     wxTreeItemId id = HitTest( event.GetPosition() );  
  410.     if ( !id )   
  411.     {  
  412.         // wxLogMessage( wxT( "No item under mouse" ) );   
  413.     }  
  414.     else  
  415.     {  
  416.         CTreeNodeMgrItemData * item = ( CTreeNodeMgrItemData * )GetItemData( id );  
  417.         if ( item )  
  418.         {  
  419.             wxTreeItemIdValue cookie;  
  420.             if ( id == GetRootItem() || GetFirstChild( id, cookie ) )  
  421.             {// 不是叶子节点   
  422.                 // wxMessageBox( _("不是叶子节点啦") );   
  423.             }  
  424.             else  
  425.             {// 是叶子节点   
  426.                 if ( state == 0 )  
  427.                 {              
  428.                     SetItemImage( id, 0, wxTreeItemIcon_Normal );  
  429.                     Update();  
  430.                     state = 1;  
  431.                 }  
  432.                 else  
  433.                 {  
  434.                     SetItemImage( id, 1, wxTreeItemIcon_Normal );  
  435.                     Update();  
  436.   
  437.                     state = 0;  
  438.                 }  
  439.             }  
  440.   
  441.             //   
  442.             SetItemImage( id, 2, wxTreeItemIcon_Expanded );  
  443.             // wxLogMessage( wxT( "Item '%s' under mouse" ), item->GetDesc() );   
  444.         }  
  445.     }  
  446.   
  447.     event.Skip();  
  448. }  

三、调用测试文件

  1. #include "TreeCtrl.h"   
  2. #include "wx/bookctrl.h"   
  3.   
  4. // ----------------------------------------------------------------------------   
  5. // private classes   
  6. // ----------------------------------------------------------------------------   
  7.   
  8. class MyApp : public wxApp  
  9. {  
  10. public:  
  11.     virtual bool OnInit();  
  12. };  
  13.   
  14.   
  15. class MyFrame : public wxFrame  
  16. {  
  17. public:  
  18.   
  19.     MyFrame(const wxString& title);  
  20.   
  21.   
  22.     void OnQuit(wxCommandEvent& event);  
  23.     void OnAbout(wxCommandEvent& event);  
  24.     bool CreateTreeCtrl( wxWindow * parent, const wxPoint & pos, const wxSize & size );  
  25.   
  26. private:  
  27.   
  28.     DECLARE_EVENT_TABLE()  
  29. };  
  30.   
  31. // ----------------------------------------------------------------------------   
  32. // constants   
  33. // ----------------------------------------------------------------------------   
  34.   
  35. // IDs for the controls and the menu commands   
  36. enum  
  37. {  
  38.     Minimal_Quit = wxID_EXIT,  
  39.     Minimal_About = wxID_ABOUT  
  40. };  
  41.   
  42. // ----------------------------------------------------------------------------   
  43. // event tables and other macros for wxWidgets   
  44. // ----------------------------------------------------------------------------   
  45.   
  46. BEGIN_EVENT_TABLE(MyFrame, wxFrame)  
  47. EVT_MENU(Minimal_Quit,  MyFrame::OnQuit)  
  48. EVT_MENU(Minimal_About, MyFrame::OnAbout)  
  49. END_EVENT_TABLE()  
  50.   
  51. IMPLEMENT_APP(MyApp)  
  52.   
  53. // ============================================================================   
  54. // implementation   
  55. // ============================================================================   
  56.   
  57. // ----------------------------------------------------------------------------   
  58. // the application class   
  59. // ----------------------------------------------------------------------------   
  60.   
  61. bool MyApp::OnInit()  
  62. {  
  63.     if ( !wxApp::OnInit() )  
  64.         return false;  
  65.   
  66.     MyFrame *frame = new MyFrame(_T("TreeCtrl控件测试窗口"));  
  67.     frame->Show(true);  
  68.   
  69.     return true;  
  70. }  
  71.   
  72. // ----------------------------------------------------------------------------   
  73. // main frame   
  74. // ----------------------------------------------------------------------------   
  75.   
  76. MyFrame::MyFrame(const wxString& title)  
  77. : wxFrame(NULL, wxID_ANY, title)  
  78. {  
  79.     SetIcon(wxICON(sample));  
  80.   
  81. #if wxUSE_MENUS   
  82.     // create a menu bar   
  83.     wxMenu *fileMenu = new wxMenu;  
  84.   
  85.     // the "About" item should be in the help menu   
  86.     wxMenu *helpMenu = new wxMenu;  
  87.     helpMenu->Append(Minimal_About, _T("关于(&A).../tF1"), _T("显示关于对话框"));  
  88.   
  89.     fileMenu->Append(Minimal_Quit, _T("退出(&E)/tAlt-X"), _T("退出本程序"));  
  90.   
  91.     // now append the freshly created menu to the menu bar...   
  92.     wxMenuBar *menuBar = new wxMenuBar();  
  93.     menuBar->Append(fileMenu, _T("文件(&F)"));  
  94.     menuBar->Append(helpMenu, _T("帮助(&H)"));  
  95.   
  96.     SetMenuBar(menuBar);  
  97.     CreateTreeCtrl( this, wxPoint( 8, 10 ), wxSize( 500, 700 ) );  
  98. #endif // wxUSE_MENUS   
  99.   
  100. #if wxUSE_STATUSBAR   
  101.     // create a status bar just for fun (by default with 1 pane only)   
  102.     CreateStatusBar(2);  
  103.     SetStatusText(_T("Welcome to wxWidgets!"));  
  104. #endif // wxUSE_STATUSBAR   
  105. }  
  106.   
  107. // create a tree controller   
  108. bool MyFrame::CreateTreeCtrl( wxWindow * parent, const wxPoint & pos, const wxSize & size )  
  109. {  
  110.     wxBookCtrl * mpBook;  
  111.     wxPanel * mpPanelObj;  
  112.     wxPanel * mpPanelEnv;  
  113.     CTreeNodeMgr * mpTreeNodeMgrObj;  
  114.     CTreeNodeMgr * mpTreeNodeMgrEnv;  
  115.   
  116.     mpBook = new wxBookCtrl( this, wxID_ANY, wxPoint( 0, 0 ),   
  117.         size, wxNO_FULL_REPAINT_ON_RESIZE );  
  118.   
  119.     mpPanelObj = new wxPanel( mpBook);  
  120.     mpBook->AddPage( mpPanelObj, wxT( "物件参数" ) );  
  121.   
  122.     mpPanelEnv = new wxPanel( mpBook );  
  123.     mpBook->AddPage( mpPanelEnv, wxT( "环境参数" ) );  
  124.   
  125.     wxPoint pt;  
  126.     pt.y = pos.y + 500;  
  127.     pt.x = pos.x;  
  128.   
  129.     mpTreeNodeMgrEnv = new CTreeNodeMgr( mpPanelEnv, 1000,  
  130.         pos, wxSize( size.GetWidth() - 8, 500 ), wxTR_DEFAULT_STYLE );  
  131.     mpTreeNodeMgrObj = new CTreeNodeMgr( mpPanelObj, 1001,  
  132.         pos, wxSize( size.GetWidth() - 8, 500 ), wxTR_DEFAULT_STYLE );  
  133.   
  134.     wxTreeCtrl* treeCtrl = new wxTreeCtrl( mpPanelEnv, 1002, pt, wxSize( size.GetWidth() - 8, 250 ), wxTR_DEFAULT_STYLE );  
  135.   
  136.     //wxImageList* imageList = new wxImageList( 24, 24 );   
  137.     //imageList->Add( wxIcon( wxT( "rootTree" ) ) );   
  138.     //imageList->Add( wxIcon( wxT( "childNode" ) ) );   
  139.     //treeCtrl->AssignImageList( imageList );   
  140.   
  141.     wxTreeItemId rootId = treeCtrl->AddRoot( wxT( "环境参数" ), 0, 0, new CTreeNodeMgrItemData( wxT( "环境参数" ) ) );  
  142.     wxTreeItemId itemId1 = treeCtrl->AppendItem( rootId, wxT( "一般属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "一般属性" ) ) );  
  143.     wxTreeItemId itemId11 = treeCtrl->AppendItem( itemId1, wxT( "总帧数" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "100" ), wxPoint( 60, 35 ), 1 ) );  
  144.     wxTreeItemId itemId12 = treeCtrl->AppendItem( itemId1, wxT( "循环播放" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "" ), wxPoint( 60, 55 ), 2 ) );  
  145.     wxTreeItemId itemId13 = treeCtrl->AppendItem( itemId1, wxT( "循环起始帧" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 75 ), 1 ) ) ;  
  146.     wxTreeItemId itemId14 = treeCtrl->AppendItem( itemId1, wxT( "名称" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 95 ), 1 ) ) ;  
  147.   
  148.     wxTreeItemId itemId2 = treeCtrl->AppendItem( rootId, wxT( "移动路径属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "移动路径属性" ) ) );  
  149.     wxTreeItemId itemId21 = treeCtrl->AppendItem( itemId2, wxT( "路径类型" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "MT_UNKNOWN" ), wxPoint( 60, 115 ), 2 ) );  
  150.     wxTreeItemId itemId22 = treeCtrl->AppendItem( itemId2, wxT( "加速度" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 135 ), 1 ) );  
  151.     wxTreeItemId itemId23 = treeCtrl->AppendItem( itemId2, wxT( "角度" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 155 ), 1 ) );  
  152.     wxTreeItemId itemId24 = treeCtrl->AppendItem( itemId2, wxT( "终点" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "5,0,0" ), wxPoint( 60, 175 ), 1 ) );  
  153.     wxTreeItemId itemId25 = treeCtrl->AppendItem( itemId2, wxT( "弹性系数" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "1" ), wxPoint( 60, 195 ), 1 ) );  
  154.     wxTreeItemId itemId26 = treeCtrl->AppendItem( itemId2, wxT( "起点" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "-5,0,0" ), wxPoint( 60, 215 ), 1 ) );  
  155.     wxTreeItemId itemId27 = treeCtrl->AppendItem( itemId2, wxT( "速度" ), -1, -1, new CTreeNodeMgrItemData( treeCtrl, wxID_ANY, wxT( "0" ), wxPoint( 60, 235 ), 1 ) );  
  156.   
  157.     wxTreeItemId itemId3 = treeCtrl->AppendItem( rootId, wxT( "坐标变换属性" ), -1, -1, new CTreeNodeMgrItemData( wxT( "坐标变换属性" ) ) );  
  158.     wxTreeItemId itemId31 = treeCtrl->AppendItem( itemId3, wxT( "轴点" ), -1, -1, new CTreeNodeMgrItemData( wxT( "轴点" ) ) );  
  159.     wxTreeItemId itemId32 = treeCtrl->AppendItem( itemId3, wxT( "位置" ), -1, -1, new CTreeNodeMgrItemData( wxT( "位置" ) ) );  
  160.     wxTreeItemId itemId33 = treeCtrl->AppendItem( itemId3, wxT( "旋转" ), -1, -1, new CTreeNodeMgrItemData( wxT( "旋转" ) ) );  
  161.     wxTreeItemId itemId34 = treeCtrl->AppendItem( itemId3, wxT( "缩放" ), -1, -1, new CTreeNodeMgrItemData( wxT( "缩放" ) ) );  
  162.   
  163.     //mpTreeNodeMgrEnvPara = new CTreeNodeMgr( mpPanelEnv, 1002,   
  164.     //    pt, wxSize( size.GetWidth() - 8, 200 ), wxTR_DEFAULT_STYLE );   
  165.   
  166.     return true;  
  167. }  
  168.   
  169. // event handlers   
  170.   
  171. void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))  
  172. {  
  173.     // true is to force the frame to close   
  174.     Close(true);  
  175. }  
  176.   
  177. void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))  
  178. {  
  179.     wxMessageBox(wxString::Format(  
  180.         _T("Welcome to %s!/n")  
  181.         _T("/n")  
  182.         _T("This is the minimal wxWidgets sample/n")  
  183.         _T("running under %s."),  
  184.         wxVERSION_STRING,  
  185.         wxGetOsDescription().c_str()  
  186.         ),  
  187.         _T("About wxWidgets minimal sample"),  
  188.         wxOK | wxICON_INFORMATION,  
  189.         this);  
  190. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值