用MFC做一个程序,用CListCtrl控件,显示文件夹及文件,包括图标ICON,文件名,大小,日期等信息。
我调用SHGetFileInfo函数,获取图标。
形式如下:
::SHGetFileInfo(WFD.cFileName,FILE_ATTRIBUTE_NORMAL,&shfi,sizeof(shfi),SHGFI_ICON |SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
CListCtrl关联的CImageList是这么写的
CImageList m_ImgList;
m_ImgList.Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR24,50,50);然后把句柄加入
int i = m_ImageList.add(shfi.hIcon);
但是调用的结果shfi.hICon,也就是获取的句柄都是无效的地址,看了很多例子,基本都是这么写的,但是我这获取的怎么都是错的呢。
有的说是要初始化下com,但是我初始化了后还是不行。上面获取的hIcon是错的,跟踪程序发现,hIcon,有值,而且每次都不一样,但是都是unused,看内存里面也都是????,应该是没有赋值。请问高手,这个可能是什么问题,实在不行,告诉小弟怎么实现读取某个文件夹下的所有文件的图标也好。

解决方案 »

  1.   

    用DDX进行关联:在DoDataExchange(CDataExchange* pDX)
    //将控件与变量关联起来
    DDX_Control(pDX, IDC_BTNFOLDER, m_btnFolder);
      

  2.   

    我也遇到类似的问题,第一次打开SHFILEINFO shFi.hIcon有值,关闭子DIALOG 后重新打开DoModal()后,SHGetFileinfo获得的shFi.hIcon=0,文件图标无法显示,不知道是什么问题,希望高手解答!
      

  3.   

    问题解决了,把CImageList m_ImageList;设置为全局变量,然后把你的CListCtrl控件属性-->更多样式-->共享图像列表  勾上,就ok了!因为CListCtrl在销毁的时候会同时销毁从系统获得的图像列表,设置“共享图像列表”后再CListCtrl时就不会销毁系统图像列表了,所以就能正常显示文件图标了
      

  4.   

    我的问题好像不是这个,我定义的CListCtrl和CimageList对象都是成员变量,貌似是在基类对象的生存期都是存在的,不存在销毁的问题。不过现在是通过获取系统图标链表来获得图标的,没时间弄这个了,只有曲线救国了,谢谢各位大大,结贴了