CtreeCtrl的使用

这个例子类似windows的资源管理器 

1.首先,建立一个基于对话框的程序,拖入一个Tree控件和List控件,其声明为

[cpp]  view plain  copy
  1. CTreeCtrl m_TreeCtrl;  
  2. CListCtrl m_list;  
  3. //list控件对应的imagelist  
  4. CImageList *m_imagelist;  
  5. //tree控件对应的imagelist  
  6. CImageList *m_listimage;  

2.在OnInitDialog函数中加入

[cpp]  view plain  copy
  1. m_imagelist=new CImageList;   
  2. m_imagelist->Create(16,16,ILC_COLOR8|ILC_MASK,2,2);  
  3. m_imagelist->SetBkColor (RGB(255,255,255));  
  4. m_list.SetImageList(m_imagelist,TVSIL_NORMAL);  
  5.   
  6. m_listimage=new CImageList;  
  7. m_listimage->Create(16,16,ILC_COLOR8|ILC_MASK,2,2);  
  8. m_listimage->SetBkColor (RGB(255,255,255));  
  9. m_listimage->Add(AfxGetApp()->LoadIcon(IDI_ICON_FOLD));  
  10. m_listimage->Add(AfxGetApp()->LoadIcon(IDI_ICON_OPEN));  
  11. m_TreeCtrl.SetImageList(m_listimage,TVSIL_NORMAL);  
  12. //往tree控件中插入子节点  
  13. m_hRoot=m_TreeCtrl.InsertItem(_T("我的电脑"),TVI_ROOT);  
  14. GetLogicalDrives(m_hRoot);  
  15. GetDriveDir(m_hRoot);  
  16. m_TreeCtrl.Expand(m_hRoot,TVE_EXPAND);  

这里m_listimage加载的是资源里的ico图标,如果要加入资源里的Bitmap,代码如下

[cpp]  view plain  copy
  1. CBitmap* map1=new CBitmap;  
  2. map1->LoadBitmap(IDB_OPEN);  
  3. m_listimage->Add(map1,RGB(255,255,255));  

其中Add的第二个参数是图像的掩膜。

如果要从本地文件中加载

[cpp]  view plain  copy
  1. HBITMAP hBmp;  
  2. CBitmap *pBm;  
  3. if (hBmp = (HBITMAP)::LoadImage(NULL,strSkinPath+_T("CM//DEFAULT.BMP"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_LOADTRANSPARENT))  
  4. {  
  5.     pBm = CBitmap::FromHandle(hBmp);  
  6.     m_listimage.Add(pBm, RGB(255, 0, 0));  
  7. }  

3.获取本地逻辑驱动器,添加

[cpp]  view plain  copy
  1. void CtestdlgDlg::GetLogicalDrives(HTREEITEM hParent)  
  2. {  
  3.     size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL);  
  4.     char *pDriveStrings = new char[szAllDriveStrings+sizeof(_T(""))];  
  5.     GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);  
  6.     size_t szDriveString = strlen(pDriveStrings);  
  7.     while(szDriveString > 0)  
  8.     {  
  9.         m_TreeCtrl.InsertItem(pDriveStrings,hParent);  
  10.         pDriveStrings += szDriveString +1;  
  11.         szDriveString = strlen(pDriveStrings);  
  12.     }  
  13. }  

4.添加TVN_EXPENDED消息处理函数,为其子项添加下一项目录

[cpp]  view plain  copy
  1. void CtestdlgDlg::OnTvnItemexpandedTestTree(NMHDR *pNMHDR, LRESULT *pResult)  
  2. {  
  3.     //LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);  
  4.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;  
  5.     //设置Tree节点收起时的图标  
  6.     if   (TVE_COLLAPSE   ==   pNMTreeView->action)     
  7.         m_TreeCtrl.SetItemImage(     
  8.         pNMTreeView->itemNew.hItem,     
  9.         0,     
  10.         0);     
  11.   
  12.     TVITEM item = pNMTreeView->itemNew;  
  13.     if(item.hItem == m_hRoot)  
  14.         return;  
  15.     HTREEITEM hChild = m_TreeCtrl.GetChildItem(item.hItem);  
  16.     while(hChild)  
  17.     {  
  18.         AddSubDir(hChild);  
  19.         hChild = m_TreeCtrl.GetNextItem(hChild,TVGN_NEXT);  
  20.     }  
  21.     *pResult = 0;  
  22. }  

5.添加TVN_EXPENDING消息处理函数,设置节点展开时的图标

[cpp]  view plain  copy
  1. void CtestdlgDlg::OnTvnItemexpandingTestTree(NMHDR *pNMHDR, LRESULT *pResult)  
  2. {  
  3.     LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);  
  4.     if   (TVE_EXPAND   ==   pNMTreeView->action)     
  5.         m_TreeCtrl.SetItemImage(     
  6.         pNMTreeView->itemNew.hItem,     
  7.         1,     
  8.         1);   
  9.     *pResult = 0;  
  10. }  

6.添加TVN_SELCHANGED消息处理函数,在listctrl中添加当前目录下文件的图标

[cpp]  view plain  copy
  1. m_list.DeleteAllItems();  
  2.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;  
  3.     TVITEM item = pNMTreeView->itemNew;  
  4.     if(item.hItem == m_hRoot)  
  5.         return;  
  6.     CString str = GetFullPath(item.hItem);  
  7.     if(str.Right(1) != "//")  
  8.         str += "//";  
  9.     str += "*.*";  
  10.     CFileFind file;  
  11.     BOOL bContinue = file.FindFile(str);  
  12.     while(bContinue)  
  13.     {  
  14.         bContinue = file.FindNextFile();  
  15.         if(!file.IsDirectory() && !file.IsDots())  
  16.         {  
  17.             SHFILEINFO info;  
  18.             CString temp = str;  
  19.             int index = temp.Find("*.*");  
  20.             temp.Delete(index,3);  
  21.             SHGetFileInfo(temp+file.GetFileName(),  
  22.                 0,  
  23.                 &info,sizeof(&info),  
  24.                 SHGFI_DISPLAYNAME | SHGFI_ICON);  
  25.             int i = m_imagelist->Add(info.hIcon);  
  26.             m_list.InsertItem(i,info.szDisplayName,i);  
  27.         }  
  28.     }  
  29.     *pResult = 0;  

这个小程序运行界面如下图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值