您的位置:首页 > 其它

MFC树控件应用实例

2010-08-13 10:04 316 查看
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_ROOTvalue或NULL,该项目插在树型视图的根部。
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;
//iImage和iSelectedImage用来指定图象列表以及一个索引号。
//这样就知道当项目被选中或没被选中时用哪个图象来表示该项目。
//像资源管理器中左边窗口中的文件夹等小图表就是有这两个参数来决定的。
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";
HTREEITEM hOther=pTree->InsertItem(&tvinsert);
//第三层节点--父节点为hOrher
tvinsert.hParent=hOther;
tvinsert.item.pszText="Dogbert";
tvinsert.item.iImage=7;
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText="Ratbert";
pTree->InsertItem(&tvinsert);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: