vc6.0下简单使用CTreeCtrl (转自http://www.cnblogs.com/sunnyjones/)
2007-10-14 21:55
399 查看
今天简单的学了下CTreeCtrl,新建一个基于单文档的MFC工程,在resource的IDD_DIALOG1里添加一个tree control,将其styles勾上has buttons,has lines,lines at root,通过classWizard添加一个继承于CDialog的类CExDialog,添加私有成员变量CImageList m_imageList,然后就在OnInitDialog()函数里添加树控件的细节:
BOOL CExDialog::OnInitDialog()
{
CDialog::OnInitDialog();
HICON hlcon[8];
m_imageList.Create( 16, 16, 0, 8, 8 );
hlcon[0] = AfxGetApp()->LoadIcon( IDI_ICON1 );
hlcon[1] = AfxGetApp()->LoadIcon( IDI_ICON2 );
hlcon[2] = AfxGetApp()->LoadIcon( IDI_ICON3 );
hlcon[3] = AfxGetApp()->LoadIcon( IDI_ICON4 );
hlcon[4] = AfxGetApp()->LoadIcon( IDI_ICON5 );
hlcon[5] = AfxGetApp()->LoadIcon( IDI_ICON6 );
hlcon[6] = AfxGetApp()->LoadIcon( IDI_ICON7 );
hlcon[7] = AfxGetApp()->LoadIcon( IDI_ICON8 );
for ( int n = 0; n < 8; n ++ )
{
m_imageList.Add( hlcon
);
}
CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem( IDC_TREEVIEW1 );
pTree->SetImageList( &m_imageList, TVSIL_NORMAL );
TV_INSERTSTRUCT tvinsert;
tvinsert.hParent = NULL;
tvinsert.hInsertAfter = TVI_LAST;
tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvinsert.item.hItem = NULL;
tvinsert.item.state = 0;
tvinsert.item.stateMask = 0;
tvinsert.item.cchTextMax = 6;
tvinsert.item.iSelectedImage = 1;
tvinsert.item.cChildren = 0;
tvinsert.item.lParam = 0;
tvinsert.item.iImage = 0;
/**///////////////////////////////////////////////////////////////////////////
tvinsert.item.pszText = "HOMER";
HTREEITEM hDad = pTree->InsertItem( &tvinsert );
/**///////////////////////////////////////////////////////////////////////////
tvinsert.item.pszText = "Marge";
HTREEITEM hMom = pTree->InsertItem( &tvinsert );
tvinsert.hParent = hDad;
tvinsert.item.pszText = "Bart";
tvinsert.item.iImage = 3;
pTree->InsertItem( &tvinsert );
tvinsert.hParent = hMom;
tvinsert.item.pszText = "Lisa";
tvinsert.item.iImage = 6;
pTree->InsertItem( &tvinsert );
tvinsert.item.pszText = "Dilbart";
HTREEITEM hOther = pTree->InsertItem( &tvinsert );
tvinsert.hParent = hOther;
tvinsert.item.pszText = "Dogbert";
tvinsert.item.iImage = 7;
pTree->InsertItem( &tvinsert );
tvinsert.item.pszText = "Ratbert";
pTree->InsertItem( &tvinsert );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
这样就建立了两个父节点,HOMER和Marge,tvinsert.item.iSelectedImage 设置了当选中这项时显示什么图标,tvinsert.item.iImage设置了当没有选中时显示的图标,tvinsert.item.pszText设置显示出来的文本。如果没有对tvinsert.hParent进行更改设置,那么新添加的节点和上一个节点的父节点为同一节点。
下面这段代码实现了选中某一项进行的更改操作:
void CExDialog::OnSelchangedTreeview1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem(IDC_TREEVIEW1);
HTREEITEM hSelected = pNMTreeView->itemNew.hItem;
if ( hSelected != NULL )
{
char text[31];
TV_ITEM item;
item.mask = TVIF_HANDLE | TVIF_TEXT;
item.hItem = hSelected;
item.pszText = text;
item.cchTextMax = 30;
VERIFY( pTree->GetItem(&item) );
SetDlgItemText( IDC_TREEVIEW1, text );
}
*pResult = 0;
}
有了这些代码还是不够的,如果想显示的话,我们要把这个头文件加入到TreeTestView.cpp里,添加OnLButtonDown事件,并添加一段代码:
CExDialog dlg;
dlg.DoModal();
ok,这样编译运行下,点击鼠标左键,就会出现一个树状控件,呵呵,简单吧。。。
这些只是实现了静态添加树节点。以后还要深入的学习!
BOOL CExDialog::OnInitDialog()
{
CDialog::OnInitDialog();
HICON hlcon[8];
m_imageList.Create( 16, 16, 0, 8, 8 );
hlcon[0] = AfxGetApp()->LoadIcon( IDI_ICON1 );
hlcon[1] = AfxGetApp()->LoadIcon( IDI_ICON2 );
hlcon[2] = AfxGetApp()->LoadIcon( IDI_ICON3 );
hlcon[3] = AfxGetApp()->LoadIcon( IDI_ICON4 );
hlcon[4] = AfxGetApp()->LoadIcon( IDI_ICON5 );
hlcon[5] = AfxGetApp()->LoadIcon( IDI_ICON6 );
hlcon[6] = AfxGetApp()->LoadIcon( IDI_ICON7 );
hlcon[7] = AfxGetApp()->LoadIcon( IDI_ICON8 );
for ( int n = 0; n < 8; n ++ )
{
m_imageList.Add( hlcon
);
}
CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem( IDC_TREEVIEW1 );
pTree->SetImageList( &m_imageList, TVSIL_NORMAL );
TV_INSERTSTRUCT tvinsert;
tvinsert.hParent = NULL;
tvinsert.hInsertAfter = TVI_LAST;
tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvinsert.item.hItem = NULL;
tvinsert.item.state = 0;
tvinsert.item.stateMask = 0;
tvinsert.item.cchTextMax = 6;
tvinsert.item.iSelectedImage = 1;
tvinsert.item.cChildren = 0;
tvinsert.item.lParam = 0;
tvinsert.item.iImage = 0;
/**///////////////////////////////////////////////////////////////////////////
tvinsert.item.pszText = "HOMER";
HTREEITEM hDad = pTree->InsertItem( &tvinsert );
/**///////////////////////////////////////////////////////////////////////////
tvinsert.item.pszText = "Marge";
HTREEITEM hMom = pTree->InsertItem( &tvinsert );
tvinsert.hParent = hDad;
tvinsert.item.pszText = "Bart";
tvinsert.item.iImage = 3;
pTree->InsertItem( &tvinsert );
tvinsert.hParent = hMom;
tvinsert.item.pszText = "Lisa";
tvinsert.item.iImage = 6;
pTree->InsertItem( &tvinsert );
tvinsert.item.pszText = "Dilbart";
HTREEITEM hOther = pTree->InsertItem( &tvinsert );
tvinsert.hParent = hOther;
tvinsert.item.pszText = "Dogbert";
tvinsert.item.iImage = 7;
pTree->InsertItem( &tvinsert );
tvinsert.item.pszText = "Ratbert";
pTree->InsertItem( &tvinsert );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
这样就建立了两个父节点,HOMER和Marge,tvinsert.item.iSelectedImage 设置了当选中这项时显示什么图标,tvinsert.item.iImage设置了当没有选中时显示的图标,tvinsert.item.pszText设置显示出来的文本。如果没有对tvinsert.hParent进行更改设置,那么新添加的节点和上一个节点的父节点为同一节点。
下面这段代码实现了选中某一项进行的更改操作:
void CExDialog::OnSelchangedTreeview1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem(IDC_TREEVIEW1);
HTREEITEM hSelected = pNMTreeView->itemNew.hItem;
if ( hSelected != NULL )
{
char text[31];
TV_ITEM item;
item.mask = TVIF_HANDLE | TVIF_TEXT;
item.hItem = hSelected;
item.pszText = text;
item.cchTextMax = 30;
VERIFY( pTree->GetItem(&item) );
SetDlgItemText( IDC_TREEVIEW1, text );
}
*pResult = 0;
}
有了这些代码还是不够的,如果想显示的话,我们要把这个头文件加入到TreeTestView.cpp里,添加OnLButtonDown事件,并添加一段代码:
CExDialog dlg;
dlg.DoModal();
ok,这样编译运行下,点击鼠标左键,就会出现一个树状控件,呵呵,简单吧。。。
这些只是实现了静态添加树节点。以后还要深入的学习!
相关文章推荐
- XDocReport 的简单使用 操作word 替换变量,动态图片,指定操作指令(程序)扩展(转自:http://www.cnblogs.com/fish-in-sky/p/4973237.html)
- LPCTSTR(http://www.cnblogs.com/sunnyjones/archive/2009/02/24/1397538.html)
- C#使用命令行方式实现Ping简单功能 http://www.cnblogs.com/kevinton/archive/2007/06/28/798581.html
- 关于ResolveClientUrl和ResolveUrl的使用 问题 (http://www.cnblogs.com/borllor/archive/2008/02/25/1081037.html)
- Log4Net使用指南 (转自 http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html)
- 用Javascript进行简单的Table点击排序. 【转:http://www.cnblogs.com/robot/archive/2008/08/21/1161801.html】
- 转载TortoiseSVN的使用详解3(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- 的使用(转自http://www.cnblogs.com/esshs)
- 使用反射和特性构造自己的ORM框架 转载自:http://www.cnblogs.com/xdesigner/archive/2008/06/24/1228702.html
- 我设计的简单事务控制 (转贴自:http://www.cnblogs.com/dannyr)
- 使用XMLHTTP Request Object获取服务器数据 (转http://www.cnblogs.com/birdshome/archive/2004/12/26/82238.html)
- 转载TortoiseSVN的使用详解3(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- SQL优化--使用分析函数(转自:http://www.cnblogs.com/zping/archive/2008/08/06/1261973.html)
- 使用ContactsContract APIhttp://www.cnblogs.com/carbs/archive/2012/07/16/2593295.html
- eclipse中安装ADT插件的最简单的方法转载自http://www.cnblogs.com/go-onxp/archive/2012/05/22/android.html
- JavaWeb学习总结(二)——Tomcat服务器学习和使用(一) http://www.cnblogs.com/xdp-gacl/p/3734395.html
- Microsoft.ApplicationBlocks使用心得(转贴自:http://www.cnblogs.com/dannyr)
- 如何正确使用事件探察器解决性能问题(http://www.cnblogs.com/tom-fu/archive/2008/06/25/1146934.html#1235440)
- GDB 下 watch的使用http://www.cnblogs.com/lonelycatcher/archive/2011/10/09/2204865.html
- 在Asp.net MVC中使用Asp.net Ajax --转载http://www.cnblogs.com/Nimeux/archive/2008/08/17/1269907.html