这个例子类似windows的资源管理器
1.首先,建立一个基于对话框的程序,拖入一个Tree控件和List控件,其声明为
- CTreeCtrl m_TreeCtrl;
- CListCtrl m_list;
- //list控件对应的imagelist
- CImageList *m_imagelist;
- //tree控件对应的imagelist
- CImageList *m_listimage;
2.在OnInitDialog函数中加入
- m_imagelist=new CImageList;
- m_imagelist->Create(16,16,ILC_COLOR8|ILC_MASK,2,2);
- m_imagelist->SetBkColor (RGB(255,255,255));
- m_list.SetImageList(m_imagelist,TVSIL_NORMAL);
- m_listimage=new CImageList;
- m_listimage->Create(16,16,ILC_COLOR8|ILC_MASK,2,2);
- m_listimage->SetBkColor (RGB(255,255,255));
- m_listimage->Add(AfxGetApp()->LoadIcon(IDI_ICON_FOLD));
- m_listimage->Add(AfxGetApp()->LoadIcon(IDI_ICON_OPEN));
- m_TreeCtrl.SetImageList(m_listimage,TVSIL_NORMAL);
- //往tree控件中插入子节点
- m_hRoot=m_TreeCtrl.InsertItem(_T("我的电脑"),TVI_ROOT);
- GetLogicalDrives(m_hRoot);
- GetDriveDir(m_hRoot);
- m_TreeCtrl.Expand(m_hRoot,TVE_EXPAND);
这里m_listimage加载的是资源里的ico图标,如果要加入资源里的Bitmap,代码如下
- CBitmap* map1=new CBitmap;
- map1->LoadBitmap(IDB_OPEN);
- m_listimage->Add(map1,RGB(255,255,255));
其中Add的第二个参数是图像的掩膜。
如果要从本地文件中加载
- HBITMAP hBmp;
- CBitmap *pBm;
- if (hBmp = (HBITMAP)::LoadImage(NULL,strSkinPath+_T("CM//DEFAULT.BMP"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_LOADTRANSPARENT))
- {
- pBm = CBitmap::FromHandle(hBmp);
- m_listimage.Add(pBm, RGB(255, 0, 0));
- }
3.获取本地逻辑驱动器,添加
- void CtestdlgDlg::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_TreeCtrl.InsertItem(pDriveStrings,hParent);
- pDriveStrings += szDriveString +1;
- szDriveString = strlen(pDriveStrings);
- }
- }
4.添加TVN_EXPENDED消息处理函数,为其子项添加下一项目录
- void CtestdlgDlg::OnTvnItemexpandedTestTree(NMHDR *pNMHDR, LRESULT *pResult)
- {
- //LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
- NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
- //设置Tree节点收起时的图标
- if (TVE_COLLAPSE == pNMTreeView->action)
- m_TreeCtrl.SetItemImage(
- pNMTreeView->itemNew.hItem,
- 0,
- 0);
- TVITEM item = pNMTreeView->itemNew;
- if(item.hItem == m_hRoot)
- return;
- HTREEITEM hChild = m_TreeCtrl.GetChildItem(item.hItem);
- while(hChild)
- {
- AddSubDir(hChild);
- hChild = m_TreeCtrl.GetNextItem(hChild,TVGN_NEXT);
- }
- *pResult = 0;
- }
5.添加TVN_EXPENDING消息处理函数,设置节点展开时的图标
- void CtestdlgDlg::OnTvnItemexpandingTestTree(NMHDR *pNMHDR, LRESULT *pResult)
- {
- LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
- if (TVE_EXPAND == pNMTreeView->action)
- m_TreeCtrl.SetItemImage(
- pNMTreeView->itemNew.hItem,
- 1,
- 1);
- *pResult = 0;
- }
6.添加TVN_SELCHANGED消息处理函数,在listctrl中添加当前目录下文件的图标
- 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;
这个小程序运行界面如下图