1.用途
- 可以获取系统图标列表
- 可以获取任意文件/文件夹/磁盘的图标
- 可以获取任意文件/文件夹/磁盘图标在系统图标列表中的位置
2.头文件
#pragma once #include <winnt.h> class CSHGetFileInfo { public: /// 获取系统图像列表 /// @param[in] bSmallIcon ture则为小图标,false则为大图标 static HIMAGELIST GetSystemImageListHandle(BOOL bSmallIcon = TRUE); /// 获取系统图片列表的文件图片索引 /// @param[in] strFileName 文件名 /// @param[in] bSmallIcon ture则为小图标,false则为大图标 static int GetFileIconIndex(CString strFileName, BOOL bSmallIcon = TRUE); /// 获取系统图片列表的文件夹图片索引 /// @param[in] bSmallIcon static int GetDirIconIndex(BOOL bSmallIcon = TRUE); /// 获取文件的icon的句柄 /// @param[in] diskName 磁盘名 /// @param[in] bSmallIcon ture则为小图标,false则为大图标 static int GetDiskIconIndex(LPCTSTR diskName, BOOL bSmallIcon = TRUE); /// 获取文件的icon的句柄 /// @param[in] strFileName 文件名 /// @param[in] bSmallIcon ture则为小图标,false则为大图标 static HICON GetFileIconHandle(CString strFileName, BOOL bSmallIcon = TRUE); /// 获取文件夹的icon的句柄 /// @param[in] bSmallIcon ture则为小图标,false则为大图标 static HICON GetFolderIconHandle(BOOL bSmallIcon = TRUE); /// 获取磁盘的icon的句柄 /// @param[in] diskName 磁盘名 /// @param[in] bSmallIcon ture则为小图标,false则为大图标 static HICON GetDiskIconHandle(LPCTSTR diskName, BOOL bSmallIcon = TRUE); /// 获取文件类型 /// @param[in] strFileName 文件名 static CString GetFileType(CString strFileName); };
3.源文件
#include "pch.h" #include "CSHGetFileInfo.h" HIMAGELIST CSHGetFileInfo::GetSystemImageListHandle(BOOL bSmallIcon) { HIMAGELIST hSystemImageList; SHFILEINFO ssfi; if (bSmallIcon) { hSystemImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("c:\\"), 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); } else { hSystemImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("c:\\"), 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON); } return hSystemImageList; } int CSHGetFileInfo::GetFileIconIndex(CString strFileName, BOOL bSmallIcon) { SHFILEINFO sfi; if (bSmallIcon) { SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); } else { SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); } return sfi.iIcon; } int CSHGetFileInfo::GetDirIconIndex(BOOL bSmallIcon) { SHFILEINFO sfi; if (bSmallIcon) { SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); } else { SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); } return sfi.iIcon; } int CSHGetFileInfo::GetDiskIconIndex(LPCTSTR diskName, BOOL bSmallIcon) { SHFILEINFO sfi; DWORD attr = ::GetFileAttributes(diskName); if (bSmallIcon) { ::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息 } else { ::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息 } return sfi.iIcon; } HICON CSHGetFileInfo::GetFileIconHandle(CString strFileName, BOOL bSmallIcon) { SHFILEINFO sfi; if (bSmallIcon) { SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); } else { SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); } return sfi.hIcon; } HICON CSHGetFileInfo::GetFolderIconHandle(BOOL bSmallIcon) { SHFILEINFO sfi; if (bSmallIcon) { SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); } else { SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); } return sfi.hIcon; } HICON CSHGetFileInfo::GetDiskIconHandle(LPCTSTR diskName, BOOL bSmallIcon) { SHFILEINFO sfi; DWORD attr = ::GetFileAttributes(diskName); if (bSmallIcon) { ::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息 } else { ::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息 } return sfi.hIcon; } CString CSHGetFileInfo::GetFileType(CString strFileName) { SHFILEINFO sfi; SHGetFileInfo((LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); return sfi.szTypeName; }