|
一個系統圖象列表包括每個文件、文件夾、縮略圖的圖標。根據這個就可以建立一個自定義的資源管理器風格的運用程序。第一步包括從系統獲得大小圖標(假如你都你都需要的話),然后就是將他們分別分配給一個CImageList對象并把它們添加給你的列表控件。最后不要忘了在析構函數里執行Detach()操作,否則系統中所有的圖標將消失,你只能重新啟動你的計算機了(我就碰到過好幾次這樣的教訓)。
首先,在你的列表控件類里添加下面兩個數據成員:
CImageList m_smallImageList; CImageList m_largeImageList; 接著,添加這個函數: void CSystemListCtrl::InitializeSystemImageList() { //建立圖象列表 HIMAGELIST hSystemSmallImageList, hSystemLargeImageList; SHFILEINFO ssfi, lsfi;
//獲得指向系統小圖標的句柄 hSystemSmallImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("C:\\"), 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); //把它分配給小圖象列表 //不要忘了在你的析構函數里執行m_smallImageList.Detach()操作
m_smallImageList.Attach(hSystemSmallImageList);
//對大圖標做同樣的工作 hSystemLargeImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("C:\\"), 0, &lsfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_ICON); m_largeImageList.Attach(hSystemLargeImageList);
//給列表控件設置圖象列表 SetImageList(&m_smallImageList, LVSIL_SMALL); SetImageList(&m_largeImageList, LVSIL_NORMAL); } 同時,你需要下面這個函數來取得你要顯示的每一項的圖標的ID。 int CSystemListCtrl::GetIconIndex(const CString& csFileName) //完整的路徑以及文件名 { SHFILEINFO sfi;
SHGetFileInfo((LPCTSTR)csFileName,0,&sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
return sfi.iIcon; }
|