SHGetFileInfo 在WINCE下获得系统图标列表

本文介绍了一个在Windows CE环境下解决资源管理器风格文件列表中图标显示问题的方法。通过自定义CImageList并利用SHGetFileInfo获取文件图标,确保了在不同操作系统下的图标显示一致性。

使用list ctrl控件做一个类似于资源管理器的文件显示,同样的代码用SHGetFileInfo 在电脑上显示正常,在WINCE下,第一次调用显示也正常,第二次显示就无法显示出图标来。确认是SHGetFileInfo 的问题,用SetImageList时出错。所以修改了一下,自己实现CImageList列表。用EVC在Wince下测试正常

先设置listctrl的图标索引为m_ImageListFile, 然后在向list ctrl填加文件名时,同时指定图标的序号,就是m_ImageListFile中的序号,m_ImageListFile的图标是在查找索引时,用SHGetFileInfo 获得的

/// 目录图标索引 CImageList m_ImageListFile; // 类成员变量 CListCtrl m_FileList; //控件变量 // 控制显示1000个文件列表 m_ImageListFile.Create(20, 20, ILC_COLOR32, 50, 200 ); m_FileList.SetImageList(&m_ImageListFile, LVSIL_SMALL); // 获得文件图标 int CDlgExplorer::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir) { SHFILEINFO sfi; memset( &sfi, 0, sizeof(sfi) ); DWORD dwType = FILE_ATTRIBUTE_NORMAL; if ( bIsDir ) { // 文件夹类型单独使用 dwType = FILE_ATTRIBUTE_DIRECTORY; } SHGetFileInfo(lpszPath, dwType, &sfi, sizeof(sfi), SHGFI_SMALLICON | SHGFI_ICON | SHGFI_USEFILEATTRIBUTES ); m_ImageListFile.Add(sfi.hIcon); return m_ImageListFile.GetImageCount()-1; } /// 向控制框插入文件名 void CDlgExplorer::InsertFileList( CString csFilePath, BOOL bIsDirectory ) { ASSERT( csFilePath.GetLength()!=0 ); int nIcon = GetIconIndex( csFilePath, bIsDirectory ); // 显示文件名 m_FileList.InsertItem( 0, g_CommonTool.GetFileName(csFilePath), nIcon ); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值