当前位置: 首页 > 图文教程 > 开发语言 > VC++ > VC控件 TreeCtrl 与 ListCtrl 演示

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 VC控件 TreeCtrl 与 ListCtrl 演示


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 106 ::
收藏到网摘: n/a

VC控件 TreeCtrl 与 ListCtrl 演示


作者:兰州大学现物系 王景生

下载源代码


这个例子类似于 Windows 的资源管理器,程序运行界面如图一所示:


图一

主要用到的类有:
CListCtrl,CTreeCtrl,CImageList,CFileFind 和函数SHGetFileInfo()

简述步骤如下:
1、增加 TreeCtrl 的 TVS_HASBUTTONS,TVS_HASLINES、TVS_LINESATROOT Style,代码如下:

 DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE); dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle);
2、为TreeCtrl添加Root项:
 m_hRoot = m_tree.InsertItem("我的电脑"); InsertItem()的函数原形为 HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST ); 
3、获取本地逻辑驱动器,并添加:
 void CTreeViewDlg::GetLogicalDrives(HTREEITEM hParent) { size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL);	char *pDriveStrings = new char[szAllDriveStrings + sizeof(_T(""))];	GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);	size_t szDriveString = strlen(pDriveStrings);	while(szDriveString > 0)	{	m_tree.InsertItem(pDriveStrings,hParent);	pDriveStrings += szDriveString + 1;	szDriveString = strlen(pDriveStrings);	} } 
4、添加TVN_EXPANDED消息处理函数,当一项展开时,为其子项添加下一级目录:
 void CTreeViewDlg::OnItemexpandedTree(NMHDR* pNMHDR, LRESULT* pResult) {	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;	// TODO: Add your control notification handler code here	TVITEM item = pNMTreeView->itemNew;	if(item.hItem == m_hRoot)	return; HTREEITEM hChild = m_tree.GetChildItem(item.hItem);	while(hChild)	{	AddSubDir(hChild);	hChild = m_tree.GetNextItem(hChild,TVGN_NEXT);	}	*pResult = 0; } 
AddSubDir函数功能添加子项,具体代码见示例。

5、添加TVN_SELCHANGED消息处理函数,在这个函数里,用GetFullPath()取得选中项的绝 路径(GetFullPath()具体代码看示例),在ListCtrl中添加文件而非文件夹的图标:
 void CTreeViewDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) {	m_list.DeleteAllItems();	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;	TVITEM item = pNMTreeView->itemNew;	if(item.hItem == m_hRoot)	return;	CString str = GetFullPath(item.hItem); if(str.Right(1) != "\\") str += "\\";	str += "*.*";	CFileFind file;	BOOL bContinue = file.FindFile(str);	while(bContinue)	{	bContinue = file.FindNextFile();	if(!file.IsDirectory() && !file.IsDots())	{	SHFILEINFO info;	CString temp = str;	int index = temp.Find("*.*");	temp.Delete(index,3);	SHGetFileInfo(temp + file.GetFileName(),	0,	&info,sizeof(&info),	SHGFI_DISPLAYNAME | SHGFI_ICON);	int i = m_ImageList.Add(info.hIcon);	m_list.InsertItem(i,info.szDisplayName,i);	}	}	*pResult = 0; } 
    这只是一个简单的例子,你可以在 ListCtrl 中添加鼠标双击消息的处理函数,用 Process 打开该选中的文件; 该示例在VC6,xp下编译通过。
    VC初学者,如有不足之处,请来信指教([email protected])。