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);这样显示的是一个文件夹的形式,如何显示一个硬盘的形式呢??高手拿分。

解决方案 »

  1.   

    SHGetFileInfo("C:\\" , "硬盘", FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi) , SHGFI_SMALLICON | SHGFI_SYSICONINDEX);
      

  2.   

    给你一个例子,用来获得全部目录内容以及图标
    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();
    }
    }如果是文件夹,就是文件夹的图标,如果是驱动器,就是驱动器的图标,如果是文件,就是文件图标
      

  3.   

    你能将这个完整的程序发给我吗,谢谢!感激不尽![email protected]