要在treeview中显示系统图标:
建立系统图标列表:
m_ilDrives为CImageList类型,为成员函数
HIMAGELIST hImgList = NULL; //list of icon
SHFILEINFO shFinfo;
hImgList = (HIMAGELIST)SHGetFileInfo(_T("c://"), 0, &shFinfo, sizeof(shFinfo), SHGFI_DISPLAYNAME|SHGFI_ATTRIBUTES|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
if (GetTreeCtrl().GetImageList(TVSIL_NORMAL))
{
m_ilDrives.Detach();
}
if (hImgList == NULL)
{
AfxMessageBox(_T("..."));
}
if ( !m_ilDrives.Attach( hImgList ) )
{
AfxMessageBox(_T("..."));
}
GetTreeCtrl().SetImageList(&m_ilDrives, TVSIL_NORMAL);
先前SetImageList的第二个参数用的是TVSIL_SMALL,结果图标总是显示不出来,额,果然基础知识都没多少直接就开始做项目是有点勉强啊。。。
要显示图标时:
SHFILEINFO shFinfo;
int iIcon = 0;
SHGetFileInfo(pszDrive, 0, &shFinfo, sizeof(shFinfo), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
iIcon = shFinfo.iIcon;
其中:pszDrive是要显示文件的路径名,要是文件夹的话,要记得加"//"
然后在插入树节点的时候使用:
hItem = GetTreeCtrl().InsertItem(pszDrive, iIcon, iIcon);
如果是选中前后显示的图标不一样,比如文件夹的开和关:
int iIcon, iIconSel;
SHGetFileInfo(strTemp, 0, &shFinfo, sizeof(shFinfo), SHGFI_ICON|SHGFI_SMALLICON);
iIcon = shFinfo.iIcon;
SHGetFileInfo(strTemp, 0, &shFinfo, sizeof(shFinfo), SHGFI_ICON|SHGFI_SMALLICON|SHGFI_OPENICON);
iIconSel = shFinfo.iIcon;
hNewItem = GetTreeCtrl().InsertItem((LPCTSTR) &fd.cFileName, iIcon, iIconSel, hItem);