资源管理器的学习笔记一

实现系统图标列表类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);     //返回图标句柄
   }
 
 
 

你可能感兴趣的:(职场,vc++,休闲)