SHFILEINFO sfi;
SHGetFileInfo( "硬盘", FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_USEFILEATTRIBUTES|SHGFI_SYSICONINDEX|SHGFI_TYPENAME);
HTREEITEM hItem = m_CtrlTree->InsertItem("硬盘",sfi.iIcon,sfi.iIcon, TVI_ROOT);这样显示的是一个文件夹的形式,如何显示一个硬盘的形式呢??高手拿分。
SHGetFileInfo( "硬盘", FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_USEFILEATTRIBUTES|SHGFI_SYSICONINDEX|SHGFI_TYPENAME);
HTREEITEM hItem = m_CtrlTree->InsertItem("硬盘",sfi.iIcon,sfi.iIcon, TVI_ROOT);这样显示的是一个文件夹的形式,如何显示一个硬盘的形式呢??高手拿分。
void CMyTree::FillTree()
{ HRESULT hr;
IMalloc *pMalloc = NULL;
ITEMIDLIST *pItemIdList = NULL;
ITEMIDLIST *ttt = NULL;
SHFILEINFO stShFileInfo;
TVITEM stTvItem;
char szPath[MAX_PATH] = {0};
{
memset(&stShFileInfo , 0 , sizeof(stShFileInfo)); hr = SHGetMalloc(&pMalloc);
if(FAILED(hr))
{
goto errorline;
}
/*
m_hSysImageList = (HIMAGELIST)SHGetFileInfo("C:\\" , 0 , &stShFileInfo , sizeof(stShFileInfo) , SHGFI_SMALLICON | SHGFI_SYSICONINDEX);
if(!m_hSysImageList)
{
goto errorline;
}
*/
::SendMessage(this->m_hWnd , TVM_SETIMAGELIST , (LPARAM)TVSIL_NORMAL , (WPARAM)m_hImageListSmall); memset(&stShFileInfo , 0 , sizeof(stShFileInfo)); hr = SHGetSpecialFolderLocation(this->m_hWnd , CSIDL_DESKTOP , &pItemIdList); if(FAILED(hr))
{
goto errorline;
}
hr = SHGetFileInfo((LPCTSTR)pItemIdList , FILE_ATTRIBUTE_NORMAL , &stShFileInfo , sizeof(stShFileInfo) , SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_PIDL ); if(FAILED(hr))
{
goto errorline;
}
this->InsertItem(stShFileInfo.szDisplayName , stShFileInfo.iIcon , stShFileInfo.iIcon);
memset(&stTvItem , 0 , sizeof(stTvItem));/*
LP_TOPLEFT_TREE_ITEMDATA pTemp;
pTemp = new ST_TOPLEFT_TREE_ITEMDATA;
pTemp->cbCount = 2 + pItemIdList->mkid.cb + 2;
pTemp->ItemIdList = new BYTE[2 + pItemIdList->mkid.cb + 2];
memset(pTemp->ItemIdList , 0 , 2 + pItemIdList->mkid.cb + 2);
*/ stTvItem.mask = TVIF_CHILDREN | TVIF_HANDLE;
stTvItem.cChildren = 1;
stTvItem.hItem = this->GetRootItem();
// stTvItem.lParam = (LPARAM)pTemp;
this->SetItem(&stTvItem);
}
{
IShellFolder *pDesktop;
SHGetDesktopFolder(&pDesktop);
IEnumIDList *pEnum;
pDesktop->EnumObjects(m_hWnd , SHCONTF_FOLDERS , &pEnum);
while(1)
{
unsigned long f;
ITEMIDLIST *pil;
pEnum->Next(1 , &pil , &f);
if(!f)
{
break;
}
hr = SHGetFileInfo((LPCTSTR)pil , FILE_ATTRIBUTE_NORMAL , &stShFileInfo , sizeof(stShFileInfo) , SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_PIDL );
HTREEITEM h = this->InsertItem(stShFileInfo.szDisplayName , stShFileInfo.iIcon , stShFileInfo.iIcon , this->GetRootItem());
LP_TOPLEFT_TREE_ITEMDATA pTemp;
pTemp = new ST_TOPLEFT_TREE_ITEMDATA;
pTemp->cbCount = pil->mkid.cb + 2;
pTemp->ItemIdList = new BYTE[pil->mkid.cb + 2];
memset(pTemp->ItemIdList , 0 , pil->mkid.cb + 2);
memcpy(pTemp->ItemIdList , pil , pil->mkid.cb);
memset(&stTvItem , 0 , sizeof(stTvItem));
stTvItem.mask = TVIF_HANDLE | TVIF_PARAM;
stTvItem.hItem = h;
stTvItem.lParam = (LPARAM)pTemp;
this->SetItem(&stTvItem);
IShellFolder *pShellSub = NULL;
IEnumIDList *pEnumIDList = NULL;
pDesktop->BindToObject(pil , 0 , IID_IShellFolder ,(void**)& pShellSub);
if(pShellSub)
{
pShellSub->EnumObjects(m_hWnd , SHCONTF_FOLDERS , &pEnumIDList);
while(1)
{
unsigned long ff;
ITEMIDLIST *pidSub;
pEnumIDList->Next(1 , &pidSub , &ff);
if(!ff)
{
break;
}
BYTE *b = new BYTE[pil->mkid.cb + pidSub->mkid.cb + 2];
memset(b , 0 , pil->mkid.cb + pidSub->mkid.cb + 2);
memcpy(b , pil , pil->mkid.cb);
memcpy(&b[pil->mkid.cb] , pidSub , pidSub->mkid.cb); hr = SHGetFileInfo((LPCTSTR)b , FILE_ATTRIBUTE_NORMAL , &stShFileInfo , sizeof(stShFileInfo) , SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_PIDL|SHGFI_TYPENAME );
char szBuf[MAX_PATH] = {0};
SHGetPathFromIDList((LPITEMIDLIST)b , szBuf);
if(strlen(szBuf))
{
HTREEITEM hSub = this->InsertItem(stShFileInfo.szDisplayName , stShFileInfo.iIcon , stShFileInfo.iIcon , h);
LP_TOPLEFT_TREE_ITEMDATA pTemp;
pTemp = new ST_TOPLEFT_TREE_ITEMDATA;
pTemp->cbCount = pil->mkid.cb + pidSub->mkid.cb + 2;
pTemp->ItemIdList = new BYTE[pil->mkid.cb + pidSub->mkid.cb + 2];
memset(pTemp->ItemIdList , 0 , pil->mkid.cb + pidSub->mkid.cb + 2);
memcpy(pTemp->ItemIdList , b , pil->mkid.cb + pidSub->mkid.cb);
memset(&stTvItem , 0 , sizeof(stTvItem));
stTvItem.mask = TVIF_HANDLE |TVIF_PARAM;
stTvItem.hItem = hSub;
stTvItem.lParam = (LPARAM)pTemp;
this->SetItem(&stTvItem);
}
delete[]b;
pMalloc->Free(pidSub);
}
} pMalloc->Free(pil);
}
} this->ExpandToRightDir(this->GetRootItem() , 0);
errorline:
if(pItemIdList)
{
pMalloc->Free(pItemIdList);
}
if(pMalloc)
{
pMalloc->Release();
}
}如果是文件夹,就是文件夹的图标,如果是驱动器,就是驱动器的图标,如果是文件,就是文件图标