MFC树控件应用实例

1.         新建一名为“Tree”的对话框(Dialog based)应用程序项目(MFC AppWizard(EXE)),完成后的效果如下:


2.         将原有的一个标签(静态文本框)和两个命令按钮删除,然后往其中添加一个Tree Control,一个List Box,五个Button,完成后的效果如下图:


各控件属性见下表:

序号

属性

内容

备注

1

ID

IDC_TREE_INPUT

Tree Control

2

ID

IDC_LIST_OUTPUT

List Box

3

ID

Caption

IDC_BUTTON_Initialize

初始化&1

Button

4

ID

Caption

IDC_BUTTON_DeleteOne

删除一个&2

Button

5

ID

Caption

IDC_BUTTON_Clear

删除全部&3

Button

6

ID

Caption

IDC_BUTTON_ShowAll

浏览4

Button

7

ID

Caption

DC_BUTTON_Exit

退出&0

Button

3.         给其中的树形控件添加一类型为CTreeCtrl的成员变量m_ctrlTree,给其中的列表框控件添加一类型为CListBox的成员变量m_ctrlList,如下图:


4.         给其中的“初始化”按钮添加如下代码:

void CTreeDlg::OnBUTTONInitialize()

{

       // TODO: Add your control notification handler code here

       //在树控件中添加按钮和连线,添加TVS_HASLINES,TVS_LINESATROOT,TVS_HASBUTTONS风格

       m_ctrlTree.ModifyStyle(0,TVS_LINESATROOT|TVS_HASBUTTONS|TVS_HASLINES);

       m_ctrlTree.DeleteAllItems();

       CString strText=_T("");

       HTREEITEM hRoot=m_ctrlTree.InsertItem(_T("Root"));//插入树根

       for(int i=0;i<4;i++)

       {

              strText.Format(_T("Item%d"),i);

              HTREEITEM hParent=m_ctrlTree.InsertItem(strText,hRoot);//插入第二级内容

              for(int j=0;j<5;j++)

              {

                     strText.Format(_T("SubItem%d%d"),i,j);

                     m_ctrlTree.InsertItem(strText,hParent);//插入第三级内容

              }

       }

}

5.         给其中的“删除一个”按钮添加如下代码:

void CTreeDlg::OnBUTTONDeleteOne()

{

       // TODO: Add your control notification handler code here

       HTREEITEM hSel = m_ctrlTree.GetSelectedItem();

       if(hSel==NULL)//没有选中节点

              return;

       else

              if(m_ctrlTree.ItemHasChildren(hSel))//选中节点有子节点

              {

                     CString strMessage = _T("当前选择的项包含子项,是否删除?");

                     if(MessageBox(strMessage,_T(""),MB_YESNO)== IDYES)

                            m_ctrlTree.DeleteItem(hSel);//删除子树

              }

              else

                     m_ctrlTree.DeleteItem(hSel);//删除单个节点 

}

6.         给其中的“删除全部”按钮添加如下代码:

void CTreeDlg::OnBUTTONClear()

{

       // TODO: Add your control notification handler code here

       m_ctrlTree.DeleteAllItems();//清空树节点

}

7.         给其中的“退出”按钮添加如下代码:

void CTreeDlg::OnBUTTONExit()

{

       // TODO: Add your control notification handler code here

       EndDialog(NULL);

}

8.         找到并打开头文件TreeDlg.h,找到其中的类定义class CTreeDlg : public CDialog,给此类增加一成员函数如下:

       void Search(HTREEITEM hParent,int nOffset)//用于查找的成员函数

       {

              CString strText=_T("");

              HTREEITEM hChild=NULL;

              hChild=m_ctrlTree.GetChildItem(hParent);

              while(hChild!=NULL)

              {

                     strText=m_ctrlTree.GetItemText(hChild);

                     for(int n=0;n<nOffset;n++)

                     {

                            strText.Insert(0,_T(""));

                     }

                     m_ctrlList.AddString(strText);

                     if(m_ctrlTree.ItemHasChildren(hChild))

                     {

                            Search(hChild,nOffset+1);

                     }

                     hChild=m_ctrlTree.GetNextItem(hChild,TVGN_NEXT);

              }

       }

