实现系统图标列表类CSystemImageList。
class CSystemImageList:public CObject
{
private:
static CImageList* m_gpLargeImageList; //大图标链表
static CImageList* m_gpSmallImageList; //小图标链表
static int m_gRefCount; //计数器
private:
//初始化静态列表
BOOL InitGlobalList(CImageList* &rpImageList,BOOL bSmall=TRUE);
//关闭静态链表
void DestroyGlobalList(CImageList* & rpImageList);
public:
//得到图标链表
CImageList* GetImageList(BOOL bSmall=TRUE) const;
//得到指定文件的图标
HICON GetIcon(const CString& sName,BOOL bOpen=FALSE,BOOL bSmall=TRUE);
}
//初始化链表
BOOL CSystemImageList::InitGlobalList(CImageList* &rpImageList,BOOL bSmall)
{
BOOL bRet=FALSE;
if(!rpImageList) //如果链表为空
{
rpImageList=new CImageList; //分配内存
if(rpImageList) //如果分配内存成功
{
SHFILEINFO sfi;
DWORD dwFlags=SHGFI_USERFILEATTRIBUTES|SHGFI_SYSICONINDEX;
if(bSmall) //指定图标大小
dwFlags|=SHGFI_SMALLICON;
size_t size=sizeof(SHFILEINOF);
//获取操作系统图标链表
DWORD dw=SHGetFileInfo(NULL,FILE_ATTRIBUTE_NORMAL,&sfi,size,dwFlags);
rpImageList->Attach((HIMAGELIST)dw); //保存链表
rpImageList->SetBkColor(CLR_NONE); //设置背景模式
bRet=TRUE;
}
}
}
//关闭图标链表
void CSystemImageList::DestroyGlobalList(CImageList* &rpImageList)
{
if(rpImageList) //判断图像链表指针是否为空
{
rpImageList->Detach(); //将图标链表对象与图表链表对象的句柄分离
delete rpImageList; //关闭图表链表
rpImageList=NULL;
}
}
//返回链表指针
CImageList* CSystemImageList::GetImageList(BOOL bSmall) const
{
CImageList* pList=NULL;
if(bSmall)
pList=m_gpSmallImageList;
else
pList=m_gpLargeImageList;
return(pList);
}
//返回指定文件的图标句柄
HICON CSystemImageList::GetIcon(const CString& sName,BOOL bOpen,BOOL bSmall)
{
SHFILEINOF sfi;
//指定属性
DWORD dwFlags=SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_LARGEICON;
size_t size=sizeof(SHFILEINFO); //得到缓冲区大小
if(bSmall)
dwFlags|=SHGFI_SMALLICON; //指定小图标属性
if(bOpen)
dwFlages|=SHGFI_OPENICON; //指定打开图标属性
//获取文件属性
SHGetFileInfo(sName,NULL,&sfi,size,SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_LARGEICON);
return(sfi.hIcon); //返回图标句柄
}
class CSystemImageList:public CObject
{
private:
static CImageList* m_gpLargeImageList; //大图标链表
static CImageList* m_gpSmallImageList; //小图标链表
static int m_gRefCount; //计数器
private:
//初始化静态列表
BOOL InitGlobalList(CImageList* &rpImageList,BOOL bSmall=TRUE);
//关闭静态链表
void DestroyGlobalList(CImageList* & rpImageList);
public:
//得到图标链表
CImageList* GetImageList(BOOL bSmall=TRUE) const;
//得到指定文件的图标
HICON GetIcon(const CString& sName,BOOL bOpen=FALSE,BOOL bSmall=TRUE);
}
//初始化链表
BOOL CSystemImageList::InitGlobalList(CImageList* &rpImageList,BOOL bSmall)
{
BOOL bRet=FALSE;
if(!rpImageList) //如果链表为空
{
rpImageList=new CImageList; //分配内存
if(rpImageList) //如果分配内存成功
{
SHFILEINFO sfi;
DWORD dwFlags=SHGFI_USERFILEATTRIBUTES|SHGFI_SYSICONINDEX;
if(bSmall) //指定图标大小
dwFlags|=SHGFI_SMALLICON;
size_t size=sizeof(SHFILEINOF);
//获取操作系统图标链表
DWORD dw=SHGetFileInfo(NULL,FILE_ATTRIBUTE_NORMAL,&sfi,size,dwFlags);
rpImageList->Attach((HIMAGELIST)dw); //保存链表
rpImageList->SetBkColor(CLR_NONE); //设置背景模式
bRet=TRUE;
}
}
}
//关闭图标链表
void CSystemImageList::DestroyGlobalList(CImageList* &rpImageList)
{
if(rpImageList) //判断图像链表指针是否为空
{
rpImageList->Detach(); //将图标链表对象与图表链表对象的句柄分离
delete rpImageList; //关闭图表链表
rpImageList=NULL;
}
}
//返回链表指针
CImageList* CSystemImageList::GetImageList(BOOL bSmall) const
{
CImageList* pList=NULL;
if(bSmall)
pList=m_gpSmallImageList;
else
pList=m_gpLargeImageList;
return(pList);
}
//返回指定文件的图标句柄
HICON CSystemImageList::GetIcon(const CString& sName,BOOL bOpen,BOOL bSmall)
{
SHFILEINOF sfi;
//指定属性
DWORD dwFlags=SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_LARGEICON;
size_t size=sizeof(SHFILEINFO); //得到缓冲区大小
if(bSmall)
dwFlags|=SHGFI_SMALLICON; //指定小图标属性
if(bOpen)
dwFlages|=SHGFI_OPENICON; //指定打开图标属性
//获取文件属性
SHGetFileInfo(sName,NULL,&sfi,size,SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_LARGEICON);
return(sfi.hIcon); //返回图标句柄
}
转载于:https://blog.51cto.com/jazka/164014