9.         给其中的“浏览”按钮添加如下代码:

void CTreeDlg::OnBUTTONShowAll()

{

       // TODO: Add your control notification handler code here

       m_ctrlList.ResetContent();//清代列表框

       HTREEITEM hRoot=m_ctrlTree.GetRootItem();//获取根节点

       if(hRoot==NULL)//为空树

              return;

       else

       {

              CString strText=m_ctrlTree.GetItemText(hRoot);//获取节点文本

              m_ctrlList.AddString(strText);

              if(m_ctrlTree.ItemHasChildren(hRoot))

                     Search(hRoot,1);

       }

}

10.     运行效果如下列图所示:




树操作的一段代码:

       // TODO: Add extra validation here

       CTreeCtrl * pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE);

       //pTree->SetImageList(&m_imageList,TVSIL_NORMAL);//为该树状控件设置图像列表

       //TVS_HASBUTTONS == 在父项目中显示(+)或(-)。

       //TVS_HASLINES == 在层次中用线条来连接各个项目名称。

       //TVS_LINESATROOT == 在根目录下的项目也用线连接。

       pTree->ModifyStyle(0,TVS_LINESATROOT|TVS_HASBUTTONS|TVS_HASLINES);

       //声明一个结构体,下面是对其所进行的初始化:

       TV_INSERTSTRUCT tvinsert;

       //hParent=父项目的句柄。如果该值为TVI_ROOTvalueNULL,该项目插在树型视图的根部。

       tvinsert.hParent=NULL;

       //hInsertAfter确定插入位置,可以取下面的值:

       //TVI_FIRST 插在列表的头部。

       //TVI_LAST  插在列表的尾部。

       //TVI_SORT  按字母顺序插入。

       tvinsert.hInsertAfter=TVI_SORT;

       //mask用来指定TV_ITEM的哪些成员变量有效。

       //譬如,如果指定了TVIF_TEXT,这意味着pszText成员变量是有效的。可以同时指定几个标志位。

       tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;

       //hItem是树型视图项目的句柄。每一个项目都有它自己的句柄,如果要操作一个项目,就必须选择它的句柄。

       tvinsert.item.hItem=NULL;

       tvinsert.item.state=0;

       tvinsert.item.stateMask=0;

       tvinsert.item.cchTextMax=6;

       //iImageiSelectedImage用来指定图象列表以及一个索引号。

       //这样就知道当项目被选中或没被选中时用哪个图象来表示该项目。

       //像资源管理器中左边窗口中的文件夹等小图表就是有这两个参数来决定的。

       tvinsert.item.iSelectedImage=1;

       tvinsert.item.cChildren=0;

       tvinsert.item.lParam=0;//lParam=指向结构体TV_INSERTSTRUCT的指针;

       //顶层的节点

       tvinsert.item.pszText="Homer";//设置文本

       tvinsert.item.iImage=2;//设置相关的图像列表中的图像

       HTREEITEM hDad=pTree->InsertItem(&tvinsert);//加入到树的节点中

       tvinsert.item.pszText="Marge";

       HTREEITEM hMom=pTree->InsertItem(&tvinsert);

       //第二层的节点--父节点为hDaD

       tvinsert.hParent=hDad;//声明其父节点

       tvinsert.item.pszText="Bart";

       tvinsert.item.iImage=3;

       pTree->InsertItem(&tvinsert);

       tvinsert.item.pszText="Lisa";//只对需要改变的量进行改变就可以

       pTree->InsertItem(&tvinsert);

       //第二层的节点--父节点为hMum

       tvinsert.hParent=hMom;

       tvinsert.item.pszText="Bart";

       tvinsert.item.iImage=4;

       pTree->InsertItem(&tvinsert);

       tvinsert.item.pszText="Lisa";

       pTree->InsertItem(&tvinsert);

       tvinsert.item.pszText="Dilbert";

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值